summaryrefslogtreecommitdiffstats
path: root/xlators/storage
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/storage')
-rw-r--r--xlators/storage/posix/src/posix.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c
index 0730dc2cde2..aad52096bac 100644
--- a/xlators/storage/posix/src/posix.c
+++ b/xlators/storage/posix/src/posix.c
@@ -252,6 +252,34 @@ out:
int
+posix_fill_gfid_path (xlator_t *this, const char *path, struct iatt *iatt)
+{
+ int ret = 0;
+
+ if (!iatt)
+ return 0;
+
+ ret = sys_lgetxattr (path, "trusted.gfid", iatt->ia_gfid, 16);
+
+ return ret;
+}
+
+
+int
+posix_fill_gfid_fd (xlator_t *this, int fd, struct iatt *iatt)
+{
+ int ret = 0;
+
+ if (!iatt)
+ return 0;
+
+ ret = sys_fgetxattr (fd, "trusted.gfid", iatt->ia_gfid, 16);
+
+ return ret;
+}
+
+
+int
posix_lstat_with_gen (xlator_t *this, const char *path, struct iatt *stbuf_p)
{
struct posix_private *priv = NULL;
@@ -292,6 +320,8 @@ posix_lstat_with_gen (xlator_t *this, const char *path, struct iatt *stbuf_p)
}
#endif /* !GF_LINUX_HOST_OS */
+ ret = posix_fill_gfid_path (this, path, &stbuf);
+
ret = snprintf (gen_key, 1024, "trusted.%s.gen", this->name);
if (ret == 1024)
@@ -361,6 +391,8 @@ posix_fstat_with_gen (xlator_t *this, int fd, struct iatt *stbuf_p)
}
#endif /* !GF_LINUX_HOST_OS */
+ ret = posix_fill_gfid_fd (this, fd, &stbuf);
+
ret = snprintf (gen_key, 1024, "trusted.%s.gen", this->name);
if (ret == 1024)
@@ -472,6 +504,36 @@ out:
}
+int
+posix_gfid_set (xlator_t *this, const char *path, dict_t *xattr_req)
+{
+ void *uuid_req = NULL;
+ uuid_t uuid_curr;
+ int ret = 0;
+ struct stat stat = {0, };
+
+ if (!xattr_req)
+ return 0;
+
+ if (sys_lstat (path, &stat) != 0)
+ return 0;
+
+ ret = sys_lgetxattr (path, "trusted.gfid", uuid_curr, 16);
+
+ if (ret == 16)
+ return 0;
+
+ ret = dict_get_ptr (xattr_req, "gfid-req", &uuid_req);
+ if (ret)
+ goto out;
+
+ ret = sys_lsetxattr (path, "trusted.gfid", uuid_req, 16, XATTR_CREATE);
+
+out:
+ return ret;
+}
+
+
int32_t
posix_lookup (call_frame_t *frame, xlator_t *this,
loc_t *loc, dict_t *xattr_req)
@@ -493,6 +555,8 @@ posix_lookup (call_frame_t *frame, xlator_t *this,
MAKE_REAL_PATH (real_path, this, loc->path);
+ posix_gfid_set (this, real_path, xattr_req);
+
op_ret = posix_lstat_with_gen (this, real_path, &buf);
op_errno = errno;
@@ -1134,6 +1198,8 @@ posix_mknod (call_frame_t *frame, xlator_t *this,
}
}
+ op_ret = posix_gfid_set (this, real_path, params);
+
#ifndef HAVE_SET_FSID
op_ret = lchown (real_path, frame->root->uid, gid);
if (op_ret == -1) {
@@ -1389,6 +1455,8 @@ posix_mkdir (call_frame_t *frame, xlator_t *this,
goto out;
}
+ op_ret = posix_gfid_set (this, real_path, params);
+
#ifndef HAVE_SET_FSID
op_ret = chown (real_path, frame->root->uid, gid);
if (op_ret == -1) {
@@ -1663,6 +1731,8 @@ posix_symlink (call_frame_t *frame, xlator_t *this,
goto out;
}
+ op_ret = posix_gfid_set (this, real_path, params);
+
#ifndef HAVE_SET_FSID
op_ret = lchown (real_path, frame->root->uid, gid);
if (op_ret == -1) {
@@ -2080,6 +2150,8 @@ posix_create (call_frame_t *frame, xlator_t *this,
goto out;
}
+ op_ret = posix_gfid_set (this, real_path, params);
+
#ifndef HAVE_SET_FSID
op_ret = chown (real_path, frame->root->uid, gid);
if (op_ret == -1) {