summaryrefslogtreecommitdiffstats
path: root/xlators/storage
diff options
context:
space:
mode:
authorPranith Kumar K <pkarampu@redhat.com>2015-01-12 12:50:50 +0530
committerRaghavendra Bhat <raghavendra@redhat.com>2015-01-12 21:56:54 -0800
commitf91d19a9ce6ec6659c84c3f907ebc3ecaceba176 (patch)
treeddf981074156659577262a1b4e359a2b2ceab910 /xlators/storage
parent3971315248c57386e05e6c8f57369a4571555cb2 (diff)
storage/posix: Set gfid after all xattrs, uid/gid are set
Problem: When a new entry is created gfid is set even before uid/gid, xattrs are set on the entry. This can lead to dht/afr healing that file/dir with the uid/gid it sees just after the gfid is set, i.e. root/root. Sometimes setattr/setxattr are failing on that file/dir. Fix: Set gfid of the file/directory only after uid/gid, xattrs are setup properly. Readdirp, lookup either wait for the gfid to be assigned to the entry or not update the in-memory inode ctx in posix-acl xlator which was producing lot EACCESS/EPERM to the application or dht/afr self-heals. Change-Id: I0a6ced579daabe3452f5a85010a00ca6e8579451 BUG: 1088649 Signed-off-by: Pranith Kumar K <pkarampu@redhat.com> Reviewed-on: http://review.gluster.org/9434 Reviewed-by: Niels de Vos <ndevos@redhat.com> Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Shyamsundar Ranganathan <srangana@redhat.com> Reviewed-by: Raghavendra Bhat <raghavendra@redhat.com>
Diffstat (limited to 'xlators/storage')
-rw-r--r--xlators/storage/posix/src/posix.c64
1 files changed, 32 insertions, 32 deletions
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c
index 72c219784bd..b4be2e4317f 100644
--- a/xlators/storage/posix/src/posix.c
+++ b/xlators/storage/posix/src/posix.c
@@ -1146,14 +1146,6 @@ real_op:
entry_created = _gf_true;
- op_ret = posix_gfid_set (this, real_path, loc, xdata);
- if (op_ret) {
- gf_log (this->name, GF_LOG_ERROR,
- "setting gfid on %s failed", real_path);
- } else {
- gfid_set = _gf_true;
- }
-
#ifndef HAVE_SET_FSID
op_ret = lchown (real_path, frame->root->uid, gid);
if (op_ret == -1) {
@@ -1190,6 +1182,14 @@ ignore:
strerror (errno));
}
+ op_ret = posix_gfid_set (this, real_path, loc, xdata);
+ if (op_ret) {
+ gf_log (this->name, GF_LOG_ERROR,
+ "setting gfid on %s failed", real_path);
+ } else {
+ gfid_set = _gf_true;
+ }
+
op_ret = posix_pstat (this, NULL, real_path, &stbuf);
if (op_ret == -1) {
op_errno = errno;
@@ -1326,14 +1326,6 @@ posix_mkdir (call_frame_t *frame, xlator_t *this,
entry_created = _gf_true;
- op_ret = posix_gfid_set (this, real_path, loc, xdata);
- if (op_ret) {
- gf_log (this->name, GF_LOG_ERROR,
- "setting gfid on %s failed", real_path);
- } else {
- gfid_set = _gf_true;
- }
-
#ifndef HAVE_SET_FSID
op_ret = chown (real_path, frame->root->uid, gid);
if (op_ret == -1) {
@@ -1358,6 +1350,14 @@ posix_mkdir (call_frame_t *frame, xlator_t *this,
strerror (errno));
}
+ op_ret = posix_gfid_set (this, real_path, loc, xdata);
+ if (op_ret) {
+ gf_log (this->name, GF_LOG_ERROR,
+ "setting gfid on %s failed", real_path);
+ } else {
+ gfid_set = _gf_true;
+ }
+
op_ret = posix_pstat (this, NULL, real_path, &stbuf);
if (op_ret == -1) {
op_errno = errno;
@@ -1753,14 +1753,6 @@ posix_symlink (call_frame_t *frame, xlator_t *this,
entry_created = _gf_true;
- op_ret = posix_gfid_set (this, real_path, loc, xdata);
- if (op_ret) {
- gf_log (this->name, GF_LOG_ERROR,
- "setting gfid on %s failed", real_path);
- } else {
- gfid_set = _gf_true;
- }
-
#ifndef HAVE_SET_FSID
op_ret = lchown (real_path, frame->root->uid, gid);
if (op_ret == -1) {
@@ -1793,6 +1785,14 @@ ignore:
strerror (errno));
}
+ op_ret = posix_gfid_set (this, real_path, loc, xdata);
+ if (op_ret) {
+ gf_log (this->name, GF_LOG_ERROR,
+ "setting gfid on %s failed", real_path);
+ } else {
+ gfid_set = _gf_true;
+ }
+
op_ret = posix_pstat (this, NULL, real_path, &stbuf);
if (op_ret == -1) {
op_errno = errno;
@@ -2289,14 +2289,6 @@ posix_create (call_frame_t *frame, xlator_t *this,
if (was_present)
goto fill_stat;
- op_ret = posix_gfid_set (this, real_path, loc, xdata);
- if (op_ret) {
- gf_log (this->name, GF_LOG_ERROR,
- "setting gfid on %s failed", real_path);
- } else {
- gfid_set = _gf_true;
- }
-
#ifndef HAVE_SET_FSID
op_ret = chown (real_path, frame->root->uid, gid);
if (op_ret == -1) {
@@ -2329,6 +2321,14 @@ ignore:
}
fill_stat:
+ op_ret = posix_gfid_set (this, real_path, loc, xdata);
+ if (op_ret) {
+ gf_log (this->name, GF_LOG_ERROR,
+ "setting gfid on %s failed", real_path);
+ } else {
+ gfid_set = _gf_true;
+ }
+
op_ret = posix_fdstat (this, _fd, &stbuf);
if (op_ret == -1) {
op_errno = errno;