diff options
| -rw-r--r-- | xlators/nfs/server/src/nfs3-fh.c | 4 | ||||
| -rw-r--r-- | xlators/nfs/server/src/nfs3-helpers.c | 31 | 
2 files changed, 24 insertions, 11 deletions
diff --git a/xlators/nfs/server/src/nfs3-fh.c b/xlators/nfs/server/src/nfs3-fh.c index 5a5d9aaa6e4..7a7a06da058 100644 --- a/xlators/nfs/server/src/nfs3-fh.c +++ b/xlators/nfs/server/src/nfs3-fh.c @@ -276,6 +276,10 @@ nfs3_fh_compute_size (struct nfs3_fh *fh)          return fhlen;  } + +/* There is no point searching at a directory level which is beyond that of + * the hashcount given in the file handle. + */  int  nfs3_fh_hash_index_is_beyond (struct nfs3_fh *fh, int hashidx)  { diff --git a/xlators/nfs/server/src/nfs3-helpers.c b/xlators/nfs/server/src/nfs3-helpers.c index 35dd0ae02ca..653b6ecaf5c 100644 --- a/xlators/nfs/server/src/nfs3-helpers.c +++ b/xlators/nfs/server/src/nfs3-helpers.c @@ -2507,8 +2507,8 @@ nfs3_fh_resolve_check_entry (struct nfs3_fh *fh, gf_dirent_t *candidate,          ia = &candidate->d_stat;          if ((ia->ia_gen == fh->gen) && (ia->ia_ino == fh->ino)) {                  gf_log (GF_NFS3, GF_LOG_TRACE, "Found entry: gen: %"PRId64 -                        " ino: %"PRId64", name: %s", ia->ia_gen, ia->ia_ino, -                        candidate->d_name); +                        " ino: %"PRId64", name: %s, hashcount %d", ia->ia_gen, +                        ia->ia_ino, candidate->d_name, hashidx);                  ret = GF_NFS3_FHRESOLVE_FOUND;                  goto found_entry;          } @@ -2522,8 +2522,8 @@ nfs3_fh_resolve_check_entry (struct nfs3_fh *fh, gf_dirent_t *candidate,                  goto found_entry;          entryhash = fh->entryhash[hashidx];          if (entryhash == nfs3_fh_hash_entry (ia->ia_ino, ia->ia_gen)) { -                gf_log (GF_NFS3, GF_LOG_TRACE, "Found hash match: %s: %d", -                        candidate->d_name, entryhash); +                gf_log (GF_NFS3, GF_LOG_TRACE, "Found hash match: %s: %d, " +                        "hashidx: %d", candidate->d_name, entryhash, hashidx);                  ret = GF_NFS3_FHRESOLVE_DIRFOUND;                  goto found_entry;          } @@ -2776,7 +2776,7 @@ nfs3_fh_resolve_dir_hard (nfs3_call_state_t *cs, uint64_t ino, uint64_t gen,          nfs_user_root_create (&nfu);          gf_log (GF_NFS3, GF_LOG_TRACE, "FH hard dir resolution: ino:" -                " %"PRIu64", gen: %"PRIu64", entry: %s, hashidx: %d", +                " %"PRIu64", gen: %"PRIu64", entry: %s, next hashcount: %d",                  ino, gen, entry, cs->hashidx);          ret = nfs_entry_loc_fill (cs->vol->itable, ino, gen, entry,                                    &cs->resolvedloc, NFS_RESOLVE_CREATE); @@ -2922,16 +2922,18 @@ nfs3_fh_resolve_inode_hard (nfs3_call_state_t *cs)          nfs_loc_wipe (&cs->resolvedloc);          if (nfs3_fh_hash_index_is_beyond (&cs->resolvefh, cs->hashidx)) {                  gf_log (GF_NFS3, GF_LOG_TRACE, "Hash index is beyond: idx %d, " -                        " fh idx: %d", cs->hashidx, cs->resolvefh.hashcount); +                        " fh hashcount: %d", cs->hashidx, +                        cs->resolvefh.hashcount);                  nfs3_call_resume_estale (cs);                  ret = 0;                  goto out;          }          nfs_user_root_create (&nfu); -        gf_log (GF_NFS3, GF_LOG_TRACE, "FH hard resolution: ino:" -                " %"PRIu64", gen: %"PRIu64", hashidx: %d", cs->resolvefh.ino, -                cs->resolvefh.gen, cs->hashidx); +        gf_log (GF_NFS3, GF_LOG_TRACE, "FH hard resolution for: ino:" +                " %"PRIu64", gen: %"PRIu64", hashcount: %d, current hashidx " +                "%d", cs->resolvefh.ino, cs->resolvefh.gen, +                cs->resolvefh.hashcount, cs->hashidx);          ret = nfs_ino_loc_fill (cs->vol->itable, 1, 0, &cs->resolvedloc);          if (ret == 0) { @@ -3040,9 +3042,16 @@ nfs3_fh_resolve_and_resume (nfs3_call_state_t *cs, struct nfs3_fh *fh,          cs->resolvefh = *fh;          cs->hashidx = 0; -        if (!entry) +        /* Check if the resolution is: +         * a. fh resolution +         * +         * or +         * +         * b. (fh, basename) resolution +         */ +        if (!entry)     /* a */                  ret = nfs3_fh_resolve_inode (cs); -        else { +        else {          /* b */                  cs->resolventry = gf_strdup (entry);                  if (!cs->resolventry)                          goto err;  | 
