diff options
Diffstat (limited to 'xlators/cluster/ec/src/ec-dir-read.c')
| -rw-r--r-- | xlators/cluster/ec/src/ec-dir-read.c | 44 |
1 files changed, 25 insertions, 19 deletions
diff --git a/xlators/cluster/ec/src/ec-dir-read.c b/xlators/cluster/ec/src/ec-dir-read.c index 8db92b9d92d..f71dcfac293 100644 --- a/xlators/cluster/ec/src/ec-dir-read.c +++ b/xlators/cluster/ec/src/ec-dir-read.c @@ -8,15 +8,11 @@ cases as published by the Free Software Foundation. */ -#include "xlator.h" -#include "defaults.h" - #include "ec.h" #include "ec-messages.h" #include "ec-helpers.h" #include "ec-common.h" #include "ec-combine.h" -#include "ec-method.h" #include "ec-fops.h" /**************************************************************** @@ -127,13 +123,15 @@ ec_manager_opendir(ec_fop_data_t *fop, int32_t state) return EC_STATE_REPORT; } - err = ec_loc_from_loc(fop->xl, &ctx->loc, &fop->loc[0]); - if (err != 0) { - UNLOCK(&fop->fd->lock); + if (!ctx->loc.inode) { + err = ec_loc_from_loc(fop->xl, &ctx->loc, &fop->loc[0]); + if (err != 0) { + UNLOCK(&fop->fd->lock); - fop->error = -err; + fop->error = -err; - return EC_STATE_REPORT; + return EC_STATE_REPORT; + } } UNLOCK(&fop->fd->lock); @@ -142,7 +140,7 @@ ec_manager_opendir(ec_fop_data_t *fop, int32_t state) case EC_STATE_LOCK: ec_lock_prepare_inode(fop, &fop->loc[0], EC_QUERY_INFO, 0, - LLONG_MAX); + EC_RANGE_FULL); ec_lock(fop); return EC_STATE_DISPATCH; @@ -219,7 +217,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 +231,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; @@ -388,9 +386,16 @@ ec_manager_readdir(ec_fop_data_t *fop, int32_t state) /* Return error if opendir has not been successfully called on * any subvolume. */ ctx = ec_fd_get(fop->fd, fop->xl); - if ((ctx == NULL) || (ctx->open == 0)) { - fop->error = EINVAL; + if (ctx == NULL) { + fop->error = ENOMEM; + } else if (ctx->open == 0) { + fop->error = EBADFD; + } + if (fop->error) { + gf_msg(fop->xl->name, GF_LOG_ERROR, fop->error, + EC_MSG_INVALID_REQUEST, "EC is not winding readdir: %s", + ec_msg_str(fop)); return EC_STATE_REPORT; } @@ -427,7 +432,8 @@ ec_manager_readdir(ec_fop_data_t *fop, int32_t state) } fop->mask &= 1ULL << idx; } else { - ec_lock_prepare_fd(fop, fop->fd, EC_QUERY_INFO, 0, LLONG_MAX); + ec_lock_prepare_fd(fop, fop->fd, EC_QUERY_INFO, 0, + EC_RANGE_FULL); ec_lock(fop); } @@ -514,7 +520,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}; @@ -528,7 +534,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; @@ -584,7 +590,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}; @@ -598,7 +604,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; |
