diff options
| -rw-r--r-- | tests/basic/ec/self-heal-read-write-fail.t | 69 | ||||
| -rw-r--r-- | tests/bugs/ec/bug-1699866-check-reopen-fd.t | 34 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-common.c | 73 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-common.h | 14 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-data.c | 7 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-data.h | 2 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-dir-read.c | 12 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-dir-write.c | 52 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-fops.h | 144 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-generic.c | 54 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-heal.c | 20 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-inode-read.c | 58 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-inode-write.c | 74 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-locks.c | 36 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-types.h | 11 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec.c | 45 | 
16 files changed, 431 insertions, 274 deletions
diff --git a/tests/basic/ec/self-heal-read-write-fail.t b/tests/basic/ec/self-heal-read-write-fail.t new file mode 100644 index 00000000000..0ba591b5bb2 --- /dev/null +++ b/tests/basic/ec/self-heal-read-write-fail.t @@ -0,0 +1,69 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +#This test verifies that self-heal fails when read/write fails as part of heal +cleanup + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume info + +TEST $CLI volume create $V0 disperse 3 redundancy 1 $H0:$B0/${V0}{0,1,2} +TEST $CLI volume heal $V0 disable +TEST $CLI volume start $V0 + +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0 +TEST touch $M0/a +TEST kill_brick $V0 $H0 $B0/${V0}0 +echo abc >> $M0/a + +# Umount the volume to force all pending writes to reach the bricks +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 + +#Load error-gen and fail read fop and test that heal fails +TEST $CLI volume stop $V0 #Stop volume so that error-gen can be loaded +TEST $CLI volume set $V0 debug.error-gen posix +TEST $CLI volume set $V0 debug.error-fops read +TEST $CLI volume set $V0 debug.error-number EBADF +TEST $CLI volume set $V0 debug.error-failure 100 + +TEST $CLI volume start $V0 +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0 +EXPECT_WITHIN $HEAL_TIMEOUT "^2$" get_pending_heal_count $V0 +TEST ! getfattr -n trusted.ec.heal $M0/a +EXPECT_WITHIN $HEAL_TIMEOUT "^2$" get_pending_heal_count $V0 + +#fail write fop and test that heal fails +TEST $CLI volume stop $V0 +TEST $CLI volume set $V0 debug.error-fops write + +TEST $CLI volume start $V0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0 +EXPECT_WITHIN $HEAL_TIMEOUT "^2$" get_pending_heal_count $V0 +TEST ! getfattr -n trusted.ec.heal $M0/a +EXPECT_WITHIN $HEAL_TIMEOUT "^2$" get_pending_heal_count $V0 + +TEST $CLI volume stop $V0 #Stop volume so that error-gen can be disabled +TEST $CLI volume reset $V0 debug.error-gen +TEST $CLI volume reset $V0 debug.error-fops +TEST $CLI volume reset $V0 debug.error-number +TEST $CLI volume reset $V0 debug.error-failure + +TEST $CLI volume start $V0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0 +EXPECT_WITHIN $HEAL_TIMEOUT "^2$" get_pending_heal_count $V0 +TEST getfattr -n trusted.ec.heal $M0/a +EXPECT "^0$" get_pending_heal_count $V0 + +#Test that heal worked as expected by forcing read from brick0 +#remount to make sure data is not served from any cache +EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0 +TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0 +TEST kill_brick $V0 $H0 $B0/${V0}2 +EXPECT "abc" cat $M0/a + +cleanup diff --git a/tests/bugs/ec/bug-1699866-check-reopen-fd.t b/tests/bugs/ec/bug-1699866-check-reopen-fd.t new file mode 100644 index 00000000000..4386d010318 --- /dev/null +++ b/tests/bugs/ec/bug-1699866-check-reopen-fd.t @@ -0,0 +1,34 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../fileio.rc + +cleanup + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 disperse 6 redundancy 2 $H0:$B0/${V0}{0..5} +TEST $CLI volume heal $V0 disable +TEST $CLI volume set $V0 disperse.background-heals 0 +TEST $CLI volume set $V0 write-behind off +TEST $CLI volume set $V0 open-behind off +TEST $CLI volume start $V0 +TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0 + +TEST mkdir -p $M0/dir + +fd="$(fd_available)" + +TEST kill_brick $V0 $H0 $B0/${V0}0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "5" ec_child_up_count $V0 0 + +TEST fd_open ${fd} rw $M0/dir/test +TEST fd_write ${fd} "test1" +TEST $CLI volume replace-brick ${V0} $H0:$B0/${V0}0 $H0:$B0/${V0}0_1 commit force +EXPECT_WITHIN $CHILD_UP_TIMEOUT "6" ec_child_up_count $V0 0 +TEST fd_write ${fd} "test2" +TEST fd_close ${fd} + +cleanup diff --git a/xlators/cluster/ec/src/ec-common.c b/xlators/cluster/ec/src/ec-common.c index 518368073e8..1454ae23b23 100644 --- a/xlators/cluster/ec/src/ec-common.c +++ b/xlators/cluster/ec/src/ec-common.c @@ -44,16 +44,16 @@ ec_update_fd_status(fd_t *fd, xlator_t *xl, int idx, int32_t ret_status)      UNLOCK(&fd->lock);  } -static int -ec_fd_ctx_need_open(fd_t *fd, xlator_t *this, uintptr_t *need_open) +static uintptr_t +ec_fd_ctx_need_open(fd_t *fd, xlator_t *this, uintptr_t mask)  {      int i = 0;      int count = 0;      ec_t *ec = NULL;      ec_fd_t *fd_ctx = NULL; +    uintptr_t need_open = 0;      ec = this->private; -    *need_open = 0;      fd_ctx = ec_fd_get(fd, this);      if (!fd_ctx) @@ -63,9 +63,9 @@ ec_fd_ctx_need_open(fd_t *fd, xlator_t *this, uintptr_t *need_open)      {          for (i = 0; i < ec->nodes; i++) {              if ((fd_ctx->fd_status[i] == EC_FD_NOT_OPENED) && -                (ec->xl_up & (1 << i))) { +                ((ec->xl_up & (1 << i)) != 0) && ((mask & (1 << i)) != 0)) {                  fd_ctx->fd_status[i] = EC_FD_OPENING; -                *need_open |= (1 << i); +                need_open |= (1 << i);                  count++;              }          } @@ -76,10 +76,11 @@ ec_fd_ctx_need_open(fd_t *fd, xlator_t *this, uintptr_t *need_open)       * then ignore fixing the fd as it has been       * requested from heal operation.       */ -    if (count >= ec->fragments) -        count = 0; +    if (count >= ec->fragments) { +        need_open = 0; +    } -    return count; +    return need_open;  }  static gf_boolean_t @@ -96,9 +97,8 @@ ec_is_fd_fixable(fd_t *fd)  }  static void -ec_fix_open(ec_fop_data_t *fop) +ec_fix_open(ec_fop_data_t *fop, uintptr_t mask)  { -    int call_count = 0;      uintptr_t need_open = 0;      int ret = 0;      loc_t loc = { @@ -109,9 +109,10 @@ ec_fix_open(ec_fop_data_t *fop)          goto out;      /* Evaluate how many remote fd's to be opened */ -    call_count = ec_fd_ctx_need_open(fop->fd, fop->xl, &need_open); -    if (!call_count) +    need_open = ec_fd_ctx_need_open(fop->fd, fop->xl, mask); +    if (need_open == 0) {          goto out; +    }      loc.inode = inode_ref(fop->fd->inode);      gf_uuid_copy(loc.gfid, fop->fd->inode->gfid); @@ -121,11 +122,13 @@ ec_fix_open(ec_fop_data_t *fop)      }      if (IA_IFDIR == fop->fd->inode->ia_type) { -        ec_opendir(fop->frame, fop->xl, need_open, EC_MINIMUM_ONE, NULL, NULL, +        ec_opendir(fop->frame, fop->xl, need_open, +                   EC_MINIMUM_ONE | EC_FOP_NO_PROPAGATE_ERROR, NULL, NULL,                     &fop->loc[0], fop->fd, NULL);      } else { -        ec_open(fop->frame, fop->xl, need_open, EC_MINIMUM_ONE, NULL, NULL, -                &loc, fop->fd->flags, fop->fd, NULL); +        ec_open(fop->frame, fop->xl, need_open, +                EC_MINIMUM_ONE | EC_FOP_NO_PROPAGATE_ERROR, NULL, NULL, &loc, +                fop->fd->flags, fop->fd, NULL);      }  out: @@ -495,12 +498,16 @@ ec_resume(ec_fop_data_t *fop, int32_t error)  }  void -ec_resume_parent(ec_fop_data_t *fop, int32_t error) +ec_resume_parent(ec_fop_data_t *fop)  {      ec_fop_data_t *parent; +    int32_t error = 0;      parent = fop->parent;      if (parent != NULL) { +        if ((fop->fop_flags & EC_FOP_NO_PROPAGATE_ERROR) == 0) { +            error = fop->error; +        }          ec_trace("RESUME_PARENT", fop, "error=%u", error);          fop->parent = NULL;          ec_resume(parent, error); @@ -593,6 +600,8 @@ ec_internal_op(ec_fop_data_t *fop)          return _gf_true;      if (fop->id == GF_FOP_FXATTROP)          return _gf_true; +    if (fop->id == GF_FOP_OPEN) +        return _gf_true;      return _gf_false;  } @@ -631,7 +640,7 @@ ec_msg_str(ec_fop_data_t *fop)      return fop->errstr;  } -int32_t +static int32_t  ec_child_select(ec_fop_data_t *fop)  {      ec_t *ec = fop->xl->private; @@ -693,8 +702,6 @@ ec_child_select(ec_fop_data_t *fop)          return 0;      } -    ec_sleep(fop); -      return 1;  } @@ -773,6 +780,8 @@ ec_dispatch_one(ec_fop_data_t *fop)      ec_dispatch_start(fop);      if (ec_child_select(fop)) { +        ec_sleep(fop); +          fop->expected = 1;          fop->first = ec_select_first_by_read_policy(fop->xl->private, fop); @@ -807,6 +816,8 @@ ec_dispatch_inc(ec_fop_data_t *fop)      ec_dispatch_start(fop);      if (ec_child_select(fop)) { +        ec_sleep(fop); +          fop->expected = gf_bits_count(fop->remaining);          fop->first = 0; @@ -820,6 +831,8 @@ ec_dispatch_all(ec_fop_data_t *fop)      ec_dispatch_start(fop);      if (ec_child_select(fop)) { +        ec_sleep(fop); +          fop->expected = gf_bits_count(fop->remaining);          fop->first = 0; @@ -838,6 +851,8 @@ ec_dispatch_min(ec_fop_data_t *fop)      ec_dispatch_start(fop);      if (ec_child_select(fop)) { +        ec_sleep(fop); +          fop->expected = count = ec->fragments;          fop->first = ec_select_first_by_read_policy(fop->xl->private, fop);          idx = fop->first - 1; @@ -852,6 +867,23 @@ ec_dispatch_min(ec_fop_data_t *fop)      }  } +void +ec_succeed_all(ec_fop_data_t *fop) +{ +    ec_dispatch_start(fop); + +    if (ec_child_select(fop)) { +        fop->expected = gf_bits_count(fop->remaining); +        fop->first = 0; + +        /* Simulate a successful execution on all bricks */ +        ec_trace("SUCCEED", fop, ""); + +        fop->good = fop->remaining; +        fop->remaining = 0; +    } +} +  ec_lock_t *  ec_lock_allocate(ec_fop_data_t *fop, loc_t *loc)  { @@ -1825,7 +1857,8 @@ ec_lock_acquired(ec_lock_link_t *link)      if (fop->use_fd &&          (link->update[EC_DATA_TXN] || link->update[EC_METADATA_TXN])) { -        ec_fix_open(fop); +        /* Try to reopen closed fd's only if lock has succeeded. */ +        ec_fix_open(fop, lock->mask);      }      ec_lock_resume_shared(&list); diff --git a/xlators/cluster/ec/src/ec-common.h b/xlators/cluster/ec/src/ec-common.h index 54aaa779443..e94834219b9 100644 --- a/xlators/cluster/ec/src/ec-common.h +++ b/xlators/cluster/ec/src/ec-common.h @@ -54,9 +54,12 @@ enum _ec_xattrop_flags {  #define EC_SELFHEAL_BIT 62 -#define EC_MINIMUM_ONE -1 -#define EC_MINIMUM_MIN -2 -#define EC_MINIMUM_ALL -3 +#define EC_MINIMUM_ONE (1 << 6) +#define EC_MINIMUM_MIN (2 << 6) +#define EC_MINIMUM_ALL (3 << 6) +#define EC_FOP_NO_PROPAGATE_ERROR (1 << 8) +#define EC_FOP_MINIMUM(_flags) ((_flags)&255) +#define EC_FOP_FLAGS(_flags) ((_flags) & ~255)  #define EC_UPDATE_DATA 1  #define EC_UPDATE_META 2 @@ -163,11 +166,14 @@ void  ec_dispatch_one(ec_fop_data_t *fop);  void +ec_succeed_all(ec_fop_data_t *fop); + +void  ec_sleep(ec_fop_data_t *fop);  void  ec_resume(ec_fop_data_t *fop, int32_t error);  void -ec_resume_parent(ec_fop_data_t *fop, int32_t error); +ec_resume_parent(ec_fop_data_t *fop);  void  ec_manager(ec_fop_data_t *fop, int32_t error); diff --git a/xlators/cluster/ec/src/ec-data.c b/xlators/cluster/ec/src/ec-data.c index fae8843a679..6ef934080a9 100644 --- a/xlators/cluster/ec/src/ec-data.c +++ b/xlators/cluster/ec/src/ec-data.c @@ -98,7 +98,7 @@ ec_cbk_data_destroy(ec_cbk_data_t *cbk)  ec_fop_data_t *  ec_fop_data_allocate(call_frame_t *frame, xlator_t *this, int32_t id, -                     uint32_t flags, uintptr_t target, int32_t minimum, +                     uint32_t flags, uintptr_t target, uint32_t fop_flags,                       ec_wind_f wind, ec_handler_f handler, ec_cbk_t cbks,                       void *data)  { @@ -151,7 +151,8 @@ ec_fop_data_allocate(call_frame_t *frame, xlator_t *this, int32_t id,      fop->refs = 1;      fop->flags = flags; -    fop->minimum = minimum; +    fop->minimum = EC_FOP_MINIMUM(fop_flags); +    fop->fop_flags = EC_FOP_FLAGS(fop_flags);      fop->mask = target;      fop->wind = wind; @@ -271,7 +272,7 @@ ec_fop_data_release(ec_fop_data_t *fop)          loc_wipe(&fop->loc[1]);          GF_FREE(fop->errstr); -        ec_resume_parent(fop, fop->error); +        ec_resume_parent(fop);          ec_fop_cleanup(fop); diff --git a/xlators/cluster/ec/src/ec-data.h b/xlators/cluster/ec/src/ec-data.h index 112536d554c..c8a74ffe1ed 100644 --- a/xlators/cluster/ec/src/ec-data.h +++ b/xlators/cluster/ec/src/ec-data.h @@ -18,7 +18,7 @@ ec_cbk_data_allocate(call_frame_t *frame, xlator_t *this, ec_fop_data_t *fop,                       int32_t id, int32_t idx, int32_t op_ret, int32_t op_errno);  ec_fop_data_t *  ec_fop_data_allocate(call_frame_t *frame, xlator_t *this, int32_t id, -                     uint32_t flags, uintptr_t target, int32_t minimum, +                     uint32_t flags, uintptr_t target, uint32_t fop_flags,                       ec_wind_f wind, ec_handler_f handler, ec_cbk_t cbks,                       void *data);  void diff --git a/xlators/cluster/ec/src/ec-dir-read.c b/xlators/cluster/ec/src/ec-dir-read.c index c9db7010a0f..8310d4a1a8c 100644 --- a/xlators/cluster/ec/src/ec-dir-read.c +++ b/xlators/cluster/ec/src/ec-dir-read.c @@ -219,7 +219,7 @@ ec_manager_opendir(ec_fop_data_t *fop, int32_t state)  void  ec_opendir(call_frame_t *frame, xlator_t *this, uintptr_t target, -           int32_t minimum, fop_opendir_cbk_t func, void *data, loc_t *loc, +           uint32_t fop_flags, fop_opendir_cbk_t func, void *data, loc_t *loc,             fd_t *fd, dict_t *xdata)  {      ec_cbk_t callback = {.opendir = func}; @@ -233,7 +233,7 @@ ec_opendir(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, this->private, out);      fop = ec_fop_data_allocate(frame, this, GF_FOP_OPENDIR, EC_FLAG_LOCK_SHARED, -                               target, minimum, ec_wind_opendir, +                               target, fop_flags, ec_wind_opendir,                                 ec_manager_opendir, callback, data);      if (fop == NULL) {          goto out; @@ -515,7 +515,7 @@ ec_manager_readdir(ec_fop_data_t *fop, int32_t state)  void  ec_readdir(call_frame_t *frame, xlator_t *this, uintptr_t target, -           int32_t minimum, fop_readdir_cbk_t func, void *data, fd_t *fd, +           uint32_t fop_flags, fop_readdir_cbk_t func, void *data, fd_t *fd,             size_t size, off_t offset, dict_t *xdata)  {      ec_cbk_t callback = {.readdir = func}; @@ -529,7 +529,7 @@ ec_readdir(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, this->private, out);      fop = ec_fop_data_allocate(frame, this, GF_FOP_READDIR, EC_FLAG_LOCK_SHARED, -                               target, minimum, ec_wind_readdir, +                               target, fop_flags, ec_wind_readdir,                                 ec_manager_readdir, callback, data);      if (fop == NULL) {          goto out; @@ -585,7 +585,7 @@ ec_wind_readdirp(ec_t *ec, ec_fop_data_t *fop, int32_t idx)  void  ec_readdirp(call_frame_t *frame, xlator_t *this, uintptr_t target, -            int32_t minimum, fop_readdirp_cbk_t func, void *data, fd_t *fd, +            uint32_t fop_flags, fop_readdirp_cbk_t func, void *data, fd_t *fd,              size_t size, off_t offset, dict_t *xdata)  {      ec_cbk_t callback = {.readdirp = func}; @@ -599,7 +599,7 @@ ec_readdirp(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, this->private, out);      fop = ec_fop_data_allocate( -        frame, this, GF_FOP_READDIRP, EC_FLAG_LOCK_SHARED, target, minimum, +        frame, this, GF_FOP_READDIRP, EC_FLAG_LOCK_SHARED, target, fop_flags,          ec_wind_readdirp, ec_manager_readdir, callback, data);      if (fop == NULL) {          goto out; diff --git a/xlators/cluster/ec/src/ec-dir-write.c b/xlators/cluster/ec/src/ec-dir-write.c index e24667feedc..0b8ee219f87 100644 --- a/xlators/cluster/ec/src/ec-dir-write.c +++ b/xlators/cluster/ec/src/ec-dir-write.c @@ -262,7 +262,7 @@ ec_manager_create(ec_fop_data_t *fop, int32_t state)  void  ec_create(call_frame_t *frame, xlator_t *this, uintptr_t target, -          int32_t minimum, fop_create_cbk_t func, void *data, loc_t *loc, +          uint32_t fop_flags, fop_create_cbk_t func, void *data, loc_t *loc,            int32_t flags, mode_t mode, mode_t umask, fd_t *fd, dict_t *xdata)  {      ec_cbk_t callback = {.create = func}; @@ -275,7 +275,7 @@ ec_create(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_CREATE, 0, target, minimum, +    fop = ec_fop_data_allocate(frame, this, GF_FOP_CREATE, 0, target, fop_flags,                                 ec_wind_create, ec_manager_create, callback,                                 data);      if (fop == NULL) { @@ -432,9 +432,9 @@ ec_manager_link(ec_fop_data_t *fop, int32_t state)  }  void -ec_link(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -        fop_link_cbk_t func, void *data, loc_t *oldloc, loc_t *newloc, -        dict_t *xdata) +ec_link(call_frame_t *frame, xlator_t *this, uintptr_t target, +        uint32_t fop_flags, fop_link_cbk_t func, void *data, loc_t *oldloc, +        loc_t *newloc, dict_t *xdata)  {      ec_cbk_t callback = {.link = func};      ec_fop_data_t *fop = NULL; @@ -446,7 +446,7 @@ ec_link(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_LINK, 0, target, minimum, +    fop = ec_fop_data_allocate(frame, this, GF_FOP_LINK, 0, target, fop_flags,                                 ec_wind_link, ec_manager_link, callback, data);      if (fop == NULL) {          goto out; @@ -613,9 +613,9 @@ ec_manager_mkdir(ec_fop_data_t *fop, int32_t state)  }  void -ec_mkdir(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -         fop_mkdir_cbk_t func, void *data, loc_t *loc, mode_t mode, -         mode_t umask, dict_t *xdata) +ec_mkdir(call_frame_t *frame, xlator_t *this, uintptr_t target, +         uint32_t fop_flags, fop_mkdir_cbk_t func, void *data, loc_t *loc, +         mode_t mode, mode_t umask, dict_t *xdata)  {      ec_cbk_t callback = {.mkdir = func};      ec_fop_data_t *fop = NULL; @@ -627,7 +627,7 @@ ec_mkdir(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_MKDIR, 0, target, minimum, +    fop = ec_fop_data_allocate(frame, this, GF_FOP_MKDIR, 0, target, fop_flags,                                 ec_wind_mkdir, ec_manager_mkdir, callback, data);      if (fop == NULL) {          goto out; @@ -815,9 +815,9 @@ ec_manager_mknod(ec_fop_data_t *fop, int32_t state)  }  void -ec_mknod(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -         fop_mknod_cbk_t func, void *data, loc_t *loc, mode_t mode, dev_t rdev, -         mode_t umask, dict_t *xdata) +ec_mknod(call_frame_t *frame, xlator_t *this, uintptr_t target, +         uint32_t fop_flags, fop_mknod_cbk_t func, void *data, loc_t *loc, +         mode_t mode, dev_t rdev, mode_t umask, dict_t *xdata)  {      ec_cbk_t callback = {.mknod = func};      ec_fop_data_t *fop = NULL; @@ -829,7 +829,7 @@ ec_mknod(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_MKNOD, 0, target, minimum, +    fop = ec_fop_data_allocate(frame, this, GF_FOP_MKNOD, 0, target, fop_flags,                                 ec_wind_mknod, ec_manager_mknod, callback, data);      if (fop == NULL) {          goto out; @@ -975,7 +975,7 @@ ec_manager_rename(ec_fop_data_t *fop, int32_t state)  void  ec_rename(call_frame_t *frame, xlator_t *this, uintptr_t target, -          int32_t minimum, fop_rename_cbk_t func, void *data, loc_t *oldloc, +          uint32_t fop_flags, fop_rename_cbk_t func, void *data, loc_t *oldloc,            loc_t *newloc, dict_t *xdata)  {      ec_cbk_t callback = {.rename = func}; @@ -988,7 +988,7 @@ ec_rename(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_RENAME, 0, target, minimum, +    fop = ec_fop_data_allocate(frame, this, GF_FOP_RENAME, 0, target, fop_flags,                                 ec_wind_rename, ec_manager_rename, callback,                                 data);      if (fop == NULL) { @@ -1125,9 +1125,9 @@ ec_manager_rmdir(ec_fop_data_t *fop, int32_t state)  }  void -ec_rmdir(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -         fop_rmdir_cbk_t func, void *data, loc_t *loc, int xflags, -         dict_t *xdata) +ec_rmdir(call_frame_t *frame, xlator_t *this, uintptr_t target, +         uint32_t fop_flags, fop_rmdir_cbk_t func, void *data, loc_t *loc, +         int xflags, dict_t *xdata)  {      ec_cbk_t callback = {.rmdir = func};      ec_fop_data_t *fop = NULL; @@ -1139,7 +1139,7 @@ ec_rmdir(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_RMDIR, 0, target, minimum, +    fop = ec_fop_data_allocate(frame, this, GF_FOP_RMDIR, 0, target, fop_flags,                                 ec_wind_rmdir, ec_manager_rmdir, callback, data);      if (fop == NULL) {          goto out; @@ -1281,7 +1281,7 @@ ec_manager_symlink(ec_fop_data_t *fop, int32_t state)  void  ec_symlink(call_frame_t *frame, xlator_t *this, uintptr_t target, -           int32_t minimum, fop_symlink_cbk_t func, void *data, +           uint32_t fop_flags, fop_symlink_cbk_t func, void *data,             const char *linkname, loc_t *loc, mode_t umask, dict_t *xdata)  {      ec_cbk_t callback = {.symlink = func}; @@ -1294,9 +1294,9 @@ ec_symlink(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_SYMLINK, 0, target, minimum, -                               ec_wind_symlink, ec_manager_symlink, callback, -                               data); +    fop = ec_fop_data_allocate(frame, this, GF_FOP_SYMLINK, 0, target, +                               fop_flags, ec_wind_symlink, ec_manager_symlink, +                               callback, data);      if (fop == NULL) {          goto out;      } @@ -1435,7 +1435,7 @@ ec_manager_unlink(ec_fop_data_t *fop, int32_t state)  void  ec_unlink(call_frame_t *frame, xlator_t *this, uintptr_t target, -          int32_t minimum, fop_unlink_cbk_t func, void *data, loc_t *loc, +          uint32_t fop_flags, fop_unlink_cbk_t func, void *data, loc_t *loc,            int xflags, dict_t *xdata)  {      ec_cbk_t callback = {.unlink = func}; @@ -1448,7 +1448,7 @@ ec_unlink(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_UNLINK, 0, target, minimum, +    fop = ec_fop_data_allocate(frame, this, GF_FOP_UNLINK, 0, target, fop_flags,                                 ec_wind_unlink, ec_manager_unlink, callback,                                 data);      if (fop == NULL) { diff --git a/xlators/cluster/ec/src/ec-fops.h b/xlators/cluster/ec/src/ec-fops.h index 2abef0d17b3..07edf8a7fec 100644 --- a/xlators/cluster/ec/src/ec-fops.h +++ b/xlators/cluster/ec/src/ec-fops.h @@ -18,233 +18,237 @@  void  ec_access(call_frame_t *frame, xlator_t *this, uintptr_t target, -          int32_t minimum, fop_access_cbk_t func, void *data, loc_t *loc, +          uint32_t fop_flags, fop_access_cbk_t func, void *data, loc_t *loc,            int32_t mask, dict_t *xdata);  void  ec_create(call_frame_t *frame, xlator_t *this, uintptr_t target, -          int32_t minimum, fop_create_cbk_t func, void *data, loc_t *loc, +          uint32_t fop_flags, fop_create_cbk_t func, void *data, loc_t *loc,            int32_t flags, mode_t mode, mode_t umask, fd_t *fd, dict_t *xdata);  void  ec_entrylk(call_frame_t *frame, xlator_t *this, uintptr_t target, -           int32_t minimum, fop_entrylk_cbk_t func, void *data, +           uint32_t fop_flags, fop_entrylk_cbk_t func, void *data,             const char *volume, loc_t *loc, const char *basename,             entrylk_cmd cmd, entrylk_type type, dict_t *xdata);  void  ec_fentrylk(call_frame_t *frame, xlator_t *this, uintptr_t target, -            int32_t minimum, fop_fentrylk_cbk_t func, void *data, +            uint32_t fop_flags, fop_fentrylk_cbk_t func, void *data,              const char *volume, fd_t *fd, const char *basename, entrylk_cmd cmd,              entrylk_type type, dict_t *xdata);  void -ec_flush(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -         fop_flush_cbk_t func, void *data, fd_t *fd, dict_t *xdata); +ec_flush(call_frame_t *frame, xlator_t *this, uintptr_t target, +         uint32_t fop_flags, fop_flush_cbk_t func, void *data, fd_t *fd, +         dict_t *xdata);  void -ec_fsync(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -         fop_fsync_cbk_t func, void *data, fd_t *fd, int32_t datasync, -         dict_t *xdata); +ec_fsync(call_frame_t *frame, xlator_t *this, uintptr_t target, +         uint32_t fop_flags, fop_fsync_cbk_t func, void *data, fd_t *fd, +         int32_t datasync, dict_t *xdata);  void  ec_fsyncdir(call_frame_t *frame, xlator_t *this, uintptr_t target, -            int32_t minimum, fop_fsyncdir_cbk_t func, void *data, fd_t *fd, +            uint32_t fop_flags, fop_fsyncdir_cbk_t func, void *data, fd_t *fd,              int32_t datasync, dict_t *xdata);  void  ec_getxattr(call_frame_t *frame, xlator_t *this, uintptr_t target, -            int32_t minimum, fop_getxattr_cbk_t func, void *data, loc_t *loc, +            uint32_t fop_flags, fop_getxattr_cbk_t func, void *data, loc_t *loc,              const char *name, dict_t *xdata);  void  ec_fgetxattr(call_frame_t *frame, xlator_t *this, uintptr_t target, -             int32_t minimum, fop_fgetxattr_cbk_t func, void *data, fd_t *fd, +             uint32_t fop_flags, fop_fgetxattr_cbk_t func, void *data, fd_t *fd,               const char *name, dict_t *xdata);  void -ec_heal(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -        fop_heal_cbk_t func, void *data, loc_t *loc, int32_t partial, -        dict_t *xdata); +ec_heal(call_frame_t *frame, xlator_t *this, uintptr_t target, +        uint32_t fop_flags, fop_heal_cbk_t func, void *data, loc_t *loc, +        int32_t partial, dict_t *xdata);  void -ec_fheal(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -         fop_fheal_cbk_t func, void *data, fd_t *fd, int32_t partial, -         dict_t *xdata); +ec_fheal(call_frame_t *frame, xlator_t *this, uintptr_t target, +         uint32_t fop_flags, fop_fheal_cbk_t func, void *data, fd_t *fd, +         int32_t partial, dict_t *xdata);  void  ec_inodelk(call_frame_t *frame, xlator_t *this, gf_lkowner_t *owner, -           uintptr_t target, int32_t minimum, fop_inodelk_cbk_t func, +           uintptr_t target, uint32_t fop_flags, fop_inodelk_cbk_t func,             void *data, const char *volume, loc_t *loc, int32_t cmd,             struct gf_flock *flock, dict_t *xdata);  void  ec_finodelk(call_frame_t *frame, xlator_t *this, gf_lkowner_t *owner, -            uintptr_t target, int32_t minimum, fop_finodelk_cbk_t func, +            uintptr_t target, uint32_t fop_flags, fop_finodelk_cbk_t func,              void *data, const char *volume, fd_t *fd, int32_t cmd,              struct gf_flock *flock, dict_t *xdata);  void -ec_link(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -        fop_link_cbk_t func, void *data, loc_t *oldloc, loc_t *newloc, -        dict_t *xdata); +ec_link(call_frame_t *frame, xlator_t *this, uintptr_t target, +        uint32_t fop_flags, fop_link_cbk_t func, void *data, loc_t *oldloc, +        loc_t *newloc, dict_t *xdata);  void -ec_lk(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, +ec_lk(call_frame_t *frame, xlator_t *this, uintptr_t target, uint32_t fop_flags,        fop_lk_cbk_t func, void *data, fd_t *fd, int32_t cmd,        struct gf_flock *flock, dict_t *xdata);  void  ec_lookup(call_frame_t *frame, xlator_t *this, uintptr_t target, -          int32_t minimum, fop_lookup_cbk_t func, void *data, loc_t *loc, +          uint32_t fop_flags, fop_lookup_cbk_t func, void *data, loc_t *loc,            dict_t *xdata);  void -ec_mkdir(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -         fop_mkdir_cbk_t func, void *data, loc_t *loc, mode_t mode, -         mode_t umask, dict_t *xdata); +ec_mkdir(call_frame_t *frame, xlator_t *this, uintptr_t target, +         uint32_t fop_flags, fop_mkdir_cbk_t func, void *data, loc_t *loc, +         mode_t mode, mode_t umask, dict_t *xdata);  void -ec_mknod(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -         fop_mknod_cbk_t func, void *data, loc_t *loc, mode_t mode, dev_t rdev, -         mode_t umask, dict_t *xdata); +ec_mknod(call_frame_t *frame, xlator_t *this, uintptr_t target, +         uint32_t fop_flags, fop_mknod_cbk_t func, void *data, loc_t *loc, +         mode_t mode, dev_t rdev, mode_t umask, dict_t *xdata);  void -ec_open(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -        fop_open_cbk_t func, void *data, loc_t *loc, int32_t flags, fd_t *fd, -        dict_t *xdata); +ec_open(call_frame_t *frame, xlator_t *this, uintptr_t target, +        uint32_t fop_flags, fop_open_cbk_t func, void *data, loc_t *loc, +        int32_t flags, fd_t *fd, dict_t *xdata);  void  ec_opendir(call_frame_t *frame, xlator_t *this, uintptr_t target, -           int32_t minimum, fop_opendir_cbk_t func, void *data, loc_t *loc, +           uint32_t fop_flags, fop_opendir_cbk_t func, void *data, loc_t *loc,             fd_t *fd, dict_t *xdata);  void  ec_readdir(call_frame_t *frame, xlator_t *this, uintptr_t target, -           int32_t minimum, fop_readdir_cbk_t func, void *data, fd_t *fd, +           uint32_t fop_flags, fop_readdir_cbk_t func, void *data, fd_t *fd,             size_t size, off_t offset, dict_t *xdata);  void  ec_readdirp(call_frame_t *frame, xlator_t *this, uintptr_t target, -            int32_t minimum, fop_readdirp_cbk_t func, void *data, fd_t *fd, +            uint32_t fop_flags, fop_readdirp_cbk_t func, void *data, fd_t *fd,              size_t size, off_t offset, dict_t *xdata);  void  ec_readlink(call_frame_t *frame, xlator_t *this, uintptr_t target, -            int32_t minimum, fop_readlink_cbk_t func, void *data, loc_t *loc, +            uint32_t fop_flags, fop_readlink_cbk_t func, void *data, loc_t *loc,              size_t size, dict_t *xdata);  void -ec_readv(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -         fop_readv_cbk_t func, void *data, fd_t *fd, size_t size, off_t offset, -         uint32_t flags, dict_t *xdata); +ec_readv(call_frame_t *frame, xlator_t *this, uintptr_t target, +         uint32_t fop_flags, fop_readv_cbk_t func, void *data, fd_t *fd, +         size_t size, off_t offset, uint32_t flags, dict_t *xdata);  void  ec_removexattr(call_frame_t *frame, xlator_t *this, uintptr_t target, -               int32_t minimum, fop_removexattr_cbk_t func, void *data, +               uint32_t fop_flags, fop_removexattr_cbk_t func, void *data,                 loc_t *loc, const char *name, dict_t *xdata);  void  ec_fremovexattr(call_frame_t *frame, xlator_t *this, uintptr_t target, -                int32_t minimum, fop_fremovexattr_cbk_t func, void *data, +                uint32_t fop_flags, fop_fremovexattr_cbk_t func, void *data,                  fd_t *fd, const char *name, dict_t *xdata);  void  ec_rename(call_frame_t *frame, xlator_t *this, uintptr_t target, -          int32_t minimum, fop_rename_cbk_t func, void *data, loc_t *oldloc, +          uint32_t fop_flags, fop_rename_cbk_t func, void *data, loc_t *oldloc,            loc_t *newloc, dict_t *xdata);  void -ec_rmdir(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -         fop_rmdir_cbk_t func, void *data, loc_t *loc, int xflags, -         dict_t *xdata); +ec_rmdir(call_frame_t *frame, xlator_t *this, uintptr_t target, +         uint32_t fop_flags, fop_rmdir_cbk_t func, void *data, loc_t *loc, +         int xflags, dict_t *xdata);  void  ec_setattr(call_frame_t *frame, xlator_t *this, uintptr_t target, -           int32_t minimum, fop_setattr_cbk_t func, void *data, loc_t *loc, +           uint32_t fop_flags, fop_setattr_cbk_t func, void *data, loc_t *loc,             struct iatt *stbuf, int32_t valid, dict_t *xdata);  void  ec_fsetattr(call_frame_t *frame, xlator_t *this, uintptr_t target, -            int32_t minimum, fop_fsetattr_cbk_t func, void *data, fd_t *fd, +            uint32_t fop_flags, fop_fsetattr_cbk_t func, void *data, fd_t *fd,              struct iatt *stbuf, int32_t valid, dict_t *xdata);  void  ec_setxattr(call_frame_t *frame, xlator_t *this, uintptr_t target, -            int32_t minimum, fop_setxattr_cbk_t func, void *data, loc_t *loc, +            uint32_t fop_flags, fop_setxattr_cbk_t func, void *data, loc_t *loc,              dict_t *dict, int32_t flags, dict_t *xdata);  void  ec_fsetxattr(call_frame_t *frame, xlator_t *this, uintptr_t target, -             int32_t minimum, fop_fsetxattr_cbk_t func, void *data, fd_t *fd, +             uint32_t fop_flags, fop_fsetxattr_cbk_t func, void *data, fd_t *fd,               dict_t *dict, int32_t flags, dict_t *xdata);  void -ec_stat(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -        fop_stat_cbk_t func, void *data, loc_t *loc, dict_t *xdata); +ec_stat(call_frame_t *frame, xlator_t *this, uintptr_t target, +        uint32_t fop_flags, fop_stat_cbk_t func, void *data, loc_t *loc, +        dict_t *xdata);  void -ec_fstat(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -         fop_fstat_cbk_t func, void *data, fd_t *fd, dict_t *xdata); +ec_fstat(call_frame_t *frame, xlator_t *this, uintptr_t target, +         uint32_t fop_flags, fop_fstat_cbk_t func, void *data, fd_t *fd, +         dict_t *xdata);  void  ec_statfs(call_frame_t *frame, xlator_t *this, uintptr_t target, -          int32_t minimum, fop_statfs_cbk_t func, void *data, loc_t *loc, +          uint32_t fop_flags, fop_statfs_cbk_t func, void *data, loc_t *loc,            dict_t *xdata);  void  ec_symlink(call_frame_t *frame, xlator_t *this, uintptr_t target, -           int32_t minimum, fop_symlink_cbk_t func, void *data, +           uint32_t fop_flags, fop_symlink_cbk_t func, void *data,             const char *linkname, loc_t *loc, mode_t umask, dict_t *xdata);  void  ec_fallocate(call_frame_t *frame, xlator_t *this, uintptr_t target, -             int32_t minimum, fop_fallocate_cbk_t func, void *data, fd_t *fd, +             uint32_t fop_flags, fop_fallocate_cbk_t func, void *data, fd_t *fd,               int32_t mode, off_t offset, size_t len, dict_t *xdata);  void  ec_discard(call_frame_t *frame, xlator_t *this, uintptr_t target, -           int32_t minimum, fop_discard_cbk_t func, void *data, fd_t *fd, +           uint32_t fop_flags, fop_discard_cbk_t func, void *data, fd_t *fd,             off_t offset, size_t len, dict_t *xdata);  void  ec_truncate(call_frame_t *frame, xlator_t *this, uintptr_t target, -            int32_t minimum, fop_truncate_cbk_t func, void *data, loc_t *loc, +            uint32_t fop_flags, fop_truncate_cbk_t func, void *data, loc_t *loc,              off_t offset, dict_t *xdata);  void  ec_ftruncate(call_frame_t *frame, xlator_t *this, uintptr_t target, -             int32_t minimum, fop_ftruncate_cbk_t func, void *data, fd_t *fd, +             uint32_t fop_flags, fop_ftruncate_cbk_t func, void *data, fd_t *fd,               off_t offset, dict_t *xdata);  void  ec_unlink(call_frame_t *frame, xlator_t *this, uintptr_t target, -          int32_t minimum, fop_unlink_cbk_t func, void *data, loc_t *loc, +          uint32_t fop_flags, fop_unlink_cbk_t func, void *data, loc_t *loc,            int xflags, dict_t *xdata);  void  ec_writev(call_frame_t *frame, xlator_t *this, uintptr_t target, -          int32_t minimum, fop_writev_cbk_t func, void *data, fd_t *fd, +          uint32_t fop_flags, fop_writev_cbk_t func, void *data, fd_t *fd,            struct iovec *vector, int32_t count, off_t offset, uint32_t flags,            struct iobref *iobref, dict_t *xdata);  void  ec_xattrop(call_frame_t *frame, xlator_t *this, uintptr_t target, -           int32_t minimum, fop_xattrop_cbk_t func, void *data, loc_t *loc, +           uint32_t fop_flags, fop_xattrop_cbk_t func, void *data, loc_t *loc,             gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata);  void  ec_fxattrop(call_frame_t *frame, xlator_t *this, uintptr_t target, -            int32_t minimum, fop_fxattrop_cbk_t func, void *data, fd_t *fd, +            uint32_t fop_flags, fop_fxattrop_cbk_t func, void *data, fd_t *fd,              gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata);  void -ec_seek(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -        fop_seek_cbk_t func, void *data, fd_t *fd, off_t offset, -        gf_seek_what_t what, dict_t *xdata); +ec_seek(call_frame_t *frame, xlator_t *this, uintptr_t target, +        uint32_t fop_flags, fop_seek_cbk_t func, void *data, fd_t *fd, +        off_t offset, gf_seek_what_t what, dict_t *xdata);  void -ec_ipc(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -       fop_ipc_cbk_t func, void *data, int32_t op, dict_t *xdata); +ec_ipc(call_frame_t *frame, xlator_t *this, uintptr_t target, +       uint32_t fop_flags, fop_ipc_cbk_t func, void *data, int32_t op, +       dict_t *xdata);  #endif /* __EC_FOPS_H__ */ diff --git a/xlators/cluster/ec/src/ec-generic.c b/xlators/cluster/ec/src/ec-generic.c index 175e88ac94b..acc16b5d80f 100644 --- a/xlators/cluster/ec/src/ec-generic.c +++ b/xlators/cluster/ec/src/ec-generic.c @@ -151,8 +151,9 @@ ec_manager_flush(ec_fop_data_t *fop, int32_t state)  }  void -ec_flush(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -         fop_flush_cbk_t func, void *data, fd_t *fd, dict_t *xdata) +ec_flush(call_frame_t *frame, xlator_t *this, uintptr_t target, +         uint32_t fop_flags, fop_flush_cbk_t func, void *data, fd_t *fd, +         dict_t *xdata)  {      ec_cbk_t callback = {.flush = func};      ec_fop_data_t *fop = NULL; @@ -164,7 +165,7 @@ ec_flush(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_FLUSH, 0, target, minimum, +    fop = ec_fop_data_allocate(frame, this, GF_FOP_FLUSH, 0, target, fop_flags,                                 ec_wind_flush, ec_manager_flush, callback, data);      if (fop == NULL) {          goto out; @@ -366,9 +367,9 @@ ec_manager_fsync(ec_fop_data_t *fop, int32_t state)  }  void -ec_fsync(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -         fop_fsync_cbk_t func, void *data, fd_t *fd, int32_t datasync, -         dict_t *xdata) +ec_fsync(call_frame_t *frame, xlator_t *this, uintptr_t target, +         uint32_t fop_flags, fop_fsync_cbk_t func, void *data, fd_t *fd, +         int32_t datasync, dict_t *xdata)  {      ec_cbk_t callback = {.fsync = func};      ec_fop_data_t *fop = NULL; @@ -380,7 +381,7 @@ ec_fsync(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_FSYNC, 0, target, minimum, +    fop = ec_fop_data_allocate(frame, this, GF_FOP_FSYNC, 0, target, fop_flags,                                 ec_wind_fsync, ec_manager_fsync, callback, data);      if (fop == NULL) {          goto out; @@ -553,7 +554,7 @@ ec_manager_fsyncdir(ec_fop_data_t *fop, int32_t state)  void  ec_fsyncdir(call_frame_t *frame, xlator_t *this, uintptr_t target, -            int32_t minimum, fop_fsyncdir_cbk_t func, void *data, fd_t *fd, +            uint32_t fop_flags, fop_fsyncdir_cbk_t func, void *data, fd_t *fd,              int32_t datasync, dict_t *xdata)  {      ec_cbk_t callback = {.fsyncdir = func}; @@ -566,9 +567,9 @@ ec_fsyncdir(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_FSYNCDIR, 0, target, minimum, -                               ec_wind_fsyncdir, ec_manager_fsyncdir, callback, -                               data); +    fop = ec_fop_data_allocate(frame, this, GF_FOP_FSYNCDIR, 0, target, +                               fop_flags, ec_wind_fsyncdir, ec_manager_fsyncdir, +                               callback, data);      if (fop == NULL) {          goto out;      } @@ -848,7 +849,7 @@ ec_manager_lookup(ec_fop_data_t *fop, int32_t state)  void  ec_lookup(call_frame_t *frame, xlator_t *this, uintptr_t target, -          int32_t minimum, fop_lookup_cbk_t func, void *data, loc_t *loc, +          uint32_t fop_flags, fop_lookup_cbk_t func, void *data, loc_t *loc,            dict_t *xdata)  {      ec_cbk_t callback = {.lookup = func}; @@ -862,7 +863,7 @@ ec_lookup(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, this->private, out);      fop = ec_fop_data_allocate(frame, this, GF_FOP_LOOKUP, EC_FLAG_LOCK_SHARED, -                               target, minimum, ec_wind_lookup, +                               target, fop_flags, ec_wind_lookup,                                 ec_manager_lookup, callback, data);      if (fop == NULL) {          goto out; @@ -1033,7 +1034,7 @@ ec_manager_statfs(ec_fop_data_t *fop, int32_t state)  void  ec_statfs(call_frame_t *frame, xlator_t *this, uintptr_t target, -          int32_t minimum, fop_statfs_cbk_t func, void *data, loc_t *loc, +          uint32_t fop_flags, fop_statfs_cbk_t func, void *data, loc_t *loc,            dict_t *xdata)  {      ec_cbk_t callback = {.statfs = func}; @@ -1047,7 +1048,7 @@ ec_statfs(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, this->private, out);      fop = ec_fop_data_allocate(frame, this, GF_FOP_STATFS, EC_FLAG_LOCK_SHARED, -                               target, minimum, ec_wind_statfs, +                               target, fop_flags, ec_wind_statfs,                                 ec_manager_statfs, callback, data);      if (fop == NULL) {          goto out; @@ -1270,7 +1271,7 @@ ec_manager_xattrop(ec_fop_data_t *fop, int32_t state)  void  ec_xattrop(call_frame_t *frame, xlator_t *this, uintptr_t target, -           int32_t minimum, fop_xattrop_cbk_t func, void *data, loc_t *loc, +           uint32_t fop_flags, fop_xattrop_cbk_t func, void *data, loc_t *loc,             gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata)  {      ec_cbk_t callback = {.xattrop = func}; @@ -1283,9 +1284,9 @@ ec_xattrop(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_XATTROP, 0, target, minimum, -                               ec_wind_xattrop, ec_manager_xattrop, callback, -                               data); +    fop = ec_fop_data_allocate(frame, this, GF_FOP_XATTROP, 0, target, +                               fop_flags, ec_wind_xattrop, ec_manager_xattrop, +                               callback, data);      if (fop == NULL) {          goto out;      } @@ -1343,7 +1344,7 @@ ec_wind_fxattrop(ec_t *ec, ec_fop_data_t *fop, int32_t idx)  void  ec_fxattrop(call_frame_t *frame, xlator_t *this, uintptr_t target, -            int32_t minimum, fop_fxattrop_cbk_t func, void *data, fd_t *fd, +            uint32_t fop_flags, fop_fxattrop_cbk_t func, void *data, fd_t *fd,              gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata)  {      ec_cbk_t callback = {.fxattrop = func}; @@ -1356,9 +1357,9 @@ ec_fxattrop(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_FXATTROP, 0, target, minimum, -                               ec_wind_fxattrop, ec_manager_xattrop, callback, -                               data); +    fop = ec_fop_data_allocate(frame, this, GF_FOP_FXATTROP, 0, target, +                               fop_flags, ec_wind_fxattrop, ec_manager_xattrop, +                               callback, data);      if (fop == NULL) {          goto out;      } @@ -1507,8 +1508,9 @@ ec_manager_ipc(ec_fop_data_t *fop, int32_t state)  }  void -ec_ipc(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -       fop_ipc_cbk_t func, void *data, int32_t op, dict_t *xdata) +ec_ipc(call_frame_t *frame, xlator_t *this, uintptr_t target, +       uint32_t fop_flags, fop_ipc_cbk_t func, void *data, int32_t op, +       dict_t *xdata)  {      ec_cbk_t callback = {.ipc = func};      ec_fop_data_t *fop = NULL; @@ -1520,7 +1522,7 @@ ec_ipc(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_IPC, 0, target, minimum, +    fop = ec_fop_data_allocate(frame, this, GF_FOP_IPC, 0, target, fop_flags,                                 ec_wind_ipc, ec_manager_ipc, callback, data);      if (fop == NULL) {          goto out; diff --git a/xlators/cluster/ec/src/ec-heal.c b/xlators/cluster/ec/src/ec-heal.c index 9321a0088a6..2fa1f11c5fa 100644 --- a/xlators/cluster/ec/src/ec-heal.c +++ b/xlators/cluster/ec/src/ec-heal.c @@ -367,16 +367,16 @@ ec_heal_data_block(ec_heal_t *heal)  /* FOP: fheal */  void -ec_fheal(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -         fop_fheal_cbk_t func, void *data, fd_t *fd, int32_t partial, -         dict_t *xdata) +ec_fheal(call_frame_t *frame, xlator_t *this, uintptr_t target, +         uint32_t fop_flags, fop_fheal_cbk_t func, void *data, fd_t *fd, +         int32_t partial, dict_t *xdata)  {      ec_fd_t *ctx = ec_fd_get(fd, this);      if (ctx != NULL) {          gf_msg_trace("ec", 0, "FHEAL ctx: flags=%X, open=%" PRIXPTR, ctx->flags,                       ctx->open); -        ec_heal(frame, this, target, minimum, func, data, &ctx->loc, partial, +        ec_heal(frame, this, target, fop_flags, func, data, &ctx->loc, partial,                  xdata);      }  } @@ -1975,7 +1975,7 @@ ec_manager_heal_block(ec_fop_data_t *fop, int32_t state)  /*Takes lock */  void  ec_heal_block(call_frame_t *frame, xlator_t *this, uintptr_t target, -              int32_t minimum, fop_heal_cbk_t func, ec_heal_t *heal) +              uint32_t fop_flags, fop_heal_cbk_t func, ec_heal_t *heal)  {      ec_cbk_t callback = {.heal = func};      ec_fop_data_t *fop = NULL; @@ -1986,7 +1986,7 @@ ec_heal_block(call_frame_t *frame, xlator_t *this, uintptr_t target,      VALIDATE_OR_GOTO(this, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, EC_FOP_HEAL, 0, target, minimum, +    fop = ec_fop_data_allocate(frame, this, EC_FOP_HEAL, 0, target, fop_flags,                                 NULL, ec_manager_heal_block, callback, heal);      if (fop == NULL)          goto out; @@ -2763,9 +2763,9 @@ ec_heal_throttle(xlator_t *this, ec_fop_data_t *fop)  }  void -ec_heal(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -        fop_heal_cbk_t func, void *data, loc_t *loc, int32_t partial, -        dict_t *xdata) +ec_heal(call_frame_t *frame, xlator_t *this, uintptr_t target, +        uint32_t fop_flags, fop_heal_cbk_t func, void *data, loc_t *loc, +        int32_t partial, dict_t *xdata)  {      ec_cbk_t callback = {.heal = func};      ec_fop_data_t *fop = NULL; @@ -2781,7 +2781,7 @@ ec_heal(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum,      if (frame && frame->local)          goto fail; -    fop = ec_fop_data_allocate(frame, this, EC_FOP_HEAL, 0, target, minimum, +    fop = ec_fop_data_allocate(frame, this, EC_FOP_HEAL, 0, target, fop_flags,                                 NULL, NULL, callback, data);      err = ENOMEM; diff --git a/xlators/cluster/ec/src/ec-inode-read.c b/xlators/cluster/ec/src/ec-inode-read.c index 55e59345ab0..f87a94a1cf7 100644 --- a/xlators/cluster/ec/src/ec-inode-read.c +++ b/xlators/cluster/ec/src/ec-inode-read.c @@ -135,7 +135,7 @@ ec_manager_access(ec_fop_data_t *fop, int32_t state)  void  ec_access(call_frame_t *frame, xlator_t *this, uintptr_t target, -          int32_t minimum, fop_access_cbk_t func, void *data, loc_t *loc, +          uint32_t fop_flags, fop_access_cbk_t func, void *data, loc_t *loc,            int32_t mask, dict_t *xdata)  {      ec_cbk_t callback = {.access = func}; @@ -149,7 +149,7 @@ ec_access(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, this->private, out);      fop = ec_fop_data_allocate(frame, this, GF_FOP_ACCESS, EC_FLAG_LOCK_SHARED, -                               target, minimum, ec_wind_access, +                               target, fop_flags, ec_wind_access,                                 ec_manager_access, callback, data);      if (fop == NULL) {          goto out; @@ -446,7 +446,7 @@ out:  void  ec_getxattr(call_frame_t *frame, xlator_t *this, uintptr_t target, -            int32_t minimum, fop_getxattr_cbk_t func, void *data, loc_t *loc, +            uint32_t fop_flags, fop_getxattr_cbk_t func, void *data, loc_t *loc,              const char *name, dict_t *xdata)  {      ec_cbk_t callback = {.getxattr = func}; @@ -468,7 +468,7 @@ ec_getxattr(call_frame_t *frame, xlator_t *this, uintptr_t target,      }      fop = ec_fop_data_allocate( -        frame, this, GF_FOP_GETXATTR, EC_FLAG_LOCK_SHARED, target, minimum, +        frame, this, GF_FOP_GETXATTR, EC_FLAG_LOCK_SHARED, target, fop_flags,          ec_wind_getxattr, ec_manager_getxattr, callback, data);      if (fop == NULL) {          goto out; @@ -588,7 +588,7 @@ ec_wind_fgetxattr(ec_t *ec, ec_fop_data_t *fop, int32_t idx)  void  ec_fgetxattr(call_frame_t *frame, xlator_t *this, uintptr_t target, -             int32_t minimum, fop_fgetxattr_cbk_t func, void *data, fd_t *fd, +             uint32_t fop_flags, fop_fgetxattr_cbk_t func, void *data, fd_t *fd,               const char *name, dict_t *xdata)  {      ec_cbk_t callback = {.fgetxattr = func}; @@ -602,7 +602,7 @@ ec_fgetxattr(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, this->private, out);      fop = ec_fop_data_allocate( -        frame, this, GF_FOP_FGETXATTR, EC_FLAG_LOCK_SHARED, target, minimum, +        frame, this, GF_FOP_FGETXATTR, EC_FLAG_LOCK_SHARED, target, fop_flags,          ec_wind_fgetxattr, ec_manager_getxattr, callback, data);      if (fop == NULL) {          goto out; @@ -869,9 +869,9 @@ ec_manager_open(ec_fop_data_t *fop, int32_t state)  }  void -ec_open(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -        fop_open_cbk_t func, void *data, loc_t *loc, int32_t flags, fd_t *fd, -        dict_t *xdata) +ec_open(call_frame_t *frame, xlator_t *this, uintptr_t target, +        uint32_t fop_flags, fop_open_cbk_t func, void *data, loc_t *loc, +        int32_t flags, fd_t *fd, dict_t *xdata)  {      ec_cbk_t callback = {.open = func};      ec_fop_data_t *fop = NULL; @@ -884,7 +884,7 @@ ec_open(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum,      GF_VALIDATE_OR_GOTO(this->name, this->private, out);      fop = ec_fop_data_allocate(frame, this, GF_FOP_OPEN, EC_FLAG_LOCK_SHARED, -                               target, minimum, ec_wind_open, ec_manager_open, +                               target, fop_flags, ec_wind_open, ec_manager_open,                                 callback, data);      if (fop == NULL) {          goto out; @@ -1071,7 +1071,7 @@ ec_manager_readlink(ec_fop_data_t *fop, int32_t state)  void  ec_readlink(call_frame_t *frame, xlator_t *this, uintptr_t target, -            int32_t minimum, fop_readlink_cbk_t func, void *data, loc_t *loc, +            uint32_t fop_flags, fop_readlink_cbk_t func, void *data, loc_t *loc,              size_t size, dict_t *xdata)  {      ec_cbk_t callback = {.readlink = func}; @@ -1085,7 +1085,7 @@ ec_readlink(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, this->private, out);      fop = ec_fop_data_allocate( -        frame, this, GF_FOP_READLINK, EC_FLAG_LOCK_SHARED, target, minimum, +        frame, this, GF_FOP_READLINK, EC_FLAG_LOCK_SHARED, target, fop_flags,          ec_wind_readlink, ec_manager_readlink, callback, data);      if (fop == NULL) {          goto out; @@ -1417,9 +1417,9 @@ ec_manager_readv(ec_fop_data_t *fop, int32_t state)  }  void -ec_readv(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -         fop_readv_cbk_t func, void *data, fd_t *fd, size_t size, off_t offset, -         uint32_t flags, dict_t *xdata) +ec_readv(call_frame_t *frame, xlator_t *this, uintptr_t target, +         uint32_t fop_flags, fop_readv_cbk_t func, void *data, fd_t *fd, +         size_t size, off_t offset, uint32_t flags, dict_t *xdata)  {      ec_cbk_t callback = {.readv = func};      ec_fop_data_t *fop = NULL; @@ -1432,8 +1432,8 @@ ec_readv(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum,      GF_VALIDATE_OR_GOTO(this->name, this->private, out);      fop = ec_fop_data_allocate(frame, this, GF_FOP_READ, EC_FLAG_LOCK_SHARED, -                               target, minimum, ec_wind_readv, ec_manager_readv, -                               callback, data); +                               target, fop_flags, ec_wind_readv, +                               ec_manager_readv, callback, data);      if (fop == NULL) {          goto out;      } @@ -1637,9 +1637,9 @@ ec_manager_seek(ec_fop_data_t *fop, int32_t state)  }  void -ec_seek(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -        fop_seek_cbk_t func, void *data, fd_t *fd, off_t offset, -        gf_seek_what_t what, dict_t *xdata) +ec_seek(call_frame_t *frame, xlator_t *this, uintptr_t target, +        uint32_t fop_flags, fop_seek_cbk_t func, void *data, fd_t *fd, +        off_t offset, gf_seek_what_t what, dict_t *xdata)  {      ec_cbk_t callback = {.seek = func};      ec_fop_data_t *fop = NULL; @@ -1652,7 +1652,7 @@ ec_seek(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum,      GF_VALIDATE_OR_GOTO(this->name, this->private, out);      fop = ec_fop_data_allocate(frame, this, GF_FOP_SEEK, EC_FLAG_LOCK_SHARED, -                               target, minimum, ec_wind_seek, ec_manager_seek, +                               target, fop_flags, ec_wind_seek, ec_manager_seek,                                 callback, data);      if (fop == NULL) {          goto out; @@ -1855,8 +1855,9 @@ ec_manager_stat(ec_fop_data_t *fop, int32_t state)  }  void -ec_stat(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -        fop_stat_cbk_t func, void *data, loc_t *loc, dict_t *xdata) +ec_stat(call_frame_t *frame, xlator_t *this, uintptr_t target, +        uint32_t fop_flags, fop_stat_cbk_t func, void *data, loc_t *loc, +        dict_t *xdata)  {      ec_cbk_t callback = {.stat = func};      ec_fop_data_t *fop = NULL; @@ -1869,7 +1870,7 @@ ec_stat(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum,      GF_VALIDATE_OR_GOTO(this->name, this->private, out);      fop = ec_fop_data_allocate(frame, this, GF_FOP_STAT, EC_FLAG_LOCK_SHARED, -                               target, minimum, ec_wind_stat, ec_manager_stat, +                               target, fop_flags, ec_wind_stat, ec_manager_stat,                                 callback, data);      if (fop == NULL) {          goto out; @@ -1965,8 +1966,9 @@ ec_wind_fstat(ec_t *ec, ec_fop_data_t *fop, int32_t idx)  }  void -ec_fstat(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, -         fop_fstat_cbk_t func, void *data, fd_t *fd, dict_t *xdata) +ec_fstat(call_frame_t *frame, xlator_t *this, uintptr_t target, +         uint32_t fop_flags, fop_fstat_cbk_t func, void *data, fd_t *fd, +         dict_t *xdata)  {      ec_cbk_t callback = {.fstat = func};      ec_fop_data_t *fop = NULL; @@ -1979,8 +1981,8 @@ ec_fstat(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum,      GF_VALIDATE_OR_GOTO(this->name, this->private, out);      fop = ec_fop_data_allocate(frame, this, GF_FOP_FSTAT, EC_FLAG_LOCK_SHARED, -                               target, minimum, ec_wind_fstat, ec_manager_stat, -                               callback, data); +                               target, fop_flags, ec_wind_fstat, +                               ec_manager_stat, callback, data);      if (fop == NULL) {          goto out;      } diff --git a/xlators/cluster/ec/src/ec-inode-write.c b/xlators/cluster/ec/src/ec-inode-write.c index ef8aedb37a8..ea5514065ea 100644 --- a/xlators/cluster/ec/src/ec-inode-write.c +++ b/xlators/cluster/ec/src/ec-inode-write.c @@ -281,7 +281,7 @@ ec_manager_xattr(ec_fop_data_t *fop, int32_t state)  void  ec_removexattr(call_frame_t *frame, xlator_t *this, uintptr_t target, -               int32_t minimum, fop_removexattr_cbk_t func, void *data, +               uint32_t fop_flags, fop_removexattr_cbk_t func, void *data,                 loc_t *loc, const char *name, dict_t *xdata)  {      ec_cbk_t callback = {.removexattr = func}; @@ -295,7 +295,7 @@ ec_removexattr(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, this->private, out);      fop = ec_fop_data_allocate(frame, this, GF_FOP_REMOVEXATTR, 0, target, -                               minimum, ec_wind_removexattr, ec_manager_xattr, +                               fop_flags, ec_wind_removexattr, ec_manager_xattr,                                 callback, data);      if (fop == NULL) {          goto out; @@ -361,7 +361,7 @@ ec_wind_fremovexattr(ec_t *ec, ec_fop_data_t *fop, int32_t idx)  void  ec_fremovexattr(call_frame_t *frame, xlator_t *this, uintptr_t target, -                int32_t minimum, fop_fremovexattr_cbk_t func, void *data, +                uint32_t fop_flags, fop_fremovexattr_cbk_t func, void *data,                  fd_t *fd, const char *name, dict_t *xdata)  {      ec_cbk_t callback = {.fremovexattr = func}; @@ -375,8 +375,8 @@ ec_fremovexattr(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, this->private, out);      fop = ec_fop_data_allocate(frame, this, GF_FOP_FREMOVEXATTR, 0, target, -                               minimum, ec_wind_fremovexattr, ec_manager_xattr, -                               callback, data); +                               fop_flags, ec_wind_fremovexattr, +                               ec_manager_xattr, callback, data);      if (fop == NULL) {          goto out;      } @@ -550,7 +550,7 @@ ec_manager_setattr(ec_fop_data_t *fop, int32_t state)  void  ec_setattr(call_frame_t *frame, xlator_t *this, uintptr_t target, -           int32_t minimum, fop_setattr_cbk_t func, void *data, loc_t *loc, +           uint32_t fop_flags, fop_setattr_cbk_t func, void *data, loc_t *loc,             struct iatt *stbuf, int32_t valid, dict_t *xdata)  {      ec_cbk_t callback = {.setattr = func}; @@ -563,9 +563,9 @@ ec_setattr(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_SETATTR, 0, target, minimum, -                               ec_wind_setattr, ec_manager_setattr, callback, -                               data); +    fop = ec_fop_data_allocate(frame, this, GF_FOP_SETATTR, 0, target, +                               fop_flags, ec_wind_setattr, ec_manager_setattr, +                               callback, data);      if (fop == NULL) {          goto out;      } @@ -627,7 +627,7 @@ ec_wind_fsetattr(ec_t *ec, ec_fop_data_t *fop, int32_t idx)  void  ec_fsetattr(call_frame_t *frame, xlator_t *this, uintptr_t target, -            int32_t minimum, fop_fsetattr_cbk_t func, void *data, fd_t *fd, +            uint32_t fop_flags, fop_fsetattr_cbk_t func, void *data, fd_t *fd,              struct iatt *stbuf, int32_t valid, dict_t *xdata)  {      ec_cbk_t callback = {.fsetattr = func}; @@ -640,9 +640,9 @@ ec_fsetattr(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_FSETATTR, 0, target, minimum, -                               ec_wind_fsetattr, ec_manager_setattr, callback, -                               data); +    fop = ec_fop_data_allocate(frame, this, GF_FOP_FSETATTR, 0, target, +                               fop_flags, ec_wind_fsetattr, ec_manager_setattr, +                               callback, data);      if (fop == NULL) {          goto out;      } @@ -707,7 +707,7 @@ ec_wind_setxattr(ec_t *ec, ec_fop_data_t *fop, int32_t idx)  void  ec_setxattr(call_frame_t *frame, xlator_t *this, uintptr_t target, -            int32_t minimum, fop_setxattr_cbk_t func, void *data, loc_t *loc, +            uint32_t fop_flags, fop_setxattr_cbk_t func, void *data, loc_t *loc,              dict_t *dict, int32_t flags, dict_t *xdata)  {      ec_cbk_t callback = {.setxattr = func}; @@ -720,9 +720,9 @@ ec_setxattr(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_SETXATTR, 0, target, minimum, -                               ec_wind_setxattr, ec_manager_xattr, callback, -                               data); +    fop = ec_fop_data_allocate(frame, this, GF_FOP_SETXATTR, 0, target, +                               fop_flags, ec_wind_setxattr, ec_manager_xattr, +                               callback, data);      if (fop == NULL) {          goto out;      } @@ -825,7 +825,7 @@ ec_wind_fsetxattr(ec_t *ec, ec_fop_data_t *fop, int32_t idx)  void  ec_fsetxattr(call_frame_t *frame, xlator_t *this, uintptr_t target, -             int32_t minimum, fop_fsetxattr_cbk_t func, void *data, fd_t *fd, +             uint32_t fop_flags, fop_fsetxattr_cbk_t func, void *data, fd_t *fd,               dict_t *dict, int32_t flags, dict_t *xdata)  {      ec_cbk_t callback = {.fsetxattr = func}; @@ -839,7 +839,7 @@ ec_fsetxattr(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, this->private, out);      fop = ec_fop_data_allocate(frame, this, GF_FOP_FSETXATTR, 0, target, -                               minimum, ec_wind_fsetxattr, ec_manager_xattr, +                               fop_flags, ec_wind_fsetxattr, ec_manager_xattr,                                 callback, data);      if (fop == NULL) {          goto out; @@ -1035,7 +1035,7 @@ ec_manager_fallocate(ec_fop_data_t *fop, int32_t state)  void  ec_fallocate(call_frame_t *frame, xlator_t *this, uintptr_t target, -             int32_t minimum, fop_fallocate_cbk_t func, void *data, fd_t *fd, +             uint32_t fop_flags, fop_fallocate_cbk_t func, void *data, fd_t *fd,               int32_t mode, off_t offset, size_t len, dict_t *xdata)  {      ec_cbk_t callback = {.fallocate = func}; @@ -1049,8 +1049,8 @@ ec_fallocate(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, this->private, out);      fop = ec_fop_data_allocate(frame, this, GF_FOP_FALLOCATE, 0, target, -                               minimum, ec_wind_fallocate, ec_manager_fallocate, -                               callback, data); +                               fop_flags, ec_wind_fallocate, +                               ec_manager_fallocate, callback, data);      if (fop == NULL) {          goto out;      } @@ -1209,8 +1209,8 @@ ec_manager_discard(ec_fop_data_t *fop, int32_t state)                  ec_dispatch_all(fop);                  return EC_STATE_DELAYED_START;              } else { -                /*Assume discard to have succeeded on mask*/ -                fop->good = fop->mask; +                /* Assume discard to have succeeded on all bricks */ +                ec_succeed_all(fop);              }              /* Fall through */ @@ -1289,7 +1289,7 @@ ec_manager_discard(ec_fop_data_t *fop, int32_t state)  void  ec_discard(call_frame_t *frame, xlator_t *this, uintptr_t target, -           int32_t minimum, fop_discard_cbk_t func, void *data, fd_t *fd, +           uint32_t fop_flags, fop_discard_cbk_t func, void *data, fd_t *fd,             off_t offset, size_t len, dict_t *xdata)  {      ec_cbk_t callback = {.discard = func}; @@ -1302,9 +1302,9 @@ ec_discard(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_DISCARD, 0, target, minimum, -                               ec_wind_discard, ec_manager_discard, callback, -                               data); +    fop = ec_fop_data_allocate(frame, this, GF_FOP_DISCARD, 0, target, +                               fop_flags, ec_wind_discard, ec_manager_discard, +                               callback, data);      if (fop == NULL) {          goto out;      } @@ -1534,7 +1534,7 @@ ec_manager_truncate(ec_fop_data_t *fop, int32_t state)  void  ec_truncate(call_frame_t *frame, xlator_t *this, uintptr_t target, -            int32_t minimum, fop_truncate_cbk_t func, void *data, loc_t *loc, +            uint32_t fop_flags, fop_truncate_cbk_t func, void *data, loc_t *loc,              off_t offset, dict_t *xdata)  {      ec_cbk_t callback = {.truncate = func}; @@ -1547,9 +1547,9 @@ ec_truncate(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_TRUNCATE, 0, target, minimum, -                               ec_wind_truncate, ec_manager_truncate, callback, -                               data); +    fop = ec_fop_data_allocate(frame, this, GF_FOP_TRUNCATE, 0, target, +                               fop_flags, ec_wind_truncate, ec_manager_truncate, +                               callback, data);      if (fop == NULL) {          goto out;      } @@ -1608,7 +1608,7 @@ ec_wind_ftruncate(ec_t *ec, ec_fop_data_t *fop, int32_t idx)  void  ec_ftruncate(call_frame_t *frame, xlator_t *this, uintptr_t target, -             int32_t minimum, fop_ftruncate_cbk_t func, void *data, fd_t *fd, +             uint32_t fop_flags, fop_ftruncate_cbk_t func, void *data, fd_t *fd,               off_t offset, dict_t *xdata)  {      ec_cbk_t callback = {.ftruncate = func}; @@ -1622,8 +1622,8 @@ ec_ftruncate(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, this->private, out);      fop = ec_fop_data_allocate(frame, this, GF_FOP_FTRUNCATE, 0, target, -                               minimum, ec_wind_ftruncate, ec_manager_truncate, -                               callback, data); +                               fop_flags, ec_wind_ftruncate, +                               ec_manager_truncate, callback, data);      if (fop == NULL) {          goto out;      } @@ -2266,7 +2266,7 @@ ec_manager_writev(ec_fop_data_t *fop, int32_t state)  void  ec_writev(call_frame_t *frame, xlator_t *this, uintptr_t target, -          int32_t minimum, fop_writev_cbk_t func, void *data, fd_t *fd, +          uint32_t fop_flags, fop_writev_cbk_t func, void *data, fd_t *fd,            struct iovec *vector, int32_t count, off_t offset, uint32_t flags,            struct iobref *iobref, dict_t *xdata)  { @@ -2280,7 +2280,7 @@ ec_writev(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_WRITE, 0, target, minimum, +    fop = ec_fop_data_allocate(frame, this, GF_FOP_WRITE, 0, target, fop_flags,                                 ec_wind_writev, ec_manager_writev, callback,                                 data);      if (fop == NULL) { diff --git a/xlators/cluster/ec/src/ec-locks.c b/xlators/cluster/ec/src/ec-locks.c index f978af0ac67..ffcac074c4d 100644 --- a/xlators/cluster/ec/src/ec-locks.c +++ b/xlators/cluster/ec/src/ec-locks.c @@ -275,7 +275,7 @@ ec_manager_entrylk(ec_fop_data_t *fop, int32_t state)  void  ec_entrylk(call_frame_t *frame, xlator_t *this, uintptr_t target, -           int32_t minimum, fop_entrylk_cbk_t func, void *data, +           uint32_t fop_flags, fop_entrylk_cbk_t func, void *data,             const char *volume, loc_t *loc, const char *basename,             entrylk_cmd cmd, entrylk_type type, dict_t *xdata)  { @@ -288,9 +288,9 @@ ec_entrylk(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_ENTRYLK, 0, target, minimum, -                               ec_wind_entrylk, ec_manager_entrylk, callback, -                               data); +    fop = ec_fop_data_allocate(frame, this, GF_FOP_ENTRYLK, 0, target, +                               fop_flags, ec_wind_entrylk, ec_manager_entrylk, +                               callback, data);      if (fop == NULL) {          goto out;      } @@ -403,7 +403,7 @@ ec_wind_fentrylk(ec_t *ec, ec_fop_data_t *fop, int32_t idx)  void  ec_fentrylk(call_frame_t *frame, xlator_t *this, uintptr_t target, -            int32_t minimum, fop_fentrylk_cbk_t func, void *data, +            uint32_t fop_flags, fop_fentrylk_cbk_t func, void *data,              const char *volume, fd_t *fd, const char *basename, entrylk_cmd cmd,              entrylk_type type, dict_t *xdata)  { @@ -416,9 +416,9 @@ ec_fentrylk(call_frame_t *frame, xlator_t *this, uintptr_t target,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_FENTRYLK, 0, target, minimum, -                               ec_wind_fentrylk, ec_manager_entrylk, callback, -                               data); +    fop = ec_fop_data_allocate(frame, this, GF_FOP_FENTRYLK, 0, target, +                               fop_flags, ec_wind_fentrylk, ec_manager_entrylk, +                               callback, data);      if (fop == NULL) {          goto out;      } @@ -650,7 +650,7 @@ ec_manager_inodelk(ec_fop_data_t *fop, int32_t state)  void  ec_inodelk(call_frame_t *frame, xlator_t *this, gf_lkowner_t *owner, -           uintptr_t target, int32_t minimum, fop_inodelk_cbk_t func, +           uintptr_t target, uint32_t fop_flags, fop_inodelk_cbk_t func,             void *data, const char *volume, loc_t *loc, int32_t cmd,             struct gf_flock *flock, dict_t *xdata)  { @@ -664,9 +664,9 @@ ec_inodelk(call_frame_t *frame, xlator_t *this, gf_lkowner_t *owner,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_INODELK, 0, target, minimum, -                               ec_wind_inodelk, ec_manager_inodelk, callback, -                               data); +    fop = ec_fop_data_allocate(frame, this, GF_FOP_INODELK, 0, target, +                               fop_flags, ec_wind_inodelk, ec_manager_inodelk, +                               callback, data);      if (fop == NULL) {          goto out;      } @@ -782,7 +782,7 @@ ec_wind_finodelk(ec_t *ec, ec_fop_data_t *fop, int32_t idx)  void  ec_finodelk(call_frame_t *frame, xlator_t *this, gf_lkowner_t *owner, -            uintptr_t target, int32_t minimum, fop_finodelk_cbk_t func, +            uintptr_t target, uint32_t fop_flags, fop_finodelk_cbk_t func,              void *data, const char *volume, fd_t *fd, int32_t cmd,              struct gf_flock *flock, dict_t *xdata)  { @@ -796,9 +796,9 @@ ec_finodelk(call_frame_t *frame, xlator_t *this, gf_lkowner_t *owner,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_FINODELK, 0, target, minimum, -                               ec_wind_finodelk, ec_manager_inodelk, callback, -                               data); +    fop = ec_fop_data_allocate(frame, this, GF_FOP_FINODELK, 0, target, +                               fop_flags, ec_wind_finodelk, ec_manager_inodelk, +                               callback, data);      if (fop == NULL) {          goto out;      } @@ -1032,7 +1032,7 @@ ec_manager_lk(ec_fop_data_t *fop, int32_t state)  }  void -ec_lk(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum, +ec_lk(call_frame_t *frame, xlator_t *this, uintptr_t target, uint32_t fop_flags,        fop_lk_cbk_t func, void *data, fd_t *fd, int32_t cmd,        struct gf_flock *flock, dict_t *xdata)  { @@ -1045,7 +1045,7 @@ ec_lk(call_frame_t *frame, xlator_t *this, uintptr_t target, int32_t minimum,      GF_VALIDATE_OR_GOTO(this->name, frame, out);      GF_VALIDATE_OR_GOTO(this->name, this->private, out); -    fop = ec_fop_data_allocate(frame, this, GF_FOP_LK, 0, target, minimum, +    fop = ec_fop_data_allocate(frame, this, GF_FOP_LK, 0, target, fop_flags,                                 ec_wind_lk, ec_manager_lk, callback, data);      if (fop == NULL) {          goto out; diff --git a/xlators/cluster/ec/src/ec-types.h b/xlators/cluster/ec/src/ec-types.h index 6ae4a2b970e..1c295c08033 100644 --- a/xlators/cluster/ec/src/ec-types.h +++ b/xlators/cluster/ec/src/ec-types.h @@ -308,9 +308,9 @@ struct _ec_fop_data {      int32_t id; /* ID of the file operation */      int32_t refs;      int32_t state; -    int32_t minimum; /* Minimum number of successful -                        operation required to conclude a -                        fop as successful */ +    uint32_t minimum; /* Minimum number of successful +                         operation required to conclude a +                         fop as successful */      int32_t expected;      int32_t winds;      int32_t jobs; @@ -325,11 +325,12 @@ struct _ec_fop_data {      ec_cbk_data_t *answer;         /* accepted answer */      int32_t lock_count;      int32_t locked; +    gf_lock_t lock;      ec_lock_link_t locks[2];      int32_t first_lock; -    gf_lock_t lock; -    uint32_t flags; +    uint32_t fop_flags; /* Flags passed by the caller. */ +    uint32_t flags;     /* Internal flags. */      uint32_t first;      uintptr_t mask;      uintptr_t healing; /*Dispatch is done but call is successful only diff --git a/xlators/cluster/ec/src/ec.c b/xlators/cluster/ec/src/ec.c index 13ffeb96012..3c8013e8297 100644 --- a/xlators/cluster/ec/src/ec.c +++ b/xlators/cluster/ec/src/ec.c @@ -797,11 +797,12 @@ ec_gf_entrylk(call_frame_t *frame, xlator_t *this, const char *volume,                loc_t *loc, const char *basename, entrylk_cmd cmd,                entrylk_type type, dict_t *xdata)  { -    int32_t minimum = EC_MINIMUM_ALL; +    uint32_t fop_flags = EC_MINIMUM_ALL; +      if (cmd == ENTRYLK_UNLOCK) -        minimum = EC_MINIMUM_ONE; -    ec_entrylk(frame, this, -1, minimum, default_entrylk_cbk, NULL, volume, loc, -               basename, cmd, type, xdata); +        fop_flags = EC_MINIMUM_ONE; +    ec_entrylk(frame, this, -1, fop_flags, default_entrylk_cbk, NULL, volume, +               loc, basename, cmd, type, xdata);      return 0;  } @@ -811,10 +812,11 @@ ec_gf_fentrylk(call_frame_t *frame, xlator_t *this, const char *volume,                 fd_t *fd, const char *basename, entrylk_cmd cmd,                 entrylk_type type, dict_t *xdata)  { -    int32_t minimum = EC_MINIMUM_ALL; +    uint32_t fop_flags = EC_MINIMUM_ALL; +      if (cmd == ENTRYLK_UNLOCK) -        minimum = EC_MINIMUM_ONE; -    ec_fentrylk(frame, this, -1, minimum, default_fentrylk_cbk, NULL, volume, +        fop_flags = EC_MINIMUM_ONE; +    ec_fentrylk(frame, this, -1, fop_flags, default_fentrylk_cbk, NULL, volume,                  fd, basename, cmd, type, xdata);      return 0; @@ -905,7 +907,7 @@ ec_gf_getxattr(call_frame_t *frame, xlator_t *this, loc_t *loc,  {      int error = 0;      ec_t *ec = this->private; -    int32_t minimum = EC_MINIMUM_ONE; +    int32_t fop_flags = EC_MINIMUM_ONE;      if (name && strcmp(name, EC_XATTR_HEAL) != 0) {          EC_INTERNAL_XATTR_OR_GOTO(name, NULL, error, out); @@ -920,11 +922,11 @@ ec_gf_getxattr(call_frame_t *frame, xlator_t *this, loc_t *loc,      if (name && ((fnmatch(GF_XATTR_STIME_PATTERN, name, 0) == 0) ||                   XATTR_IS_NODE_UUID(name) || XATTR_IS_NODE_UUID_LIST(name))) { -        minimum = EC_MINIMUM_ALL; +        fop_flags = EC_MINIMUM_ALL;      } -    ec_getxattr(frame, this, -1, minimum, default_getxattr_cbk, NULL, loc, name, -                xdata); +    ec_getxattr(frame, this, -1, fop_flags, default_getxattr_cbk, NULL, loc, +                name, xdata);      return 0;  out: @@ -954,11 +956,12 @@ int32_t  ec_gf_inodelk(call_frame_t *frame, xlator_t *this, const char *volume,                loc_t *loc, int32_t cmd, struct gf_flock *flock, dict_t *xdata)  { -    int32_t minimum = EC_MINIMUM_ALL; +    int32_t fop_flags = EC_MINIMUM_ALL; +      if (flock->l_type == F_UNLCK) -        minimum = EC_MINIMUM_ONE; +        fop_flags = EC_MINIMUM_ONE; -    ec_inodelk(frame, this, &frame->root->lk_owner, -1, minimum, +    ec_inodelk(frame, this, &frame->root->lk_owner, -1, fop_flags,                 default_inodelk_cbk, NULL, volume, loc, cmd, flock, xdata);      return 0; @@ -968,10 +971,11 @@ int32_t  ec_gf_finodelk(call_frame_t *frame, xlator_t *this, const char *volume,                 fd_t *fd, int32_t cmd, struct gf_flock *flock, dict_t *xdata)  { -    int32_t minimum = EC_MINIMUM_ALL; +    int32_t fop_flags = EC_MINIMUM_ALL; +      if (flock->l_type == F_UNLCK) -        minimum = EC_MINIMUM_ONE; -    ec_finodelk(frame, this, &frame->root->lk_owner, -1, minimum, +        fop_flags = EC_MINIMUM_ONE; +    ec_finodelk(frame, this, &frame->root->lk_owner, -1, fop_flags,                  default_finodelk_cbk, NULL, volume, fd, cmd, flock, xdata);      return 0; @@ -991,10 +995,11 @@ int32_t  ec_gf_lk(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t cmd,           struct gf_flock *flock, dict_t *xdata)  { -    int32_t minimum = EC_MINIMUM_ALL; +    int32_t fop_flags = EC_MINIMUM_ALL; +      if (flock->l_type == F_UNLCK) -        minimum = EC_MINIMUM_ONE; -    ec_lk(frame, this, -1, minimum, default_lk_cbk, NULL, fd, cmd, flock, +        fop_flags = EC_MINIMUM_ONE; +    ec_lk(frame, this, -1, fop_flags, default_lk_cbk, NULL, fd, cmd, flock,            xdata);      return 0;  | 
