diff options
| author | Shehjar Tikoo <shehjart@gluster.com> | 2010-09-14 02:39:11 +0000 | 
|---|---|---|
| committer | Vijay Bellur <vijay@dev.gluster.com> | 2010-09-14 02:32:03 -0700 | 
| commit | 9ff89d858075d8f916c76a9ade84b9844da4d23e (patch) | |
| tree | 535ea0f8456078a74eeeb920edc646cf58c9beee /xlators/nfs/server/src/nfs3-fh.c | |
| parent | 2152dae595438b919fbcb7349d15ead139e120d8 (diff) | |
nfs,nfs3,mnt3: Transition fh resolution to gfid
Signed-off-by: Shehjar Tikoo <shehjart@gluster.com>
Signed-off-by: Vijay Bellur <vijay@dev.gluster.com>
BUG: 971 (dynamic volume management)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=971
Diffstat (limited to 'xlators/nfs/server/src/nfs3-fh.c')
| -rw-r--r-- | xlators/nfs/server/src/nfs3-fh.c | 83 | 
1 files changed, 45 insertions, 38 deletions
diff --git a/xlators/nfs/server/src/nfs3-fh.c b/xlators/nfs/server/src/nfs3-fh.c index 7a7a06da058..10c00ba3287 100644 --- a/xlators/nfs/server/src/nfs3-fh.c +++ b/xlators/nfs/server/src/nfs3-fh.c @@ -49,15 +49,6 @@ nfs3_fh_validate (struct nfs3_fh *fh)  } -xlator_t * -nfs3_fh_to_xlator (xlator_list_t *cl, struct nfs3_fh *fh) -{ -	if ((!cl) || (!fh)) -		return NULL; - -	return nfs_xlid_to_xlator (cl, fh->xlatorid); -} -  void  nfs3_fh_init (struct nfs3_fh *fh, struct iatt *buf)  { @@ -68,24 +59,35 @@ nfs3_fh_init (struct nfs3_fh *fh, struct iatt *buf)          fh->ident[1] = GF_NFSFH_IDENT1;          fh->hashcount = 0; -        fh->gen = buf->ia_gen; -        fh->ino = buf->ia_ino; - +        uuid_copy (fh->gfid, buf->ia_gfid);  }  struct nfs3_fh -nfs3_fh_build_root_fh (xlator_list_t *cl, xlator_t *xl) +nfs3_fh_build_indexed_root_fh (xlator_list_t *cl, xlator_t *xl)  {          struct nfs3_fh  fh = {{0}, };          struct iatt     buf = {0, };          if ((!cl) || (!xl))                  return fh; +        buf.ia_gfid[15] = 1;          nfs3_fh_init (&fh, &buf); -        fh.xlatorid = nfs_xlator_to_xlid (cl, xl); -        fh.ino = 1; -        fh.gen = 0; +        fh.exportid [15] = nfs_xlator_to_xlid (cl, xl); + +        return fh; +} + + +struct nfs3_fh +nfs3_fh_build_uuid_root_fh (uuid_t volumeid) +{ +        struct nfs3_fh  fh = {{0}, }; +        struct iatt     buf = {0, }; + +        nfs3_fh_init (&fh, &buf); +        uuid_copy (fh.exportid, volumeid); +          return fh;  } @@ -93,10 +95,13 @@ nfs3_fh_build_root_fh (xlator_list_t *cl, xlator_t *xl)  int  nfs3_fh_is_root_fh (struct nfs3_fh *fh)  { +        uuid_t  rootgfid = {0, 1}; +          if (!fh)                  return 0; -        if (fh->hashcount == 0) +        rootgfid[15] = 1; +        if (uuid_compare (fh->gfid, rootgfid) == 0)                  return 1;          return 0; @@ -104,10 +109,12 @@ nfs3_fh_is_root_fh (struct nfs3_fh *fh)  nfs3_hash_entry_t -nfs3_fh_hash_entry (ino_t ino, uint64_t gen) +nfs3_fh_hash_entry (uuid_t gfid)  {          nfs3_hash_entry_t       hash = 0;          int                     shiftsize = 48; +        uint64_t                ino = 0; +        uint64_t                gen = 0;          nfs3_hash_entry_t       inomsb = 0;          nfs3_hash_entry_t       inolsb = 0;          nfs3_hash_entry_t       inols23b = 0; @@ -116,6 +123,7 @@ nfs3_fh_hash_entry (ino_t ino, uint64_t gen)          nfs3_hash_entry_t       genlsb = 0;          nfs3_hash_entry_t       genls23b = 0; +        memcpy (&ino, &gfid[8], 8);          hash = ino;          while (shiftsize != 0) {                  hash ^= (ino >> shiftsize); @@ -139,6 +147,7 @@ nfs3_fh_hash_entry (ino_t ino, uint64_t gen)          inols23b = (inols23b << 8);  //        gf_log ("FILEHDNALE", GF_LOG_TRACE, "inols23b  %d", inols23b); +        memcpy (&gen, &gfid[0], 8);          genmsb = (gen >> 56);  //        gf_log ("FILEHANDLE", GF_LOG_TRACE, "inomsb %d", inomsb); @@ -163,11 +172,16 @@ nfs3_fh_hash_entry (ino_t ino, uint64_t gen)  void  nfs3_fh_to_str (struct nfs3_fh *fh, char *str)  { +        char            gfid[512]; +        char            exportid[512]; +          if ((!fh) || (!str))                  return; -        sprintf (str, "FH: hashcount %d, xlid %d, gen %"PRIu64", ino %"PRIu64, -                 fh->hashcount, fh->xlatorid, fh->gen, fh->ino); +        uuid_unparse (fh->gfid, gfid); +        uuid_unparse (fh->exportid, exportid); +        sprintf (str, "FH: hashcount %d, exportid %s, gfid %s", +                 fh->hashcount, exportid, gfid);  } @@ -175,12 +189,16 @@ void  nfs3_log_fh (struct nfs3_fh *fh)  {  //        int     x = 0; +        char    gfidstr[512]; +        char    exportidstr[512]; +          if (!fh)                  return; -        gf_log ("nfs3-fh", GF_LOG_TRACE, "filehandle: hashcount %d, xlid %d, " -                "gen %"PRIu64", ino %"PRIu64, fh->hashcount, fh->xlatorid, -                fh->gen, fh->ino); +        uuid_unparse (fh->gfid, gfidstr); +        uuid_unparse (fh->exportid, exportidstr); +        gf_log ("nfs3-fh", GF_LOG_TRACE, "filehandle: hashcount %d, exportid %d" +                ", gfid 0x%s", fh->hashcount, exportidstr, gfidstr);  /*          for (; x < fh->hashcount; ++x)                  gf_log ("FILEHANDLE", GF_LOG_TRACE, "Hash %d: %d", x, @@ -197,12 +215,9 @@ nfs3_fh_build_parent_fh (struct nfs3_fh *child, struct iatt *newstat,                  return -1;          nfs3_fh_init (newfh, newstat); -        newfh->xlatorid = child->xlatorid; -        if ((newstat->ia_ino == 1) && (newstat->ia_gen == 0)) { -                newfh->ino = 1; -                newfh->gen = 0; +        uuid_copy (newfh->exportid, child->exportid); +        if (newstat->ia_ino == 1)                  goto done; -        }          newfh->hashcount = child->hashcount - 1;          memcpy (newfh->entryhash, child->entryhash, @@ -215,7 +230,6 @@ done:  } -  int  nfs3_fh_build_child_fh (struct nfs3_fh *parent, struct iatt *newstat,                          struct nfs3_fh *newfh) @@ -227,12 +241,7 @@ nfs3_fh_build_child_fh (struct nfs3_fh *parent, struct iatt *newstat,                  return -1;          nfs3_fh_init (newfh, newstat); -        newfh->xlatorid = parent->xlatorid; -        if ((newstat->ia_ino == 1) && (newstat->ia_gen == 0)) { -                newfh->ino = 1; -                newfh->gen = 0; -                goto done; -        } +        uuid_copy (newfh->exportid, parent->exportid);          newfh->hashcount = parent->hashcount + 1;          /* Only copy the hashes that are available in the parent file @@ -249,11 +258,9 @@ nfs3_fh_build_child_fh (struct nfs3_fh *parent, struct iatt *newstat,           * array of the child entry. */          if (newfh->hashcount <= GF_NFSFH_MAXHASHES) {                  entry = newfh->hashcount - 1; -                newfh->entryhash[entry] = nfs3_fh_hash_entry (parent->ino, -                                                              parent->gen); +                newfh->entryhash[entry] = nfs3_fh_hash_entry (parent->gfid);          } -done:  //        nfs3_log_fh (newfh);          return 0;  | 
