diff options
| author | Anand Avati <avati@gluster.com> | 2010-02-22 08:59:10 +0000 | 
|---|---|---|
| committer | Anand V. Avati <avati@dev.gluster.com> | 2010-02-22 06:45:32 -0800 | 
| commit | 9dbae0c80569689533c92a29871e3fa6dbbae1b9 (patch) | |
| tree | f9037310ab6005eec07965ba72fe8f1e954c115a /xlators/cluster/dht/src/dht-helper.c | |
| parent | 96ed73c1556da79e0a58cf1c051471a9b322b05b (diff) | |
dht: unlink stale linkfiles in rmdir to prevent ENOTEMPTY
Thanks to He Xaobing <allreol@gmail.com>, this patch is inspired by
http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=188#c2
Signed-off-by: Anand V. Avati <avati@blackhole.gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 188 ([ glusterfs 2.0.6rc2 ] - "Directory not empty" on rm -rf)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=188
Diffstat (limited to 'xlators/cluster/dht/src/dht-helper.c')
| -rw-r--r-- | xlators/cluster/dht/src/dht-helper.c | 46 | 
1 files changed, 43 insertions, 3 deletions
diff --git a/xlators/cluster/dht/src/dht-helper.c b/xlators/cluster/dht/src/dht-helper.c index 9816c1784cd..5a89ba58489 100644 --- a/xlators/cluster/dht/src/dht-helper.c +++ b/xlators/cluster/dht/src/dht-helper.c @@ -139,7 +139,7 @@ dht_local_wipe (xlator_t *this, dht_local_t *local)  		fd_unref (local->fd);  		local->fd = NULL;  	} -	 +  	if (local->xattr_req)  		dict_unref (local->xattr_req); @@ -184,6 +184,7 @@ basestr (const char *str)          return basestr;  } +  xlator_t *  dht_first_up_subvol (xlator_t *this)  { @@ -192,7 +193,7 @@ dht_first_up_subvol (xlator_t *this)  	int         i = 0;  	conf = this->private; -	 +  	LOCK (&conf->subvolume_lock);  	{  		for (i = 0; i < conf->subvolume_cnt; i++) { @@ -203,10 +204,11 @@ dht_first_up_subvol (xlator_t *this)  		}  	}  	UNLOCK (&conf->subvolume_lock); -	 +  	return child;  } +  xlator_t *  dht_subvol_get_hashed (xlator_t *this, loc_t *loc)  { @@ -343,3 +345,41 @@ dht_stat_merge (xlator_t *this, struct stat *to,  	return 0;  } + + +int +dht_build_child_loc (xlator_t *this, loc_t *child, loc_t *parent, char *name) +{ +        if (!child) { +                goto err; +        } + +        if (strcmp (parent->path, "/") == 0) +                asprintf ((char **)&child->path, "/%s", name); +        else +                asprintf ((char **)&child->path, "%s/%s", parent->path, name); + +        if (!child->path) { +                gf_log (this->name, GF_LOG_ERROR, +                        "Out of memory"); +                goto err; +        } + +        child->name = strrchr (child->path, '/'); +        if (child->name) +                child->name++; + +        child->parent = inode_ref (parent->inode); +        child->inode = inode_new (parent->inode->table); + +        if (!child->inode) { +                gf_log (this->name, GF_LOG_ERROR, +                        "Out of memory"); +                goto err; +        } + +        return 0; +err: +        loc_wipe (child); +        return -1; +}  | 
