diff options
Diffstat (limited to 'xlators')
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 13 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.h | 16 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-inode-read.c | 39 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-inode-write.c | 55 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-rename.c | 5 | 
5 files changed, 91 insertions, 37 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index fc251c90b..5c5825556 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -136,6 +136,8 @@ dht_lookup_selfheal_cbk (call_frame_t *frame, void *cookie,          WIPE (&local->postparent); +        DHT_STRIP_PHASE1_FLAGS (&local->stbuf); +          DHT_STACK_UNWIND (lookup, frame, ret, local->op_errno, local->inode,                            &local->stbuf, local->xattr, &local->postparent); @@ -248,6 +250,7 @@ unlock:                          dht_layout_set (this, local->inode, layout);                  } +                DHT_STRIP_PHASE1_FLAGS (&local->stbuf);                  DHT_STACK_UNWIND (lookup, frame, local->op_ret, local->op_errno,                                    local->inode, &local->stbuf, local->xattr,                                    &local->postparent); @@ -413,6 +416,7 @@ out:                  WIPE (&local->postparent); +                DHT_STRIP_PHASE1_FLAGS (&local->stbuf);                  DHT_STACK_UNWIND (lookup, frame, local->op_ret, local->op_errno,                                    local->inode, &local->stbuf, local->xattr,                                    &local->postparent); @@ -464,6 +468,7 @@ dht_lookup_linkfile_create_cbk (call_frame_t *frame, void *cookie,  unwind:          WIPE (&local->postparent); +        DHT_STRIP_PHASE1_FLAGS (&local->stbuf);          DHT_STACK_UNWIND (lookup, frame, local->op_ret, local->op_errno,                            local->inode, &local->stbuf, local->xattr,                            &local->postparent); @@ -536,6 +541,7 @@ dht_lookup_everywhere_done (call_frame_t *frame, xlator_t *this)                  WIPE (&local->postparent); +                DHT_STRIP_PHASE1_FLAGS (&local->stbuf);                  DHT_STACK_UNWIND (lookup, frame, local->op_ret,                                    local->op_errno, local->inode,                                    &local->stbuf, local->xattr, @@ -565,6 +571,7 @@ dht_lookup_everywhere_done (call_frame_t *frame, xlator_t *this)                  WIPE (&local->postparent); +                DHT_STRIP_PHASE1_FLAGS (&local->stbuf);                  DHT_STACK_UNWIND (lookup, frame, local->op_ret,                                    local->op_errno, local->inode,                                    &local->stbuf, local->xattr, @@ -830,6 +837,7 @@ dht_lookup_linkfile_cbk (call_frame_t *frame, void *cookie,  unwind:          WIPE (postparent); +        DHT_STRIP_PHASE1_FLAGS (stbuf);          DHT_STACK_UNWIND (lookup, frame, op_ret, op_errno, inode, stbuf, xattr,                            postparent); @@ -1009,6 +1017,7 @@ out:          WIPE (postparent); +        DHT_STRIP_PHASE1_FLAGS (stbuf);          DHT_STACK_UNWIND (lookup, frame, op_ret, op_errno, inode, stbuf, xattr,                            postparent);  err: @@ -2587,6 +2596,7 @@ out:           * See dht_iatt_merge for reference.           */ +        DHT_STRIP_PHASE1_FLAGS (stbuf);          DHT_STACK_UNWIND (mknod, frame, op_ret, op_errno, inode, stbuf, preparent,                            postparent);          return 0; @@ -2828,6 +2838,7 @@ dht_link_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          WIPE (postparent);  out: +        DHT_STRIP_PHASE1_FLAGS (stbuf);          DHT_STACK_UNWIND (link, frame, op_ret, op_errno, inode, stbuf, preparent,                            postparent); @@ -2856,6 +2867,7 @@ dht_link_linkfile_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          return 0;  err: +        DHT_STRIP_PHASE1_FLAGS (stbuf);          DHT_STACK_UNWIND (link, frame, op_ret, op_errno, inode, stbuf, preparent,                            postparent); @@ -2966,6 +2978,7 @@ dht_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          }  out: +        DHT_STRIP_PHASE1_FLAGS (stbuf);          DHT_STACK_UNWIND (create, frame, op_ret, op_errno, fd, inode, stbuf, preparent,                            postparent);          return 0; diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index 3545c0f99..97a2bd016 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -244,6 +244,22 @@ typedef struct dht_disk_layout dht_disk_layout_t;                  ((st_mode_from_ia (s->ia_prot, s->ia_type) & ~S_IFMT)   \                   == DHT_LINKFILE_MODE)) +#define IS_DHT_MIGRATION_PHASE2(buf)  (                                 \ +                IA_ISREG ((buf)->ia_type) &&                            \ +                ((st_mode_from_ia ((buf)->ia_prot, (buf)->ia_type) &    \ +                  ~S_IFMT) == DHT_LINKFILE_MODE)) + +#define IS_DHT_MIGRATION_PHASE1(buf)  (                                 \ +                IA_ISREG ((buf)->ia_type) &&                            \ +                ((buf)->ia_prot.sticky == 1) &&                         \ +                ((buf)->ia_prot.sgid == 1)) + +#define DHT_STRIP_PHASE1_FLAGS(buf)  do {               \ +                if (IS_DHT_MIGRATION_PHASE1(buf)) {     \ +                        (buf)->ia_prot.sticky = 0;      \ +                        (buf)->ia_prot.sgid = 0;        \ +                }                                       \ +        } while (0)  #define check_is_dir(i,s,x) (IA_ISDIR(s->ia_type)) diff --git a/xlators/cluster/dht/src/dht-inode-read.c b/xlators/cluster/dht/src/dht-inode-read.c index 1e9f54bda..d6a2cf369 100644 --- a/xlators/cluster/dht/src/dht-inode-read.c +++ b/xlators/cluster/dht/src/dht-inode-read.c @@ -165,9 +165,7 @@ dht_file_attr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  goto out;          /* Check if the rebalance phase2 is true */ -        if ((op_ret == -1) || (IA_ISREG (stbuf->ia_type) && -            ((st_mode_from_ia (stbuf->ia_prot, stbuf->ia_type) & -              ~S_IFMT) == DHT_LINKFILE_MODE))) { +        if ((op_ret == -1) || IS_DHT_MIGRATION_PHASE2 (stbuf)) {                  if (local->fd)                          ret = fd_ctx_get (local->fd, this, &tmp_subvol);                  if (ret) { @@ -178,12 +176,13 @@ dht_file_attr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                          /* value is already set in fd_ctx, that means no need                             to check for whether its complete or not. */                          dht_attr2 (this, frame, 0); -                        ret = 0;                  }                  if (!ret) -                        goto err; +                        return 0;          } +  out: +        DHT_STRIP_PHASE1_FLAGS (stbuf);          DHT_STACK_UNWIND (stat, frame, op_ret, op_errno, stbuf);  err:          return 0; @@ -405,8 +404,7 @@ dht_readv_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          if ((op_ret == -1) && (op_errno != ENOENT))                  goto out; -        if ((op_ret == -1) || ((st_mode_from_ia (stbuf->ia_prot, stbuf->ia_type) & -                                ~S_IFMT) == DHT_LINKFILE_MODE)) { +        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) { @@ -422,6 +420,7 @@ dht_readv_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          }  out: +        DHT_STRIP_PHASE1_FLAGS (stbuf);          DHT_STACK_UNWIND (readv, frame, op_ret, op_errno, vector, count, stbuf,                            iobref); @@ -708,34 +707,39 @@ dht_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,                  goto out;          } -        if (local->call_cnt != 1) +        if (local->call_cnt != 1) { +                if (local->stbuf.ia_blocks) { +                        dht_iatt_merge (this, postbuf, &local->stbuf, NULL); +                        dht_iatt_merge (this, prebuf, &local->prebuf, NULL); +                }                  goto out; +        }          ret = fd_ctx_get (local->fd, this, NULL);          if (ret) {                  local->rebalance.target_op_fn = dht_fsync2;                  /* Check if the rebalance phase1 is true */ -                if (IA_ISREG (postbuf->ia_type) && -                    (postbuf->ia_prot.sticky == 1) && -                    (postbuf->ia_prot.sgid == 1)) { +                if (IS_DHT_MIGRATION_PHASE1 (postbuf)) { +                        dht_iatt_merge (this, &local->stbuf, postbuf, NULL); +                        dht_iatt_merge (this, &local->prebuf, prebuf, NULL); +                          ret = dht_rebalance_in_progress_check (this, frame);                  }                  /* Check if the rebalance phase2 is true */ -                if (IA_ISREG (postbuf->ia_type) && -                    ((st_mode_from_ia (postbuf->ia_prot, postbuf->ia_type) & -                      ~S_IFMT) == DHT_LINKFILE_MODE)) { +                if (IS_DHT_MIGRATION_PHASE2 (postbuf)) {                          ret = dht_rebalance_complete_check (this, frame);                  }          } else {                  dht_fsync2 (this, frame, 0); -                ret = 0;          }          if (!ret)                  return 0;  out: +        DHT_STRIP_PHASE1_FLAGS (postbuf); +        DHT_STRIP_PHASE1_FLAGS (prebuf);          DHT_STACK_UNWIND (fsync, frame, op_ret, op_errno,                            prebuf, postbuf); @@ -853,7 +857,7 @@ err:  /* Symlinks are currently not migrated, so no need for any check here */  int  dht_readlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this, -                  int op_ret, int op_errno, const char *path, struct iatt *sbuf) +                  int op_ret, int op_errno, const char *path, struct iatt *stbuf)  {          dht_local_t *local = NULL; @@ -867,7 +871,8 @@ dht_readlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          }  err: -        DHT_STACK_UNWIND (readlink, frame, op_ret, op_errno, path, sbuf); +        DHT_STRIP_PHASE1_FLAGS (stbuf); +        DHT_STACK_UNWIND (readlink, frame, op_ret, op_errno, path, stbuf);          return 0;  } diff --git a/xlators/cluster/dht/src/dht-inode-write.c b/xlators/cluster/dht/src/dht-inode-write.c index 21eca6117..f9dea75aa 100644 --- a/xlators/cluster/dht/src/dht-inode-write.c +++ b/xlators/cluster/dht/src/dht-inode-write.c @@ -48,23 +48,29 @@ dht_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  goto out;          } -        if (local->call_cnt != 1) +        if (local->call_cnt != 1) { +                /* preserve the modes of source */ +                if (local->stbuf.ia_blocks) { +                        dht_iatt_merge (this, postbuf, &local->stbuf, NULL); +                        dht_iatt_merge (this, prebuf, &local->prebuf, NULL); +                }                  goto out; +        }          local->rebalance.target_op_fn = dht_writev2;          /* Phase 2 of migration */ -        if (IA_ISREG (postbuf->ia_type) && -            ((st_mode_from_ia (postbuf->ia_prot, postbuf->ia_type) & -              ~S_IFMT) == DHT_LINKFILE_MODE)) { +        if (IS_DHT_MIGRATION_PHASE2 (postbuf)) {                  ret = dht_rebalance_complete_check (this, frame);                  if (!ret)                          return 0;          }          /* Check if the rebalance phase1 is true */ -        if (IA_ISREG (postbuf->ia_type) && (postbuf->ia_prot.sticky == 1) && -            (postbuf->ia_prot.sgid == 1)) { +        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_writev2 (this, frame, 0); @@ -76,6 +82,9 @@ dht_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          }  out: +        DHT_STRIP_PHASE1_FLAGS (postbuf); +        DHT_STRIP_PHASE1_FLAGS (prebuf); +          DHT_STACK_UNWIND (writev, frame, op_ret, op_errno, prebuf, postbuf);          return 0; @@ -185,34 +194,40 @@ dht_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  goto out;          } -        if (local->call_cnt != 1) +        if (local->call_cnt != 1) { +                if (local->stbuf.ia_blocks) { +                        dht_iatt_merge (this, postbuf, &local->stbuf, NULL); +                        dht_iatt_merge (this, prebuf, &local->prebuf, NULL); +                }                  goto out; +        }          local->rebalance.target_op_fn = dht_truncate2;          /* Phase 2 of migration */ -        if ((op_ret == -1) || (IA_ISREG (postbuf->ia_type) && -            ((st_mode_from_ia (postbuf->ia_prot, postbuf->ia_type) & -              ~S_IFMT) == DHT_LINKFILE_MODE))) { +        if ((op_ret == -1) || IS_DHT_MIGRATION_PHASE2 (postbuf)) {                  ret = dht_rebalance_complete_check (this, frame);                  if (!ret) -                        goto err; +                        return 0;          }          /* Check if the rebalance phase1 is true */ -        if (IA_ISREG (postbuf->ia_type) && (postbuf->ia_prot.sticky == 1) && -            (postbuf->ia_prot.sgid == 1)) { +        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_truncate2 (this, frame, 0); -                        goto err; +                        return 0;                  }                  ret = dht_rebalance_in_progress_check (this, frame);                  if (!ret) -                        goto err; +                        return 0;          }  out: +        DHT_STRIP_PHASE1_FLAGS (postbuf); +        DHT_STRIP_PHASE1_FLAGS (prebuf);          DHT_STACK_UNWIND (truncate, frame, op_ret, op_errno,                            prebuf, postbuf);  err: @@ -362,19 +377,19 @@ dht_file_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          local->rebalance.target_op_fn = dht_setattr2;          /* Phase 2 of migration */ -        if ((op_ret == -1) || (IA_ISREG (postbuf->ia_type) && -            ((st_mode_from_ia (postbuf->ia_prot, postbuf->ia_type) & -              ~S_IFMT) == DHT_LINKFILE_MODE))) { +        if ((op_ret == -1) || IS_DHT_MIGRATION_PHASE2 (postbuf)) {                  ret = dht_rebalance_complete_check (this, frame);                  if (!ret) -                        goto out; +                        return 0;          }          /* At the end of the migration process, whatever 'attr' we             have on source file will be migrated to destination file             in one shot, hence we don't need to check for in progress -           state here */ +           state here (ie, PHASE1) */  out: +        DHT_STRIP_PHASE1_FLAGS (postbuf); +        DHT_STRIP_PHASE1_FLAGS (prebuf);          DHT_STACK_UNWIND (setattr, frame, op_ret, op_errno,                            prebuf, postbuf); diff --git a/xlators/cluster/dht/src/dht-rename.c b/xlators/cluster/dht/src/dht-rename.c index 226ce280d..02b12887f 100644 --- a/xlators/cluster/dht/src/dht-rename.c +++ b/xlators/cluster/dht/src/dht-rename.c @@ -80,6 +80,7 @@ unwind:                  WIPE (&local->preparent);                  WIPE (&local->postparent); +                DHT_STRIP_PHASE1_FLAGS (&local->stbuf);                  DHT_STACK_UNWIND (rename, frame, local->op_ret, local->op_errno,                                    &local->stbuf, &local->preoldparent,                                    &local->postoldparent, @@ -159,6 +160,7 @@ unwind:          WIPE (&local->preparent);          WIPE (&local->postparent); +        DHT_STRIP_PHASE1_FLAGS (&local->stbuf);          DHT_STACK_UNWIND (rename, frame, local->op_ret, local->op_errno,                            &local->stbuf, &local->preoldparent,                            &local->postoldparent, @@ -344,6 +346,7 @@ dht_rename_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          WIPE (&local->postparent);          if (is_last_call (this_call_cnt)) { +                DHT_STRIP_PHASE1_FLAGS (&local->stbuf);                  DHT_STACK_UNWIND (rename, frame, local->op_ret, local->op_errno,                                    &local->stbuf, &local->preoldparent,                                    &local->postoldparent, &local->preparent, @@ -415,6 +418,7 @@ nolinks:          WIPE (&local->preparent);          WIPE (&local->postparent); +        DHT_STRIP_PHASE1_FLAGS (&local->stbuf);          DHT_STACK_UNWIND (rename, frame, local->op_ret, local->op_errno,                            &local->stbuf, &local->preoldparent,                            &local->postoldparent, &local->preparent, @@ -573,6 +577,7 @@ unwind:          WIPE (&local->preparent);          WIPE (&local->postparent); +        DHT_STRIP_PHASE1_FLAGS (&local->stbuf);          DHT_STACK_UNWIND (rename, frame, local->op_ret, local->op_errno,                            &local->stbuf, &local->preoldparent,                            &local->postoldparent, &local->preparent,  | 
