diff options
| author | Krutika Dhananjay <kdhananj@redhat.com> | 2017-07-19 16:14:59 +0530 | 
|---|---|---|
| committer | Niels de Vos <ndevos@redhat.com> | 2017-08-10 16:41:37 +0000 | 
| commit | 982480ecbc0085d4e6bbbc976d2549abbd5f3e61 (patch) | |
| tree | 7ddef6d15c9cf24d135a00f1ed68ab5e467177aa | |
| parent | 117daf0c792f52b4c3fbc685b2f6b15841c81772 (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.c | 16 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix.c | 7 | 
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);                  }  | 
