diff options
| -rw-r--r-- | xlators/nfs/server/src/mount3.c | 4 | ||||
| -rw-r--r-- | xlators/nfs/server/src/nfs-common.c | 7 | ||||
| -rw-r--r-- | xlators/nfs/server/src/nfs-common.h | 3 | ||||
| -rw-r--r-- | xlators/nfs/server/src/nfs3-helpers.c | 11 | 
4 files changed, 15 insertions, 10 deletions
diff --git a/xlators/nfs/server/src/mount3.c b/xlators/nfs/server/src/mount3.c index 2647e384a94..48b719d29aa 100644 --- a/xlators/nfs/server/src/mount3.c +++ b/xlators/nfs/server/src/mount3.c @@ -1059,7 +1059,7 @@ __mnt3_resolve_export_subdir_comp (mnt3_resolve_t *mres)          nfs_loc_wipe (&mres->resolveloc);          ret = nfs_entry_loc_fill (mres->mstate->nfsx, mres->exp->vol->itable,                                    gfid, nextcomp, &mres->resolveloc, -                                  NFS_RESOLVE_CREATE); +                                  NFS_RESOLVE_CREATE, NULL);          if ((ret < 0) && (ret != -2)) {                  gf_msg (GF_MNT, GF_LOG_ERROR, EFAULT,                          NFS_MSG_RESOLVE_INODE_FAIL, "Failed to resolve and " @@ -1374,7 +1374,7 @@ __mnt3_resolve_subdir (mnt3_resolve_t *mres)          rootgfid[15] = 1;          ret = nfs_entry_loc_fill (mres->mstate->nfsx, mres->exp->vol->itable,                                    rootgfid, firstcomp, &mres->resolveloc, -                                  NFS_RESOLVE_CREATE); +                                  NFS_RESOLVE_CREATE, NULL);          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 d9ea1e1ac47..af37f6b264c 100644 --- a/xlators/nfs/server/src/nfs-common.c +++ b/xlators/nfs/server/src/nfs-common.c @@ -308,7 +308,7 @@ err:   */  int  nfs_entry_loc_fill (xlator_t *this, inode_table_t *itable, uuid_t pargfid, -                    char *entry, loc_t *loc, int how) +                    char *entry, loc_t *loc, int how, gf_boolean_t *freshlookup)  {          inode_t         *parent = NULL;          inode_t         *entryinode = NULL; @@ -337,8 +337,11 @@ nfs_entry_loc_fill (xlator_t *this, inode_table_t *itable, uuid_t pargfid,                           * that the caller can use the filled loc to call                           * lookup.                           */ -                        if (!entryinode) +                        if (!entryinode) {                                  entryinode = inode_new (itable); +                                if (freshlookup) +                                        *freshlookup = _gf_true; +                        }                          /* 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 77bdfb0bbf0..8c9a1e33457 100644 --- a/xlators/nfs/server/src/nfs-common.h +++ b/xlators/nfs/server/src/nfs-common.h @@ -57,7 +57,8 @@ nfs_ino_loc_fill (inode_table_t *itable, uuid_t gfid, loc_t *l);  extern int  nfs_entry_loc_fill (xlator_t *this, inode_table_t *itable, uuid_t pargfid, -                    char *entry, loc_t *loc, int how); +                    char *entry, loc_t *loc, int how, +                    gf_boolean_t *freshlookup);  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 5ed57bde0e2..0b977092fbb 100644 --- a/xlators/nfs/server/src/nfs3-helpers.c +++ b/xlators/nfs/server/src/nfs3-helpers.c @@ -3757,8 +3757,9 @@ out:  int  nfs3_fh_resolve_entry_hard (nfs3_call_state_t *cs)  { -        int             ret = -EFAULT; -        nfs_user_t      nfu = {0, }; +        int                     ret             = -EFAULT; +        nfs_user_t              nfu             = {0, }; +        gf_boolean_t            freshlookup     = _gf_false;          if (!cs)                  return ret; @@ -3771,7 +3772,7 @@ nfs3_fh_resolve_entry_hard (nfs3_call_state_t *cs)          ret = nfs_entry_loc_fill (cs->nfsx, cs->vol->itable, cs->resolvefh.gfid,                                    cs->resolventry, &cs->resolvedloc, -                                  NFS_RESOLVE_CREATE); +                                  NFS_RESOLVE_CREATE, &freshlookup);          if (ret == -2) {                  gf_msg_trace (GF_NFS3, 0, "Entry needs lookup: %s", @@ -3782,8 +3783,8 @@ nfs3_fh_resolve_entry_hard (nfs3_call_state_t *cs)  		 * go ahead in the resume callback so that an EEXIST gets  		 * handled at posix without an extra fop at this point.  		 */ -                if (nfs3_lookup_op (cs) || -		    (nfs3_create_op (cs) && !nfs3_create_exclusive_op (cs))) { +                if (freshlookup && (nfs3_lookup_op (cs) || +		    (nfs3_create_op (cs) && !nfs3_create_exclusive_op (cs)))) {                          cs->lookuptype = GF_NFS3_FRESH;                          cs->resolve_ret = 0;                          cs->hardresolved = 0;  | 
