diff options
Diffstat (limited to 'xlators/storage')
-rw-r--r-- | xlators/storage/bd_map/src/bd_map.c | 96 | ||||
-rw-r--r-- | xlators/storage/bd_map/src/bd_map_help.c | 20 | ||||
-rw-r--r-- | xlators/storage/bd_map/src/bd_map_help.h | 1 |
3 files changed, 117 insertions, 0 deletions
diff --git a/xlators/storage/bd_map/src/bd_map.c b/xlators/storage/bd_map/src/bd_map.c index 9d3223cecbc..923ff9b6db2 100644 --- a/xlators/storage/bd_map/src/bd_map.c +++ b/xlators/storage/bd_map/src/bd_map.c @@ -62,6 +62,101 @@ out: } int32_t +bd_unlink (call_frame_t *frame, xlator_t *this, + loc_t *loc, int xflag, dict_t *xdata) +{ + int32_t op_ret = -1; + int32_t op_errno = ENOENT; + struct iatt preparent = {0, }; + struct iatt postparent = {0, }; + bd_priv_t *priv = NULL; + vg_t vg = NULL; + lv_t lv = NULL; + bd_entry_t *lventry = NULL; + bd_entry_t *p_entry = NULL; + char *vg_name = NULL; + char *volume = NULL; + + VALIDATE_OR_GOTO (frame, out); + VALIDATE_OR_GOTO (this, out); + VALIDATE_OR_GOTO (this->private, out); + VALIDATE_OR_GOTO (loc, out); + + priv = this->private; + VALIDATE_OR_GOTO (priv, out); + + volume = vg_name = gf_strdup (loc->path); + if (!volume) + goto out; + volume = strrchr (volume, '/'); + if (!volume) { + op_errno = EINVAL; + goto out; + } + /* creating under non VG directory not permited */ + if (vg_name == volume) { + op_errno = EOPNOTSUPP; + goto out; + } + *volume = '\0'; + + BD_ENTRY (priv, p_entry, vg_name); + BD_ENTRY (priv, lventry, loc->path); + if (!p_entry || !lventry) + goto out; + + memcpy (&preparent, p_entry->attr, sizeof(preparent)); + + BD_WR_LOCK (&priv->lock); + vg = lvm_vg_open (priv->handle, p_entry->name, "w", 0); + if (!vg) { + op_errno = ENOENT; + BD_UNLOCK (&priv->lock); + goto out; + } + + lv = lvm_lv_from_name (vg, lventry->name); + if (!lv) { + lvm_vg_close (vg); + op_errno = ENOENT; + BD_UNLOCK (&priv->lock); + goto out; + } + op_ret = lvm_vg_remove_lv (lv); + if (op_ret < 0) { + op_errno = errno; + lvm_vg_close (vg); + BD_UNLOCK (&priv->lock); + goto out; + } + lvm_vg_close (vg); + op_ret = bd_entry_rm (loc->path); + if (op_ret < 0) { + op_errno = EIO; + BD_UNLOCK (&priv->lock); + goto out; + } + BD_ENTRY_UPDATE_MTIME (p_entry); + memcpy (&postparent, p_entry->attr, sizeof(postparent)); + op_ret = 0; + op_errno = 0; + + BD_UNLOCK (&priv->lock); + +out: + if (p_entry) + BD_PUT_ENTRY (priv, p_entry); + if (lventry) + BD_PUT_ENTRY (priv, lventry); + if (vg_name) + GF_FREE (vg_name); + STACK_UNWIND_STRICT (unlink, frame, op_ret, op_errno, + &preparent, &postparent, NULL); + + return 0; +} + +int32_t bd_open (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags, fd_t *fd, dict_t *xdata) { @@ -1640,6 +1735,7 @@ struct xlator_fops fops = { .create = bd_create, .setattr = bd_setattr, .fsetattr = bd_fsetattr, + .unlink = bd_unlink, }; struct xlator_cbks cbks = { diff --git a/xlators/storage/bd_map/src/bd_map_help.c b/xlators/storage/bd_map/src/bd_map_help.c index 3576d705692..0613aa383ff 100644 --- a/xlators/storage/bd_map/src/bd_map_help.c +++ b/xlators/storage/bd_map/src/bd_map_help.c @@ -352,6 +352,26 @@ out: return pentry; } +int bd_entry_rm (const char *path) +{ + bd_entry_t *bdentry = NULL; + int ret = -1; + + bdentry = bd_entry_get (path); + if (!bdentry) + goto out; + + list_del_init (&bdentry->sibling); + list_del_init (&bdentry->child); + GF_FREE (bdentry); + + ret = 0; +out: + return ret; +} + + + /* Called with priv->bd_lock held */ void bd_entry_put (bd_entry_t *entry) { diff --git a/xlators/storage/bd_map/src/bd_map_help.h b/xlators/storage/bd_map/src/bd_map_help.h index 46862f32847..9fafa2d137e 100644 --- a/xlators/storage/bd_map/src/bd_map_help.h +++ b/xlators/storage/bd_map/src/bd_map_help.h @@ -64,5 +64,6 @@ void bd_entry_put (bd_entry_t *entry); int bd_build_lv_list (bd_priv_t *priv, char *vg); int bd_entry_cleanup (void); void bd_update_time (bd_entry_t *entry, int type); +int bd_entry_rm (const char *path); #endif |