summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xlators/cluster/dht/src/dht-common.c16
-rw-r--r--xlators/cluster/dht/src/dht-common.h6
-rw-r--r--xlators/cluster/dht/src/dht-helper.c25
3 files changed, 44 insertions, 3 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c
index d328b78cbe1..9643caa0e17 100644
--- a/xlators/cluster/dht/src/dht-common.c
+++ b/xlators/cluster/dht/src/dht-common.c
@@ -3815,6 +3815,14 @@ dht_file_setxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
local->op_errno = op_errno;
+ if ((local->fop == GF_FOP_FSETXATTR) &&
+ op_ret == -1 && (op_errno == EBADF) && !(local->fd_checked)) {
+ ret = dht_check_and_open_fd_on_subvol (this, frame);
+ if (ret)
+ goto out;
+ return 0;
+ }
+
if ((op_ret == -1) && !dht_inode_missing (op_errno)) {
gf_msg_debug (this->name, op_errno,
"subvolume %s returned -1.",
@@ -4388,6 +4396,14 @@ dht_file_removexattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
local->op_errno = op_errno;
+ if ((local->fop == GF_FOP_FREMOVEXATTR) &&
+ (op_ret == -1) && (op_errno == EBADF) && !(local->fd_checked)) {
+ ret = dht_check_and_open_fd_on_subvol (this, frame);
+ if (ret)
+ goto out;
+ return 0;
+ }
+
if ((op_ret == -1) && !dht_inode_missing (op_errno)) {
gf_msg_debug (this->name, op_errno,
"subvolume %s returned -1",
diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h
index ae93d9a03ab..d06b7314d8b 100644
--- a/xlators/cluster/dht/src/dht-common.h
+++ b/xlators/cluster/dht/src/dht-common.h
@@ -1388,6 +1388,12 @@ dht_file_attr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int op_ret, int op_errno, struct iatt *stbuf, dict_t *xdata);
+int
+dht_file_removexattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int op_ret, int op_errno, dict_t *xdata);
+int
+dht_file_setxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int op_ret, int op_errno, dict_t *xdata);
#endif/* _DHT_H */
diff --git a/xlators/cluster/dht/src/dht-helper.c b/xlators/cluster/dht/src/dht-helper.c
index b81e438af98..86040705445 100644
--- a/xlators/cluster/dht/src/dht-helper.c
+++ b/xlators/cluster/dht/src/dht-helper.c
@@ -305,7 +305,6 @@ dht_check_and_open_fd_on_subvol_complete (int ret, call_frame_t *frame,
switch (fop) {
case GF_FOP_WRITE:
-
STACK_WIND_COOKIE (frame, dht_writev_cbk, subvol, subvol,
subvol->fops->writev, fd,
local->rebalance.vector,
@@ -316,13 +315,11 @@ dht_check_and_open_fd_on_subvol_complete (int ret, call_frame_t *frame,
break;
case GF_FOP_FLUSH:
-
STACK_WIND (frame, dht_flush_cbk, subvol,
subvol->fops->flush, fd, local->xattr_req);
break;
case GF_FOP_FSETATTR:
-
STACK_WIND_COOKIE (frame, dht_file_setattr_cbk, subvol,
subvol, subvol->fops->fsetattr, fd,
&local->rebalance.stbuf,
@@ -380,6 +377,20 @@ dht_check_and_open_fd_on_subvol_complete (int ret, call_frame_t *frame,
local->xattr_req);
break;
+ case GF_FOP_FSETXATTR:
+ STACK_WIND_COOKIE (frame, dht_file_setxattr_cbk, subvol,
+ subvol, subvol->fops->fsetxattr, local->fd,
+ local->rebalance.xattr,
+ local->rebalance.flags, local->xattr_req);
+ break;
+
+ case GF_FOP_FREMOVEXATTR:
+ STACK_WIND_COOKIE (frame, dht_file_removexattr_cbk, subvol,
+ subvol, subvol->fops->fremovexattr,
+ local->fd, local->key, local->xattr_req);
+
+ break;
+
default:
gf_msg (this->name, GF_LOG_ERROR, 0,
DHT_MSG_UNKNOWN_FOP,
@@ -445,6 +456,14 @@ handle_err:
DHT_STACK_UNWIND (fstat, frame, -1, op_errno, NULL, NULL);
break;
+ case GF_FOP_FSETXATTR:
+ DHT_STACK_UNWIND (fsetxattr, frame, -1, op_errno, NULL);
+ break;
+
+ case GF_FOP_FREMOVEXATTR:
+ DHT_STACK_UNWIND (fremovexattr, frame, -1, op_errno, NULL);
+ break;
+
default:
gf_msg (this->name, GF_LOG_ERROR, 0,
DHT_MSG_UNKNOWN_FOP,