68 lines
1.7 KiB
Diff
68 lines
1.7 KiB
Diff
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c
|
|
index e204726..df0033a 100644
|
|
--- a/xlators/cluster/dht/src/dht-common.c
|
|
+++ b/xlators/cluster/dht/src/dht-common.c
|
|
@@ -2068,6 +2068,50 @@ err:
|
|
return 0;
|
|
}
|
|
|
|
+int
|
|
+dht_fsetxattr (call_frame_t *frame, xlator_t *this,
|
|
+ fd_t *fd, dict_t *xattr, int flags)
|
|
+{
|
|
+ xlator_t *subvol = NULL;
|
|
+ dht_local_t *local = NULL;
|
|
+ int op_errno = EINVAL;
|
|
+
|
|
+ VALIDATE_OR_GOTO (frame, err);
|
|
+ VALIDATE_OR_GOTO (this, err);
|
|
+ VALIDATE_OR_GOTO (fd, err);
|
|
+ VALIDATE_OR_GOTO (fd->inode, err);
|
|
+
|
|
+ subvol = dht_subvol_get_cached (this, fd->inode);
|
|
+ if (!subvol) {
|
|
+ gf_log (this->name, GF_LOG_DEBUG,
|
|
+ "no cached subvolume for fd=%p", fd);
|
|
+ op_errno = EINVAL;
|
|
+ goto err;
|
|
+ }
|
|
+
|
|
+ local = dht_local_init (frame);
|
|
+ if (!local) {
|
|
+ op_errno = ENOMEM;
|
|
+ gf_log (this->name, GF_LOG_ERROR,
|
|
+ "Out of memory");
|
|
+ goto err;
|
|
+ }
|
|
+
|
|
+ local->inode = inode_ref (fd->inode);
|
|
+ local->call_cnt = 1;
|
|
+
|
|
+ STACK_WIND (frame, dht_err_cbk, subvol, subvol->fops->fsetxattr,
|
|
+ fd, xattr, flags);
|
|
+
|
|
+ return 0;
|
|
+
|
|
+err:
|
|
+ op_errno = (op_errno == -1) ? errno : op_errno;
|
|
+ DHT_STACK_UNWIND (fsetxattr, frame, -1, op_errno);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
|
|
int
|
|
dht_removexattr (call_frame_t *frame, xlator_t *this,
|
|
diff --git a/xlators/cluster/dht/src/dht.c b/xlators/cluster/dht/src/dht.c
|
|
index 93d01f1..3f81ba7 100644
|
|
--- a/xlators/cluster/dht/src/dht.c
|
|
+++ b/xlators/cluster/dht/src/dht.c
|
|
@@ -491,6 +491,7 @@ struct xlator_fops fops = {
|
|
.access = dht_access,
|
|
.readlink = dht_readlink,
|
|
.setxattr = dht_setxattr,
|
|
+ .fsetxattr = dht_fsetxattr,
|
|
.getxattr = dht_getxattr,
|
|
.removexattr = dht_removexattr,
|
|
.open = dht_open,
|