diff options
author | Mohammed Rafi KC <rkavunga@redhat.com> | 2016-01-12 12:54:42 +0530 |
---|---|---|
committer | Dan Lambright <dlambrig@redhat.com> | 2016-01-13 19:26:43 -0800 |
commit | ad8c65612d6d7e32c06fd3aed11b7a9edd514607 (patch) | |
tree | 552f5df1b68124217a65aeac9cd1bba08d0d6ff8 /xlators/mount | |
parent | ca515db012718f2d4998edf682c70ccba29924c6 (diff) |
fuse: send lookup if inode_ctx is not set
During resolving of an entry or inode, if inode ctx
was not set, we will send a lookup.
This patch also make sure that inode_ctx will be created
after every inode_link
Change-Id: I4211533ca96a51b89d9f010fc57133470e52dc11
BUG: 1297311
Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com>
Reviewed-on: http://review.gluster.org/13225
Reviewed-by: Dan Lambright <dlambrig@redhat.com>
Tested-by: Dan Lambright <dlambrig@redhat.com>
Diffstat (limited to 'xlators/mount')
-rw-r--r-- | xlators/mount/fuse/src/fuse-bridge.c | 17 | ||||
-rw-r--r-- | xlators/mount/fuse/src/fuse-resolve.c | 11 |
2 files changed, 22 insertions, 6 deletions
diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c index eba8a6ddb0c..8ac641d5bca 100644 --- a/xlators/mount/fuse/src/fuse-bridge.c +++ b/xlators/mount/fuse/src/fuse-bridge.c @@ -380,6 +380,7 @@ fuse_entry_cbk (call_frame_t *frame, void *cookie, xlator_t *this, struct fuse_entry_out feo = {0, }; fuse_private_t *priv = NULL; inode_t *linked_inode = NULL; + uint64_t ctx_value = LOOKUP_NOT_NEEDED; priv = this->private; state = frame->root->state; @@ -429,7 +430,8 @@ fuse_entry_cbk (call_frame_t *frame, void *cookie, xlator_t *this, linked_inode = inode_link (inode, state->loc.parent, state->loc.name, buf); - if (linked_inode != inode) { + if (linked_inode == inode) { + inode_ctx_set (linked_inode, this, &ctx_value); } inode_lookup (linked_inode); @@ -1915,6 +1917,7 @@ fuse_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this, struct fuse_open_out foo = {0, }; struct iovec iov_out[3]; inode_t *linked_inode = NULL; + uint64_t ctx_value = LOOKUP_NOT_NEEDED; state = frame->root->state; priv = this->private; @@ -1950,6 +1953,8 @@ fuse_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this, */ inode_unref (fd->inode); fd->inode = inode_ref (linked_inode); + } else { + inode_ctx_set (linked_inode, this, &ctx_value); } inode_lookup (linked_inode); @@ -4168,12 +4173,13 @@ fuse_first_lookup (xlator_t *this) int -fuse_nameless_lookup (xlator_t *xl, uuid_t gfid, loc_t *loc) +fuse_nameless_lookup (xlator_t *this, xlator_t *xl, uuid_t gfid, loc_t *loc) { int ret = -1; dict_t *xattr_req = NULL; struct iatt iatt = {0, }; inode_t *linked_inode = NULL; + uint64_t ctx_value = LOOKUP_NOT_NEEDED; if ((loc == NULL) || (xl == NULL)) { ret = -EINVAL; @@ -4201,6 +4207,9 @@ fuse_nameless_lookup (xlator_t *xl, uuid_t gfid, loc_t *loc) goto out; linked_inode = inode_link (loc->inode, NULL, NULL, &iatt); + if (linked_inode == loc->inode) + inode_ctx_set (linked_inode, this, &ctx_value); + inode_unref (loc->inode); loc->inode = linked_inode; @@ -4240,8 +4249,8 @@ fuse_migrate_fd_open (xlator_t *this, fd_t *basefd, fd_t *oldfd, loc.inode = inode_find (new_subvol->itable, basefd->inode->gfid); if (loc.inode == NULL) { - ret = fuse_nameless_lookup (new_subvol, basefd->inode->gfid, - &loc); + ret = fuse_nameless_lookup (this, new_subvol, + basefd->inode->gfid, &loc); if (ret < 0) { gf_log ("glusterfs-fuse", GF_LOG_WARNING, "name-less lookup of gfid (%s) failed (%s)" diff --git a/xlators/mount/fuse/src/fuse-resolve.c b/xlators/mount/fuse/src/fuse-resolve.c index 9e38cbe7e40..a0352bcf43f 100644 --- a/xlators/mount/fuse/src/fuse-resolve.c +++ b/xlators/mount/fuse/src/fuse-resolve.c @@ -45,6 +45,7 @@ fuse_resolve_entry_cbk (call_frame_t *frame, void *cookie, xlator_t *this, fuse_resolve_t *resolve = NULL; inode_t *link_inode = NULL; loc_t *resolve_loc = NULL; + uint64_t ctx_value = LOOKUP_NOT_NEEDED; state = frame->root->state; resolve = state->resolve_now; @@ -65,7 +66,8 @@ fuse_resolve_entry_cbk (call_frame_t *frame, void *cookie, xlator_t *this, link_inode = inode_link (inode, resolve_loc->parent, resolve_loc->name, buf); - + if (link_inode == inode) + inode_ctx_set (link_inode, this, &ctx_value); state->loc_now->inode = link_inode; out: @@ -114,6 +116,7 @@ fuse_resolve_gfid_cbk (call_frame_t *frame, void *cookie, xlator_t *this, inode_t *link_inode = NULL; loc_t *loc_now = NULL; inode_t *tmp_inode = NULL; + uint64_t ctx_value = LOOKUP_NOT_NEEDED; state = frame->root->state; resolve = state->resolve_now; @@ -146,6 +149,8 @@ fuse_resolve_gfid_cbk (call_frame_t *frame, void *cookie, xlator_t *this, } link_inode = inode_link (inode, NULL, NULL, buf); + if (link_inode == inode) + inode_ctx_set (link_inode, this, &ctx_value); loc_wipe (&resolve->resolve_loc); @@ -226,9 +231,11 @@ fuse_resolve_parent_simple (fuse_state_t *state) loc_t *loc = NULL; inode_t *parent = NULL; inode_t *inode = NULL; + xlator_t *this = NULL; resolve = state->resolve_now; loc = state->loc_now; + this = state->this; loc->name = resolve->bname; @@ -276,7 +283,7 @@ fuse_resolve_parent_simple (fuse_state_t *state) gf_uuid_copy (loc->pargfid, resolve->pargfid); inode = inode_grep (state->itable, parent, loc->name); - if (inode) { + if (inode && !inode_needs_lookup (inode, this)) { loc->inode = inode; /* decisive result - resolution success */ return 0; |