diff options
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.h | 3 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-helper.c | 154 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-inode-read.c | 58 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-inode-write.c | 61 | 
4 files changed, 148 insertions, 128 deletions
diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index 8c3449f0b3b..5ccd66799ae 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -781,4 +781,7 @@ dht_priv_dump (xlator_t *this);  int32_t  dht_inodectx_dump (xlator_t *this, inode_t *inode); +int +dht_inode_ctx_get1 (xlator_t *this, inode_t *inode, xlator_t **subvol); +  #endif/* _DHT_H */ diff --git a/xlators/cluster/dht/src/dht-helper.c b/xlators/cluster/dht/src/dht-helper.c index 1cf343d24ac..311a481126d 100644 --- a/xlators/cluster/dht/src/dht-helper.c +++ b/xlators/cluster/dht/src/dht-helper.c @@ -18,6 +18,28 @@  #include "xlator.h"  #include "dht-common.h" +static inline int +dht_inode_ctx_set1 (xlator_t *this, inode_t *inode, xlator_t *subvol) +{ +        uint64_t tmp_subvol = 0; + +        tmp_subvol = (long)subvol; +        return inode_ctx_set1 (inode, this, &tmp_subvol); +} + +int +dht_inode_ctx_get1 (xlator_t *this, inode_t *inode, xlator_t **subvol) +{ +        int ret = -1; +        uint64_t tmp_subvol = 0; + +        ret =  inode_ctx_get1 (inode, this, &tmp_subvol); +        if (tmp_subvol && subvol) +                *subvol = (xlator_t *)tmp_subvol; + +        return ret; +} +  int  dht_frame_return (call_frame_t *frame) @@ -340,20 +362,6 @@ out:          return local;  } - -char * -basestr (const char *str) -{ -        char *basestr = NULL; - -        basestr = strrchr (str, '/'); -        if (basestr) -                basestr ++; - -        return basestr; -} - -  xlator_t *  dht_first_up_subvol (xlator_t *this)  { @@ -727,6 +735,10 @@ dht_migration_complete_check_task (void *data)          loc_t         tmp_loc  = {0,};          char         *path     = NULL;          dht_conf_t   *conf     = NULL; +        inode_t      *inode    = NULL; +        fd_t         *iter_fd  = NULL; +        uint64_t      tmp_subvol = 0; +        int           open_failed = 0;          this  = THIS;          frame = data; @@ -738,6 +750,8 @@ dht_migration_complete_check_task (void *data)          if (!local->loc.inode && !local->fd)                  goto out; +        inode = (!local->fd) ? local->loc.inode : local->fd->inode; +          /* getxattr on cached_subvol for 'linkto' value. Do path based getxattr           * as root:root. If a fd is already open, access check wont be done*/ @@ -800,10 +814,7 @@ dht_migration_complete_check_task (void *data)          /* update inode ctx (the layout) */          dht_layout_unref (this, local->layout); -        if (!local->loc.inode) -                ret = dht_layout_preset (this, dst_node, local->fd->inode); -        else -                ret = dht_layout_preset (this, dst_node, local->loc.inode); +        ret = dht_layout_preset (this, dst_node, inode);          if (ret != 0) {                  gf_log (this->name, GF_LOG_DEBUG,                          "%s: could not set preset layout for subvol %s", @@ -821,10 +832,7 @@ dht_migration_complete_check_task (void *data)                  goto out;          } -        if (!local->loc.inode) -                ret = dht_layout_set (this, local->fd->inode, layout); -        else -                ret = dht_layout_set (this, local->loc.inode, layout); +        ret = dht_layout_set (this, inode, layout);          if (ret) {                  gf_log (this->name, GF_LOG_ERROR,                          "%s: failed to set the new layout", @@ -835,41 +843,46 @@ dht_migration_complete_check_task (void *data)          local->cached_subvol = dst_node;          ret = 0; -        if (!local->fd) +        /* once we detect the migration complete, the inode-ctx2 is no more +           required.. delete the ctx and also, it means, open() already +           done on all the fd of inode */ +        ret = inode_ctx_reset1 (inode, this, &tmp_subvol); +        if (tmp_subvol)                  goto out; -        /* once we detect the migration complete, the fd-ctx is no more -           required.. delete the ctx */ -        ret = fd_ctx_del (local->fd, this, NULL); -        if (!ret) + +        if (list_empty (&inode->fd_list))                  goto out;          /* perform open as root:root. There is window between linkfile           * creation(root:root) and setattr with the correct uid/gid           */          SYNCTASK_SETID(0, 0); -        /* if 'local->fd' (ie, fd based operation), send a 'open()' on -           destination if not already done */ -        if (local->loc.inode) { -                ret = syncop_open (dst_node, &local->loc, -                                   local->fd->flags, local->fd); -        } else { -                tmp_loc.inode = local->fd->inode; -                inode_path (local->fd->inode, NULL, &path); -                if (path) -                        tmp_loc.path = path; -                ret = syncop_open (dst_node, &tmp_loc, -                                   local->fd->flags, local->fd); -                GF_FREE (path); +        /* perform 'open()' on all the fd's present on the inode */ +        tmp_loc.inode = inode; +        inode_path (inode, NULL, &path); +        if (path) +                tmp_loc.path = path; +        list_for_each_entry (iter_fd, &inode->fd_list, inode_list) { +                if (fd_is_anonymous (iter_fd)) +                        continue; + +                ret = syncop_open (dst_node, &tmp_loc, +                                   iter_fd->flags, iter_fd); +                if (ret == -1) { +                        gf_log (this->name, GF_LOG_ERROR, "failed to open " +                                "the fd (%p, flags=0%o) on file %s @ %s", +                                iter_fd, iter_fd->flags, path, dst_node->name); +                        open_failed = 1; +                }          } +        GF_FREE (path); +          SYNCTASK_SETID (frame->root->uid, frame->root->gid); -        if (ret == -1) { -                gf_log (this->name, GF_LOG_ERROR, -                        "%s: failed to send open() on target file at %s", -                        local->loc.path, dst_node->name); +        if (open_failed) { +                ret = -1;                  goto out;          } -          ret = 0;  out: @@ -914,6 +927,9 @@ dht_rebalance_inprogress_task (void *data)          struct iatt   stbuf    = {0,};          loc_t         tmp_loc  = {0,};          dht_conf_t   *conf     = NULL; +        inode_t      *inode    = NULL; +        fd_t         *iter_fd  = NULL; +        int           open_failed = 0;          this  = THIS;          frame = data; @@ -925,6 +941,8 @@ dht_rebalance_inprogress_task (void *data)          if (!local->loc.inode && !local->fd)                  goto out; +        inode = (!local->fd) ? local->loc.inode : local->fd->inode; +          /* getxattr on cached_subvol for 'linkto' value. Do path based getxattr           * as root:root. If a fd is already open, access check wont be done*/          if (local->loc.inode) { @@ -976,35 +994,47 @@ dht_rebalance_inprogress_task (void *data)          }          ret = 0; + +        if (list_empty (&inode->fd_list)) +                goto done; +          /* perform open as root:root. There is window between linkfile           * creation(root:root) and setattr with the correct uid/gid           */          SYNCTASK_SETID (0, 0); -        if (local->loc.inode) { -                ret = syncop_open (dst_node, &local->loc, -                                   local->fd->flags, local->fd); -        } else { -                tmp_loc.inode = local->fd->inode; -                inode_path (local->fd->inode, NULL, &path); -                if (path) -                        tmp_loc.path = path; + +        tmp_loc.inode = inode; +        inode_path (inode, NULL, &path); +        if (path) +                tmp_loc.path = path; + +        list_for_each_entry (iter_fd, &inode->fd_list, inode_list) { +                if (fd_is_anonymous (iter_fd)) +                        continue; +                  ret = syncop_open (dst_node, &tmp_loc, -                                   local->fd->flags, local->fd); -                GF_FREE (path); +                                   iter_fd->flags, iter_fd); +                if (ret == -1) { +                        gf_log (this->name, GF_LOG_ERROR, "failed to send open " +                                "the fd (%p, flags=0%o) on file %s @ %s", +                                iter_fd, iter_fd->flags, path, dst_node->name); +                        open_failed = 1; +                }          } +        GF_FREE (path); -        if (ret == -1) { -                gf_log (this->name, GF_LOG_ERROR, -                        "%s: failed to send open() on target file at %s", -                        local->loc.path, dst_node->name); +        SYNCTASK_SETID (frame->root->uid, frame->root->gid); + +        if (open_failed) { +                ret = -1;                  goto out;          } -        SYNCTASK_SETID (frame->root->uid, frame->root->gid); -        ret = fd_ctx_set (local->fd, this, (uint64_t)(long)dst_node); +done: +        ret = dht_inode_ctx_set1 (this, inode, dst_node);          if (ret) {                  gf_log (this->name, GF_LOG_ERROR, -                        "%s: failed to set fd-ctx target file at %s", +                        "%s: failed to set inode-ctx target file at %s",                          local->loc.path, dst_node->name);                  goto out;          } diff --git a/xlators/cluster/dht/src/dht-inode-read.c b/xlators/cluster/dht/src/dht-inode-read.c index 10f59ab26a1..ece84151adb 100644 --- a/xlators/cluster/dht/src/dht-inode-read.c +++ b/xlators/cluster/dht/src/dht-inode-read.c @@ -130,10 +130,11 @@ int  dht_file_attr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                     int op_ret, int op_errno, struct iatt *stbuf, dict_t *xdata)  { -        uint64_t      tmp_subvol = 0; +        xlator_t     *subvol = 0;          dht_local_t  *local = NULL;          call_frame_t *prev = NULL;          int           ret = -1; +        inode_t      *inode = NULL;          GF_VALIDATE_OR_GOTO ("dht", frame, err);          GF_VALIDATE_OR_GOTO ("dht", this, out); @@ -157,19 +158,20 @@ dht_file_attr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          local->op_errno = op_errno;          /* Check if the rebalance phase2 is true */          if ((op_ret == -1) || IS_DHT_MIGRATION_PHASE2 (stbuf)) { -                if (local->fd) -                        ret = fd_ctx_get (local->fd, this, &tmp_subvol); -                if (ret) { +                inode = (local->fd) ? local->fd->inode : local->loc.inode; +                ret = dht_inode_ctx_get1 (this, inode, &subvol); +                if (!subvol) {                          /* Phase 2 of migration */                          local->rebalance.target_op_fn = dht_attr2;                          ret = dht_rebalance_complete_check (this, frame); +                        if (!ret) +                                return 0;                  } else {                          /* value is already set in fd_ctx, that means no need                             to check for whether its complete or not. */                          dht_attr2 (this, frame, 0); -                } -                if (!ret)                          return 0; +                }          }  out: @@ -382,6 +384,8 @@ dht_readv_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  {          dht_local_t *local      = NULL;          int          ret        = 0; +        inode_t     *inode      = NULL; +        xlator_t    *subvol = 0;          local = frame->local;          if (!local) { @@ -400,17 +404,18 @@ dht_readv_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          local->op_errno = op_errno;          if ((op_ret == -1) || IS_DHT_MIGRATION_PHASE2 (stbuf)) {                  /* File would be migrated to other node */ -                ret = fd_ctx_get (local->fd, this, NULL); -                if (ret) { +                ret = dht_inode_ctx_get1 (this, inode, &subvol); +                if (!subvol) {                          local->rebalance.target_op_fn = dht_readv2;                          ret = dht_rebalance_complete_check (this, frame); +                        if (!ret) +                                return 0;                  } else {                          /* value is already set in fd_ctx, that means no need                             to check for whether its complete or not. */                          dht_readv2 (this, frame, 0); -                } -                if (!ret)                          return 0; +                }          }  out: @@ -616,8 +621,9 @@ int  dht_flush_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                 int op_ret, int op_errno, dict_t *xdata)  { -        dht_local_t  *local = NULL; -        int           ret = -1; +        dht_local_t  *local  = NULL; +        inode_t      *inode  = NULL; +        xlator_t     *subvol = 0;          local = frame->local; @@ -627,8 +633,8 @@ dht_flush_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  goto out;          /* If context is set, then send flush() it to the destination */ -        ret = fd_ctx_get (local->fd, this, NULL); -        if (!ret) { +        dht_inode_ctx_get1 (this, inode, &subvol); +        if (subvol) {                  dht_flush2 (this, frame, 0);                  return 0;          } @@ -644,14 +650,10 @@ dht_flush2 (xlator_t *this, call_frame_t *frame, int op_ret)  {          dht_local_t  *local  = NULL;          xlator_t     *subvol = NULL; -        uint64_t      tmp_subvol = 0; -        int           ret = -1;          local = frame->local; -        ret = fd_ctx_get (local->fd, this, &tmp_subvol); -        if (!ret) -                subvol = (xlator_t *)(long)tmp_subvol; +        dht_inode_ctx_get1 (this, local->fd->inode, &subvol);          if (!subvol)                  subvol = local->cached_subvol; @@ -713,6 +715,8 @@ dht_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,          dht_local_t  *local = NULL;          call_frame_t *prev = NULL;          int           ret = -1; +        inode_t      *inode = NULL; +        xlator_t     *subvol = 0;          local = frame->local;          prev = cookie; @@ -734,8 +738,8 @@ dht_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,          }          local->op_errno = op_errno; -        ret = fd_ctx_get (local->fd, this, NULL); -        if (ret) { +        dht_inode_ctx_get1 (this, inode, &subvol); +        if (!subvol) {                  local->rebalance.target_op_fn = dht_fsync2;                  /* Check if the rebalance phase1 is true */ @@ -750,11 +754,12 @@ dht_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,                  if (IS_DHT_MIGRATION_PHASE2 (postbuf)) {                          ret = dht_rebalance_complete_check (this, frame);                  } +                if (!ret) +                        return 0;          } else {                  dht_fsync2 (this, frame, 0); -        } -        if (!ret)                  return 0; +        }  out:          DHT_STRIP_PHASE1_FLAGS (postbuf); @@ -770,15 +775,10 @@ dht_fsync2 (xlator_t *this, call_frame_t *frame, int op_ret)  {          dht_local_t  *local  = NULL;          xlator_t     *subvol = NULL; -        uint64_t      tmp_subvol = 0; -        int           ret = -1;          local = frame->local; -        ret = fd_ctx_get (local->fd, this, &tmp_subvol); -        if (!ret) -                subvol = (xlator_t *)(long)tmp_subvol; - +        dht_inode_ctx_get1 (this, local->fd->inode, &subvol);          if (!subvol)                  subvol = local->cached_subvol; diff --git a/xlators/cluster/dht/src/dht-inode-write.c b/xlators/cluster/dht/src/dht-inode-write.c index 26db8a533c1..4b3f3a0496b 100644 --- a/xlators/cluster/dht/src/dht-inode-write.c +++ b/xlators/cluster/dht/src/dht-inode-write.c @@ -30,6 +30,7 @@ dht_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  {          dht_local_t *local = NULL;          int          ret   = -1; +        xlator_t    *subvol = NULL;          if (op_ret == -1 && (op_errno != ENOENT)) {                  goto out; @@ -66,8 +67,8 @@ dht_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  dht_iatt_merge (this, &local->stbuf, postbuf, NULL);                  dht_iatt_merge (this, &local->prebuf, prebuf, NULL); -                ret = fd_ctx_get (local->fd, this, NULL); -                if (!ret) { +                ret = dht_inode_ctx_get1 (this, local->fd->inode, &subvol); +                if (subvol) {                          dht_writev2 (this, frame, 0);                          return 0;                  } @@ -91,14 +92,10 @@ dht_writev2 (xlator_t *this, call_frame_t *frame, int op_ret)  {          dht_local_t  *local  = NULL;          xlator_t     *subvol = NULL; -        uint64_t      tmp_subvol = 0; -        int           ret = -1;          local = frame->local; -        ret = fd_ctx_get (local->fd, this, &tmp_subvol); -        if (!ret) -                subvol = (xlator_t *)(long)tmp_subvol; +        dht_inode_ctx_get1 (this, local->fd->inode, &subvol);          if (!subvol)                  subvol = local->cached_subvol; @@ -173,6 +170,8 @@ dht_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          dht_local_t  *local = NULL;          call_frame_t *prev = NULL;          int           ret = -1; +        xlator_t    *subvol = NULL; +        inode_t      *inode = NULL;          GF_VALIDATE_OR_GOTO ("dht", frame, err);          GF_VALIDATE_OR_GOTO ("dht", this, out); @@ -214,8 +213,9 @@ dht_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          if (IS_DHT_MIGRATION_PHASE1 (postbuf)) {                  dht_iatt_merge (this, &local->stbuf, postbuf, NULL);                  dht_iatt_merge (this, &local->prebuf, prebuf, NULL); -                ret = fd_ctx_get (local->fd, this, NULL); -                if (!ret || !local->fd) { +                inode = (local->fd) ? local->fd->inode : local->loc.inode; +                dht_inode_ctx_get1 (this, inode, &subvol); +                if (subvol) {                          dht_truncate2 (this, frame, 0);                          return 0;                  } @@ -239,16 +239,13 @@ dht_truncate2 (xlator_t *this, call_frame_t *frame, int op_ret)  {          dht_local_t  *local  = NULL;          xlator_t     *subvol = NULL; -        uint64_t      tmp_subvol = 0; -        int           ret = -1; +        inode_t      *inode = NULL;          local = frame->local; -        if (local->fd) -                ret = fd_ctx_get (local->fd, this, &tmp_subvol); -        if (!ret) -                subvol = (xlator_t *)(long)tmp_subvol; +        inode = local->fd ? local->fd->inode : local->loc.inode; +        dht_inode_ctx_get1 (this, inode, &subvol);          if (!subvol)                  subvol = local->cached_subvol; @@ -360,6 +357,7 @@ dht_fallocate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,          dht_local_t  *local = NULL;          call_frame_t *prev = NULL;          int           ret = -1; +        xlator_t    *subvol = NULL;          GF_VALIDATE_OR_GOTO ("dht", frame, err);          GF_VALIDATE_OR_GOTO ("dht", this, out); @@ -399,8 +397,8 @@ dht_fallocate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,          if (IS_DHT_MIGRATION_PHASE1 (postbuf)) {                  dht_iatt_merge (this, &local->stbuf, postbuf, NULL);                  dht_iatt_merge (this, &local->prebuf, prebuf, NULL); -                ret = fd_ctx_get (local->fd, this, NULL); -                if (!ret) { +                dht_inode_ctx_get1 (this, local->fd->inode, &subvol); +                if (subvol) {                          dht_fallocate2 (this, frame, 0);                          return 0;                  } @@ -423,15 +421,10 @@ dht_fallocate2(xlator_t *this, call_frame_t *frame, int op_ret)  {          dht_local_t  *local  = NULL;          xlator_t     *subvol = NULL; -        uint64_t      tmp_subvol = 0; -        int           ret = -1;          local = frame->local; -        if (local->fd) -                ret = fd_ctx_get (local->fd, this, &tmp_subvol); -        if (!ret) -                subvol = (xlator_t *)(long)tmp_subvol; +        dht_inode_ctx_get1 (this, local->fd->inode, &subvol);          if (!subvol)                  subvol = local->cached_subvol; @@ -498,6 +491,7 @@ dht_discard_cbk(call_frame_t *frame, void *cookie, xlator_t *this,          dht_local_t  *local = NULL;          call_frame_t *prev = NULL;          int           ret = -1; +        xlator_t    *subvol = NULL;          GF_VALIDATE_OR_GOTO ("dht", frame, err);          GF_VALIDATE_OR_GOTO ("dht", this, out); @@ -537,8 +531,8 @@ dht_discard_cbk(call_frame_t *frame, void *cookie, xlator_t *this,          if (IS_DHT_MIGRATION_PHASE1 (postbuf)) {                  dht_iatt_merge (this, &local->stbuf, postbuf, NULL);                  dht_iatt_merge (this, &local->prebuf, prebuf, NULL); -                ret = fd_ctx_get (local->fd, this, NULL); -                if (!ret) { +                dht_inode_ctx_get1 (this, local->fd->inode, &subvol); +                if (subvol) {                          dht_discard2 (this, frame, 0);                          return 0;                  } @@ -561,15 +555,10 @@ dht_discard2(xlator_t *this, call_frame_t *frame, int op_ret)  {          dht_local_t  *local  = NULL;          xlator_t     *subvol = NULL; -        uint64_t      tmp_subvol = 0; -        int           ret = -1;          local = frame->local; -        if (local->fd) -                ret = fd_ctx_get (local->fd, this, &tmp_subvol); -        if (!ret) -                subvol = (xlator_t *)(long)tmp_subvol; +        dht_inode_ctx_get1 (this, local->fd->inode, &subvol);          if (!subvol)                  subvol = local->cached_subvol; @@ -811,15 +800,13 @@ dht_setattr2 (xlator_t *this, call_frame_t *frame, int op_ret)  {          dht_local_t  *local  = NULL;          xlator_t     *subvol = NULL; -        uint64_t      tmp_subvol = 0; -        int           ret = -1; +        inode_t      *inode = NULL;          local = frame->local; -        if (local->fd) -                ret = fd_ctx_get (local->fd, this, &tmp_subvol); -        if (!ret) -                subvol = (xlator_t *)(long)tmp_subvol; +        inode = (local->fd) ? local->fd->inode : local->loc.inode; + +        dht_inode_ctx_get1 (this, inode, &subvol);          if (!subvol)                  subvol = local->cached_subvol;  | 
