summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKrutika Dhananjay <kdhananj@redhat.com>2017-07-19 16:14:59 +0530
committerNiels de Vos <ndevos@redhat.com>2017-08-10 16:41:37 +0000
commit982480ecbc0085d4e6bbbc976d2549abbd5f3e61 (patch)
tree7ddef6d15c9cf24d135a00f1ed68ab5e467177aa
parent117daf0c792f52b4c3fbc685b2f6b15841c81772 (diff)
storage/posix: Use the ret value of posix_gfid_heal()
... to make the change in commit acf8cfdf truly useful. Without this, a race between entry creation fops and lookup at posix layer can cause lookups to fail with ENODATA, as opposed to ENOENT. Backport of: > Change-Id: I44a226872283a25f1f4812f03f68921c5eb335bb > Reviewed-on: https://review.gluster.org/17821 > BUG: 1472758 > cherry-picked from 669868d23eaeba42809fca7be134137c607d64ed Change-Id: I44a226872283a25f1f4812f03f68921c5eb335bb BUG: 1480193 Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com> Reviewed-on: https://review.gluster.org/18015 Smoke: Gluster Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Raghavendra Bhat <raghavendra@redhat.com> Reviewed-by: Niels de Vos <ndevos@redhat.com>
-rw-r--r--xlators/storage/posix/src/posix-helpers.c16
-rw-r--r--xlators/storage/posix/src/posix.c7
2 files changed, 13 insertions, 10 deletions
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c
index 678e3770769..76e32a31594 100644
--- a/xlators/storage/posix/src/posix-helpers.c
+++ b/xlators/storage/posix/src/posix-helpers.c
@@ -1531,23 +1531,21 @@ posix_gfid_heal (xlator_t *this, const char *path, loc_t *loc, dict_t *xattr_req
struct stat stat = {0, };
if (!xattr_req)
- goto out;
+ return 0;
- if (sys_lstat (path, &stat) != 0)
- goto out;
+ if (sys_lstat (path, &stat) != 0) {
+ return -errno;
+ }
ret = sys_lgetxattr (path, GFID_XATTR_KEY, uuid_curr, 16);
if (ret != 16) {
if (is_fresh_file (&stat)) {
- ret = -1;
- errno = ENOENT;
- goto out;
+ return -ENOENT;
}
}
- ret = posix_gfid_set (this, path, loc, xattr_req);
-out:
- return ret;
+ posix_gfid_set (this, path, loc, xattr_req);
+ return 0;
}
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c
index fa41c4c90c8..dfb7e05e49a 100644
--- a/xlators/storage/posix/src/posix.c
+++ b/xlators/storage/posix/src/posix.c
@@ -189,7 +189,12 @@ posix_lookup (call_frame_t *frame, xlator_t *this,
MAKE_ENTRY_HANDLE (real_path, par_path, this, loc, &buf);
if (gf_uuid_is_null (loc->inode->gfid)) {
- posix_gfid_heal (this, real_path, loc, xdata);
+ op_ret = posix_gfid_heal (this, real_path, loc, xdata);
+ if (op_ret < 0) {
+ op_errno = -op_ret;
+ op_ret = -1;
+ goto out;
+ }
MAKE_ENTRY_HANDLE (real_path, par_path, this,
loc, &buf);
}