diff options
Diffstat (limited to 'xlators/mount/fuse/src')
-rw-r--r-- | xlators/mount/fuse/src/fuse-bridge.c | 117 |
1 files changed, 115 insertions, 2 deletions
diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c index 965f8ca8a71..d34f77cb7c1 100644 --- a/xlators/mount/fuse/src/fuse-bridge.c +++ b/xlators/mount/fuse/src/fuse-bridge.c @@ -592,6 +592,10 @@ fuse_newentry_cbk(call_frame_t *frame, void *cookie, xlator_t *this, struct iatt *buf, struct iatt *preparent, struct iatt *postparent, dict_t *xdata) { + /* facilitate retry of link from VFS */ + if (op_errno == ENOENT) + op_errno = ESTALE; + fuse_entry_cbk(frame, cookie, this, op_ret, op_errno, inode, buf, xdata); return 0; } @@ -798,6 +802,10 @@ fuse_truncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this, gf_fop_list[frame->root->op], state->loc.path ? state->loc.path : "ERR", strerror(op_errno)); + /* facilitate retry from VFS */ + if ((state->fd == NULL) && (op_errno == ENOENT)) + op_errno = ESTALE; + send_fuse_err(this, finh, op_errno); } @@ -881,6 +889,10 @@ fuse_attr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, return 0; } + /* facilitate retry from VFS */ + if ((state->fd == NULL) && (op_errno == ENOENT)) + op_errno = ESTALE; + gf_log("glusterfs-fuse", GF_LOG_WARNING, "%" PRIu64 ": %s() " @@ -915,6 +927,11 @@ fuse_getattr_resume(fuse_state_t *state) "%" PRIu64 ": GETATTR %" PRIu64 " (%s) resolution failed", state->finh->unique, state->finh->nodeid, uuid_utoa(state->resolve.gfid)); + + /* facilitate retry from VFS */ + if ((state->fd == NULL) && (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); return; @@ -969,7 +986,7 @@ fuse_getattr(xlator_t *this, fuse_in_header_t *finh, void *msg, gf_log("glusterfs-fuse", GF_LOG_WARNING, "%" PRIu64 ": GETATTR on / (fuse_loc_fill() failed)", finh->unique); - send_fuse_err(this, finh, ENOENT); + send_fuse_err(this, finh, ESTALE); free_fuse_state(state); return; } @@ -1200,6 +1217,10 @@ fuse_setattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, gf_fop_list[frame->root->op], state->loc.path ? state->loc.path : "ERR", strerror(op_errno)); + /* facilitate retry from VFS */ + if ((state->fd == NULL) && (op_errno == ENOENT)) + op_errno = ESTALE; + send_fuse_err(this, finh, op_errno); op_done = 1; } @@ -1256,6 +1277,11 @@ fuse_setattr_resume(fuse_state_t *state) "%" PRIu64 ": SETATTR %" PRIu64 " (%s) resolution failed", state->finh->unique, state->finh->nodeid, uuid_utoa(state->resolve.gfid)); + + /* facilitate retry from VFS */ + if ((state->fd == NULL) && (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); return; @@ -1395,6 +1421,10 @@ fuse_removexattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, gf_fop_list[frame->root->op], state->name ? state->name : "", state->loc.path ? state->loc.path : "ERR", strerror(op_errno)); + /* facilitate retry from VFS */ + if ((state->fd == NULL) && (op_errno == ENOENT)) + op_errno = ESTALE; + send_fuse_err(this, finh, op_errno); } @@ -1428,6 +1458,10 @@ fuse_err_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, strerror(op_errno)); } + /* facilitate retry from VFS */ + if ((state->fd == NULL) && (op_errno == ENOENT)) + op_errno = ESTALE; + send_fuse_err(this, finh, op_errno); } @@ -1509,6 +1543,11 @@ fuse_access_resume(fuse_state_t *state) "%" PRIu64 ": ACCESS %" PRIu64 " (%s) resolution failed", state->finh->unique, state->finh->nodeid, 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); return; @@ -1565,6 +1604,10 @@ fuse_readlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this, state->loc.path, linkname, op_ret); send_fuse_data(this, finh, (void *)linkname, op_ret); } else { + /* facilitate retry from VFS */ + if (op_errno == ENOENT) + op_errno = ESTALE; + gf_log("glusterfs-fuse", GF_LOG_WARNING, "%" PRIu64 ": %s => -1 (%s)", frame->root->unique, state->loc.path, strerror(op_errno)); @@ -1584,6 +1627,11 @@ fuse_readlink_resume(fuse_state_t *state) gf_log("glusterfs-fuse", GF_LOG_ERROR, "READLINK %" PRIu64 " (%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); return; @@ -1620,6 +1668,11 @@ fuse_mknod_resume(fuse_state_t *state) "MKNOD %" PRIu64 "/%s (%s/%s) resolution failed", state->finh->nodeid, state->resolve.bname, uuid_utoa(state->resolve.gfid), state->resolve.bname); + + /* 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); return; @@ -1689,6 +1742,11 @@ fuse_mkdir_resume(fuse_state_t *state) "MKDIR %" PRIu64 " (%s/%s) resolution failed", state->finh->nodeid, uuid_utoa(state->resolve.gfid), state->resolve.bname); + + /* 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); return; @@ -1825,6 +1883,11 @@ fuse_symlink_resume(fuse_state_t *state) "SYMLINK %" PRIu64 " (%s/%s) -> %s resolution failed", state->finh->nodeid, uuid_utoa(state->resolve.gfid), state->resolve.bname, state->name); + + /* 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); return; @@ -1945,6 +2008,10 @@ fuse_rename_resume(fuse_state_t *state) uuid_utoa_r(state->resolve2.gfid, loc2_uuid), state->resolve2.bname); + /* facilitate retry from VFS */ + if ((!state->loc.inode) && (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); return; @@ -1958,7 +2025,7 @@ fuse_rename_resume(fuse_state_t *state) uuid_utoa_r(state->resolve2.gfid, loc2_uuid), state->resolve2.bname); - send_fuse_err(state->this, state->finh, ENOENT); + send_fuse_err(state->this, state->finh, ESTALE); free_fuse_state(state); return; } @@ -2001,6 +2068,11 @@ fuse_link_resume(fuse_state_t *state) gf_log("glusterfs-fuse", GF_LOG_WARNING, "fuse_loc_fill() failed %" PRIu64 ": LINK %s %s", state->finh->unique, state->loc2.path, state->loc.path); + + /* facilitate retry from VFS */ + if (!state->loc2.inode && (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); return; @@ -2134,8 +2206,13 @@ fuse_create_cbk(call_frame_t *frame, void *cookie, xlator_t *this, fd_bind(fd); } else { + /* facilitate retry from VFS */ + if (op_errno == ENOENT) + op_errno = ESTALE; + gf_log("glusterfs-fuse", GF_LOG_WARNING, "%" PRIu64 ": %s => -1 (%s)", finh->unique, state->loc.path, strerror(op_errno)); + send_fuse_err(this, finh, op_errno); gf_fd_put(priv->fdtable, state->fd_no); } @@ -2158,6 +2235,11 @@ fuse_create_resume(fuse_state_t *state) "%" PRIu64 " CREATE %s/%s resolution failed", state->finh->unique, uuid_utoa(state->resolve.gfid), state->resolve.bname); + + /* 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); return; @@ -3230,8 +3312,13 @@ fuse_statfs_cbk(call_frame_t *frame, void *cookie, xlator_t *this, ? send_fuse_obj(this, finh, &fso) : send_fuse_data(this, finh, &fso, FUSE_COMPAT_STATFS_SIZE); } else { + /* facilitate retry from VFS */ + if (op_errno == ENOENT) + op_errno = ESTALE; + gf_log("glusterfs-fuse", GF_LOG_WARNING, "%" PRIu64 ": ERR => -1 (%s)", frame->root->unique, strerror(op_errno)); + send_fuse_err(this, finh, op_errno); } @@ -3249,6 +3336,10 @@ fuse_statfs_resume(fuse_state_t *state) "%" PRIu64 ": STATFS (%s) resolution fail", 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); return; @@ -3284,6 +3375,11 @@ fuse_setxattr_resume(fuse_state_t *state) "resolution failed", state->finh->unique, uuid_utoa(state->resolve.gfid), state->finh->nodeid, state->name); + + /* 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); return; @@ -3521,6 +3617,11 @@ fuse_xattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, send_fuse_xattr(this, finh, value, len, state->size); } /* if(state->name)...else */ } else { + /* facilitate retry from VFS */ + if ((state->fd == NULL) && (op_errno == ENOENT)) { + op_errno = ESTALE; + } + /* if failure - no need to check if listxattr or getxattr */ if (op_errno != ENODATA && op_errno != ENOATTR) { if (op_errno == ENOTSUP) { @@ -3565,6 +3666,10 @@ fuse_getxattr_resume(fuse_state_t *state) state->finh->unique, uuid_utoa(state->resolve.gfid), state->finh->nodeid, state->name); + /* 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); return; @@ -3707,6 +3812,10 @@ fuse_listxattr_resume(fuse_state_t *state) state->finh->unique, uuid_utoa(state->resolve.gfid), state->finh->nodeid); + /* 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); return; @@ -3762,6 +3871,10 @@ fuse_removexattr_resume(fuse_state_t *state) state->finh->unique, uuid_utoa(state->resolve.gfid), state->finh->nodeid, state->name); + /* 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); return; |