diff options
author | Raghavendra G <rgowdapp@redhat.com> | 2018-09-11 10:31:27 +0530 |
---|---|---|
committer | Raghavendra G <rgowdapp@redhat.com> | 2018-09-11 11:13:29 +0000 |
commit | 343f5a1ee0567363fc30a06f83e3e77aec0d2b2e (patch) | |
tree | c1d72ccf28598baac612d38407dbf435160a00c8 | |
parent | 8ac8f359b24c8583eb1a15b9926929770b869db8 (diff) |
mount/fuse: convert ENOENT to ESTALE in open(dir)_resume
This patch is continuation of commit
fb4b914ce84bc83a5f418719c5ba7c25689a9251.
<snip>
mount/fuse: never fail open(dir) with ENOENT
open(dir) being an operation on inode should never fail with
ENOENT. If gfid is not present, the appropriate error is
ESTALE. This will enable kernel to retry open after a revalidate
lookup.
</snip>
Earlier commit failed to fix codepath where error response is sent
back on gfid resolution failures in fuse_open(dir)_resume. Current
patch completes that work
Change-Id: Ia07e3cece404811703c8cfbac9b402ca5fe98c1e
Signed-off-by: Raghavendra G <rgowdapp@redhat.com>
updates: bz#1627620
-rw-r--r-- | xlators/mount/fuse/src/fuse-bridge.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c index 29bb80ac715..cd163781462 100644 --- a/xlators/mount/fuse/src/fuse-bridge.c +++ b/xlators/mount/fuse/src/fuse-bridge.c @@ -2310,6 +2310,10 @@ fuse_open_resume (fuse_state_t *state) "%"PRIu64": OPEN %s resolution failed", state->finh->unique, uuid_utoa (state->resolve.gfid)); + /* facilitate retry from VFS */ + if (state->resolve.op_errno == ENOENT) + state->resolve.op_errno = ESTALE; + send_fuse_err (state->this, state->finh, state->resolve.op_errno); free_fuse_state (state); @@ -2767,6 +2771,11 @@ fuse_opendir_resume (fuse_state_t *state) gf_log ("glusterfs-fuse", GF_LOG_WARNING, "%"PRIu64": OPENDIR (%s) resolution failed", state->finh->unique, uuid_utoa (state->resolve.gfid)); + + /* facilitate retry from VFS */ + if (state->resolve.op_errno == ENOENT) + state->resolve.op_errno = ESTALE; + send_fuse_err (state->this, state->finh, state->resolve.op_errno); free_fuse_state (state); |