From 30e883d49475c5a99abdb4745e708bb1f9e25144 Mon Sep 17 00:00:00 2001 From: Mohammed Rafi KC Date: Tue, 12 Jan 2016 15:04:46 +0530 Subject: gfapi: 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 to pupulate inode ctx for every xlators This patch also make sure that inode_ctx will be created after every inode_link. We will store inode_ctx value as LOOKUP_NEEDED if the inode is liked via readdirp, in all other case we will store inode_ctx value as LOOKUP_NOT_NEEDED. Back port of> >Change-Id: I3a10c298944200fa3862127187ae8988e582d352 >BUG: 1297311 >Signed-off-by: Mohammed Rafi KC >Reviewed-on: http://review.gluster.org/13226 >Reviewed-by: Poornima G >Tested-by: NetBSD Build System >Reviewed-by: Shyamsundar Ranganathan >Reviewed-by: Dan Lambright >Tested-by: Dan Lambright Change-Id: Ifeabb5611fcaa3c41404f0cdc48a680a16600e68 BUG: 1306131 Signed-off-by: Mohammed Rafi KC Reviewed-on: http://review.gluster.org/13414 Smoke: Gluster Build System NetBSD-regression: NetBSD Build System CentOS-regression: Gluster Build System Reviewed-by: Poornima G Reviewed-by: Dan Lambright --- api/src/glfs-resolve.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'api/src/glfs-resolve.c') diff --git a/api/src/glfs-resolve.c b/api/src/glfs-resolve.c index b5efcbae0e7..f8933326433 100644 --- a/api/src/glfs-resolve.c +++ b/api/src/glfs-resolve.c @@ -91,6 +91,7 @@ glfs_refresh_inode_safe (xlator_t *subvol, inode_t *oldinode, struct iatt iatt = {0, }; inode_t *newinode = NULL; gf_boolean_t lookup_needed = _gf_false; + uint64_t ctx_value = LOOKUP_NOT_NEEDED; if (!oldinode) @@ -129,8 +130,11 @@ glfs_refresh_inode_safe (xlator_t *subvol, inode_t *oldinode, } newinode = inode_link (loc.inode, 0, 0, &iatt); - if (newinode) - inode_lookup (newinode); + if (newinode) { + if (newinode == loc.inode) + inode_ctx_set (newinode, THIS, &ctx_value); + inode_lookup (newinode); + } loc_wipe (&loc); @@ -240,6 +244,7 @@ glfs_resolve_component (struct glfs *fs, xlator_t *subvol, inode_t *parent, struct iatt ciatt = {0, }; uuid_t gfid; dict_t *xattr_req = NULL; + uint64_t ctx_value = LOOKUP_NOT_NEEDED; loc.name = component; @@ -270,7 +275,7 @@ glfs_resolve_component (struct glfs *fs, xlator_t *subvol, inode_t *parent, gf_uuid_copy (loc.gfid, loc.inode->gfid); reval = 1; - if (!force_lookup) { + if (!(force_lookup || inode_needs_lookup (loc.inode, THIS))) { inode = inode_ref (loc.inode); ciatt.ia_type = inode->ia_type; goto found; @@ -341,6 +346,8 @@ glfs_resolve_component (struct glfs *fs, xlator_t *subvol, inode_t *parent, goto out; inode = inode_link (loc.inode, loc.parent, component, &ciatt); + if (inode == loc.inode) + inode_ctx_set (inode, THIS, &ctx_value); found: if (inode) inode_lookup (inode); -- cgit