diff options
Diffstat (limited to 'xlators/nfs/server/src')
| -rw-r--r-- | xlators/nfs/server/src/nfs-common.c | 32 | ||||
| -rw-r--r-- | xlators/nfs/server/src/nfs-common.h | 3 | ||||
| -rw-r--r-- | xlators/nfs/server/src/nfs.c | 26 | ||||
| -rw-r--r-- | xlators/nfs/server/src/nfs.h | 4 | ||||
| -rw-r--r-- | xlators/nfs/server/src/nfs3-helpers.c | 10 | 
5 files changed, 73 insertions, 2 deletions
diff --git a/xlators/nfs/server/src/nfs-common.c b/xlators/nfs/server/src/nfs-common.c index 6628c297fcc..ef2d1d3fdf5 100644 --- a/xlators/nfs/server/src/nfs-common.c +++ b/xlators/nfs/server/src/nfs-common.c @@ -393,3 +393,35 @@ err:          return ret;  } + + +uint32_t +nfs_hash_gfid (uuid_t gfid) +{ +        uint32_t                hash = 0; +        uint64_t                msb64 = 0; +        uint64_t                lsb64 = 0; +        uint32_t                a1 = 0; +        uint32_t                a2 = 0; +        uint32_t                a3 = 0; +        uint32_t                a4 = 0; +        uint32_t                b1 = 0; +        uint32_t                b2 = 0; + +        memcpy (&msb64, &gfid[8], 8); +        memcpy (&lsb64, &gfid[0], 8); + +        a1 = (msb64 << 32); +        a2 = (msb64 >> 32); +        a3 = (lsb64 << 32); +        a4 = (lsb64 >> 32); + +        b1 = a1 ^ a4; +        b2 = a2 ^ a3; + +        hash = b1 ^ b2; + +        return hash; +} + + diff --git a/xlators/nfs/server/src/nfs-common.h b/xlators/nfs/server/src/nfs-common.h index 2c851b2d22c..ec46336a89b 100644 --- a/xlators/nfs/server/src/nfs-common.h +++ b/xlators/nfs/server/src/nfs-common.h @@ -76,4 +76,7 @@ nfs_entry_loc_fill (inode_table_t *itable, uuid_t pargfid, char *entry,  extern int  nfs_root_loc_fill (inode_table_t *itable, loc_t *loc); + +extern uint32_t +nfs_hash_gfid (uuid_t gfid);  #endif diff --git a/xlators/nfs/server/src/nfs.c b/xlators/nfs/server/src/nfs.c index 0afd85f51de..c81e48322ab 100644 --- a/xlators/nfs/server/src/nfs.c +++ b/xlators/nfs/server/src/nfs.c @@ -520,6 +520,25 @@ nfs_init_state (xlator_t *this)                          nfs->dynamicvolumes = GF_NFS_DVM_ON;          } +        nfs->enable_ino32 = 0; +        if (dict_get (this->options, "nfs.enable-ino32")) { +                ret = dict_get_str (this->options, "nfs.enable-ino32", +                                    &optstr); +                if (ret < 0) { +                        gf_log (GF_NFS, GF_LOG_ERROR, "Failed to parse dict"); +                        goto free_foppool; +                } + +                ret = gf_string2boolean (optstr, &boolt); +                if (ret < 0) { +                        gf_log (GF_NFS, GF_LOG_ERROR, "Failed to parse bool " +                                "string"); +                        goto free_foppool; +                } + +                if (boolt == _gf_true) +                        nfs->enable_ino32 = 1; +        }          this->private = (void *)nfs;          INIT_LIST_HEAD (&nfs->versions); @@ -802,6 +821,13 @@ struct volume_options options[] = {                           "If all subvolumes do not have this option set, an "                           "error is reported."          }, +        { .key  = {"nfs.enable-ino32"}, +          .type = GF_OPTION_TYPE_BOOL, +          .description = "For nfs clients or apps that do not support 64-bit " +                         "inode numbers, use this option to make NFS return " +                         "32-bit inode numbers instead. Disabled by default so " +                         "NFS returns 64-bit inode numbers by default." +        },  	{ .key  = {NULL} },  }; diff --git a/xlators/nfs/server/src/nfs.h b/xlators/nfs/server/src/nfs.h index 2464eb2b261..b6a1d4a46d3 100644 --- a/xlators/nfs/server/src/nfs.h +++ b/xlators/nfs/server/src/nfs.h @@ -72,10 +72,14 @@ struct nfs_state {          xlator_t                **initedxl;          int                     subvols_started;          int                     dynamicvolumes; +        int                     enable_ino32;  };  #define gf_nfs_dvm_on(nfsstt)   (((struct nfs_state *)nfsstt)->dynamicvolumes == GF_NFS_DVM_ON)  #define gf_nfs_dvm_off(nfsstt)  (((struct nfs_state *)nfsstt)->dynamicvolumes == GF_NFS_DVM_OFF) +#define __gf_nfs_enable_ino32(nfsstt)     (((struct nfs_state *)nfsstt)->enable_ino32) +#define gf_nfs_this_private     ((struct nfs_state *)((xlator_t *)THIS)->private) +#define gf_nfs_enable_ino32()     (__gf_nfs_enable_ino32(gf_nfs_this_private))  /* We have one gid more than the glusterfs maximum since we pass the primary   * gid as the first element of the array. diff --git a/xlators/nfs/server/src/nfs3-helpers.c b/xlators/nfs/server/src/nfs3-helpers.c index 2a8b1b5b114..298a5c858cf 100644 --- a/xlators/nfs/server/src/nfs3-helpers.c +++ b/xlators/nfs/server/src/nfs3-helpers.c @@ -99,11 +99,17 @@ nfs3_iatt_gfid_to_ino (struct iatt *buf)          if (!buf)                  return 0; -        if (buf->ia_ino != 1) +        if ((buf->ia_ino != 1) && (buf->ia_gfid[15] != 1)) { +                if (gf_nfs_enable_ino32()) { +                        ino = (uint32_t )nfs_hash_gfid (buf->ia_gfid); +                        goto hashout; +                } +                  memcpy (&ino, &buf->ia_gfid[8], sizeof (uint64_t)); -        else +        } else                  ino = 1; +hashout:          return ino;  }  | 
