diff options
Diffstat (limited to 'xlators/nfs')
-rw-r--r-- | xlators/nfs/server/src/mount3.c | 19 | ||||
-rw-r--r-- | xlators/nfs/server/src/nfs-common.c | 11 | ||||
-rw-r--r-- | xlators/nfs/server/src/nfs-common.h | 4 | ||||
-rw-r--r-- | xlators/nfs/server/src/nfs3-helpers.c | 9 |
4 files changed, 28 insertions, 15 deletions
diff --git a/xlators/nfs/server/src/mount3.c b/xlators/nfs/server/src/mount3.c index 2b9a75ee2cc..7b49d097d96 100644 --- a/xlators/nfs/server/src/mount3.c +++ b/xlators/nfs/server/src/mount3.c @@ -1057,8 +1057,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 " @@ -1118,6 +1119,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; @@ -1134,8 +1136,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) { @@ -1366,8 +1372,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 359835f2cbd..51a2b7e36f7 100644 --- a/xlators/nfs/server/src/nfs-common.c +++ b/xlators/nfs/server/src/nfs-common.c @@ -326,8 +326,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; @@ -342,21 +342,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 d60642f6039..fa7f4ebf212 100644 --- a/xlators/nfs/server/src/nfs-common.h +++ b/xlators/nfs/server/src/nfs-common.h @@ -59,8 +59,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 2203f1e1a90..cfa1ac64397 100644 --- a/xlators/nfs/server/src/nfs3-helpers.c +++ b/xlators/nfs/server/src/nfs3-helpers.c @@ -3655,6 +3655,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; @@ -3697,6 +3698,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; @@ -3766,7 +3768,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); @@ -3807,14 +3809,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); |