From 4baa960b95a33af30de1ca90d9b37b04e10fd0ff Mon Sep 17 00:00:00 2001 From: Mohammed Rafi KC Date: Tue, 12 Jan 2016 12:04:59 +0530 Subject: nfs: 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. Back port of> >Change-Id: I137a7e2510635ff4ea6d007b671961341f89c949 >BUG: 1297311 >Signed-off-by: Mohammed Rafi KC >Reviewed-on: http://review.gluster.org/13224 >Reviewed-by: soumya k >Tested-by: NetBSD Build System >Reviewed-by: Dan Lambright >Tested-by: Dan Lambright Change-Id: I2034521e23ef24ac75f80aff736abf5811fc0de6 BUG: 1306131 Signed-off-by: Mohammed Rafi KC Reviewed-on: http://review.gluster.org/13413 Smoke: Gluster Build System CentOS-regression: Gluster Build System NetBSD-regression: NetBSD Build System Reviewed-by: Dan Lambright --- xlators/nfs/server/src/mount3.c | 19 +++++++++++++------ xlators/nfs/server/src/nfs-common.c | 11 ++++++----- xlators/nfs/server/src/nfs-common.h | 4 ++-- xlators/nfs/server/src/nfs3-helpers.c | 9 +++++++-- 4 files changed, 28 insertions(+), 15 deletions(-) (limited to 'xlators/nfs') diff --git a/xlators/nfs/server/src/mount3.c b/xlators/nfs/server/src/mount3.c index 1ca76b2e897..c10232e20e0 100644 --- a/xlators/nfs/server/src/mount3.c +++ b/xlators/nfs/server/src/mount3.c @@ -1062,8 +1062,9 @@ __mnt3_resolve_export_subdir_comp (mnt3_resolve_t *mres) /* Wipe the contents of the previous component */ gf_uuid_copy (gfid, mres->resolveloc.inode->gfid); nfs_loc_wipe (&mres->resolveloc); - ret = nfs_entry_loc_fill (mres->exp->vol->itable, gfid, nextcomp, - &mres->resolveloc, NFS_RESOLVE_CREATE); + ret = nfs_entry_loc_fill (mres->mstate->nfsx, mres->exp->vol->itable, + gfid, nextcomp, &mres->resolveloc, + NFS_RESOLVE_CREATE); if ((ret < 0) && (ret != -2)) { gf_msg (GF_MNT, GF_LOG_ERROR, EFAULT, NFS_MSG_RESOLVE_INODE_FAIL, "Failed to resolve and " @@ -1123,6 +1124,7 @@ mnt3_resolve_subdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int authcode = 0; char *authorized_host = NULL; char *authorized_path = NULL; + inode_t *linked_inode = NULL; mres = frame->local; ms = mres->mstate; @@ -1139,8 +1141,12 @@ mnt3_resolve_subdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, goto err; } - inode_link (mres->resolveloc.inode, mres->resolveloc.parent, - mres->resolveloc.name, buf); + linked_inode = inode_link (mres->resolveloc.inode, + mres->resolveloc.parent, + mres->resolveloc.name, buf); + + if (linked_inode) + nfs_fix_generation (this, linked_inode); nfs3_fh_build_child_fh (&mres->parentfh, buf, &fh); if (strlen (mres->remainingdir) <= 0) { @@ -1371,8 +1377,9 @@ __mnt3_resolve_subdir (mnt3_resolve_t *mres) goto err; rootgfid[15] = 1; - ret = nfs_entry_loc_fill (mres->exp->vol->itable, rootgfid, firstcomp, - &mres->resolveloc, NFS_RESOLVE_CREATE); + ret = nfs_entry_loc_fill (mres->mstate->nfsx, mres->exp->vol->itable, + rootgfid, firstcomp, &mres->resolveloc, + NFS_RESOLVE_CREATE); if ((ret < 0) && (ret != -2)) { gf_msg (GF_MNT, GF_LOG_ERROR, EFAULT, NFS_MSG_RESOLVE_INODE_FAIL, "Failed to resolve and " diff --git a/xlators/nfs/server/src/nfs-common.c b/xlators/nfs/server/src/nfs-common.c index b6791566c2c..cfb0edd1294 100644 --- a/xlators/nfs/server/src/nfs-common.c +++ b/xlators/nfs/server/src/nfs-common.c @@ -331,8 +331,8 @@ err: * On other errors, return -3. 0 on success. */ int -nfs_entry_loc_fill (inode_table_t *itable, uuid_t pargfid, char *entry, - loc_t *loc, int how) +nfs_entry_loc_fill (xlator_t *this, inode_table_t *itable, uuid_t pargfid, + char *entry, loc_t *loc, int how) { inode_t *parent = NULL; inode_t *entryinode = NULL; @@ -347,21 +347,22 @@ nfs_entry_loc_fill (inode_table_t *itable, uuid_t pargfid, char *entry, ret = -1; /* Will need hard resolution now */ - if (!parent) + if (!parent || inode_ctx_get (parent, this, NULL)) goto err; gf_uuid_copy (loc->pargfid, pargfid); ret = -2; entryinode = inode_grep (itable, parent, entry); - if (!entryinode) { + if (!entryinode || inode_ctx_get (entryinode, this, NULL)) { if (how == NFS_RESOLVE_CREATE) { /* Even though we'll create the inode and the loc for * a missing inode, we still need to return -2 so * that the caller can use the filled loc to call * lookup. */ - entryinode = inode_new (itable); + if (!entryinode) + entryinode = inode_new (itable); /* Cannot change ret because that must * continue to have -2. */ diff --git a/xlators/nfs/server/src/nfs-common.h b/xlators/nfs/server/src/nfs-common.h index 401484c0f3c..01b49c1eb7a 100644 --- a/xlators/nfs/server/src/nfs-common.h +++ b/xlators/nfs/server/src/nfs-common.h @@ -64,8 +64,8 @@ extern int nfs_ino_loc_fill (inode_table_t *itable, uuid_t gfid, loc_t *l); extern int -nfs_entry_loc_fill (inode_table_t *itable, uuid_t pargfid, char *entry, - loc_t *loc, int how); +nfs_entry_loc_fill (xlator_t *this, inode_table_t *itable, uuid_t pargfid, + char *entry, loc_t *loc, int how); extern int nfs_root_loc_fill (inode_table_t *itable, loc_t *loc); diff --git a/xlators/nfs/server/src/nfs3-helpers.c b/xlators/nfs/server/src/nfs3-helpers.c index 985d08b01eb..ed673a12489 100644 --- a/xlators/nfs/server/src/nfs3-helpers.c +++ b/xlators/nfs/server/src/nfs3-helpers.c @@ -3660,6 +3660,7 @@ nfs3_fh_resolve_entry_lookup_cbk (call_frame_t *frame, void *cookie, linked_inode = inode_link (inode, cs->resolvedloc.parent, cs->resolvedloc.name, buf); if (linked_inode) { + nfs_fix_generation (this, linked_inode); inode_lookup (linked_inode); inode_unref (cs->resolvedloc.inode); cs->resolvedloc.inode = linked_inode; @@ -3702,6 +3703,7 @@ nfs3_fh_resolve_inode_lookup_cbk (call_frame_t *frame, void *cookie, linked_inode = inode_link (inode, cs->resolvedloc.parent, cs->resolvedloc.name, buf); if (linked_inode) { + nfs_fix_generation (this, linked_inode); inode_lookup (linked_inode); inode_unref (cs->resolvedloc.inode); cs->resolvedloc.inode = linked_inode; @@ -3771,7 +3773,7 @@ nfs3_fh_resolve_entry_hard (nfs3_call_state_t *cs) ", entry: %s", uuid_utoa (cs->resolvefh.gfid), cs->resolventry); - ret = nfs_entry_loc_fill (cs->vol->itable, cs->resolvefh.gfid, + ret = nfs_entry_loc_fill (cs->nfsx, cs->vol->itable, cs->resolvefh.gfid, cs->resolventry, &cs->resolvedloc, NFS_RESOLVE_CREATE); @@ -3812,14 +3814,17 @@ nfs3_fh_resolve_inode (nfs3_call_state_t *cs) { inode_t *inode = NULL; int ret = -EFAULT; + xlator_t *this = NULL; if (!cs) return ret; + this = cs->nfsx; gf_msg_trace (GF_NFS3, 0, "FH needs inode resolution"); gf_uuid_copy (cs->resolvedloc.gfid, cs->resolvefh.gfid); + inode = inode_find (cs->vol->itable, cs->resolvefh.gfid); - if (!inode) + if (!inode || inode_ctx_get (inode, this, NULL)) ret = nfs3_fh_resolve_inode_hard (cs); else ret = nfs3_fh_resolve_inode_done (cs, inode); -- cgit