Loading fs/nfsd/nfsfh.c +41 −36 Original line number Original line Diff line number Diff line Loading @@ -431,43 +431,17 @@ static bool fsid_type_ok_for_exp(u8 fsid_type, struct svc_export *exp) return 1; return 1; } } __be32 fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, struct svc_fh *ref_fh) { /* ref_fh is a reference file handle. * if it is non-null and for the same filesystem, then we should compose * a filehandle which is of the same version, where possible. * Currently, that means that if ref_fh->fh_handle.fh_version == 0xca * Then create a 32byte filehandle using nfs_fhbase_old * */ static void set_version_and_fsid_type(struct svc_fh *fhp, struct svc_export *exp, struct svc_fh *ref_fh) { u8 version; u8 version; u8 fsid_type = 0; u8 fsid_type; struct inode * inode = dentry->d_inode; struct dentry *parent = dentry->d_parent; __u32 *datap; dev_t ex_dev = exp_sb(exp)->s_dev; dprintk("nfsd: fh_compose(exp %02x:%02x/%ld %s/%s, ino=%ld)\n", MAJOR(ex_dev), MINOR(ex_dev), (long) exp->ex_path.dentry->d_inode->i_ino, parent->d_name.name, dentry->d_name.name, (inode ? inode->i_ino : 0)); /* Choose filehandle version and fsid type based on * the reference filehandle (if it is in the same export) * or the export options. */ retry: retry: version = 1; version = 1; if (ref_fh && ref_fh->fh_export == exp) { if (ref_fh && ref_fh->fh_export == exp) { version = ref_fh->fh_handle.fh_version; version = ref_fh->fh_handle.fh_version; fsid_type = ref_fh->fh_handle.fh_fsid_type; fsid_type = ref_fh->fh_handle.fh_fsid_type; if (ref_fh == fhp) fh_put(ref_fh); ref_fh = NULL; ref_fh = NULL; switch (version) { switch (version) { Loading Loading @@ -502,11 +476,44 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, else else fsid_type = FSID_UUID4_INUM; fsid_type = FSID_UUID4_INUM; } } } else if (!old_valid_dev(ex_dev)) } else if (!old_valid_dev(exp_sb(exp)->s_dev)) /* for newer device numbers, we must use a newer fsid format */ /* for newer device numbers, we must use a newer fsid format */ fsid_type = FSID_ENCODE_DEV; fsid_type = FSID_ENCODE_DEV; else else fsid_type = FSID_DEV; fsid_type = FSID_DEV; fhp->fh_handle.fh_version = version; if (version) fhp->fh_handle.fh_fsid_type = fsid_type; } __be32 fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, struct svc_fh *ref_fh) { /* ref_fh is a reference file handle. * if it is non-null and for the same filesystem, then we should compose * a filehandle which is of the same version, where possible. * Currently, that means that if ref_fh->fh_handle.fh_version == 0xca * Then create a 32byte filehandle using nfs_fhbase_old * */ struct inode * inode = dentry->d_inode; struct dentry *parent = dentry->d_parent; __u32 *datap; dev_t ex_dev = exp_sb(exp)->s_dev; dprintk("nfsd: fh_compose(exp %02x:%02x/%ld %s/%s, ino=%ld)\n", MAJOR(ex_dev), MINOR(ex_dev), (long) exp->ex_path.dentry->d_inode->i_ino, parent->d_name.name, dentry->d_name.name, (inode ? inode->i_ino : 0)); /* Choose filehandle version and fsid type based on * the reference filehandle (if it is in the same export) * or the export options. */ set_version_and_fsid_type(fhp, exp, ref_fh); if (ref_fh == fhp) if (ref_fh == fhp) fh_put(ref_fh); fh_put(ref_fh); Loading @@ -524,7 +531,7 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, fhp->fh_export = exp; fhp->fh_export = exp; cache_get(&exp->h); cache_get(&exp->h); if (version == 0xca) { if (fhp->fh_handle.fh_version == 0xca) { /* old style filehandle please */ /* old style filehandle please */ memset(&fhp->fh_handle.fh_base, 0, NFS_FHSIZE); memset(&fhp->fh_handle.fh_base, 0, NFS_FHSIZE); fhp->fh_handle.fh_size = NFS_FHSIZE; fhp->fh_handle.fh_size = NFS_FHSIZE; Loading @@ -538,15 +545,13 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, _fh_update_old(dentry, exp, &fhp->fh_handle); _fh_update_old(dentry, exp, &fhp->fh_handle); } else { } else { int len; int len; fhp->fh_handle.fh_version = 1; fhp->fh_handle.fh_auth_type = 0; fhp->fh_handle.fh_auth_type = 0; datap = fhp->fh_handle.fh_auth+0; datap = fhp->fh_handle.fh_auth+0; fhp->fh_handle.fh_fsid_type = fsid_type; mk_fsid(fhp->fh_handle.fh_fsid_type, datap, ex_dev, mk_fsid(fsid_type, datap, ex_dev, exp->ex_path.dentry->d_inode->i_ino, exp->ex_path.dentry->d_inode->i_ino, exp->ex_fsid, exp->ex_uuid); exp->ex_fsid, exp->ex_uuid); len = key_len(fsid_type); len = key_len(fhp->fh_handle.fh_fsid_type); datap += len/4; datap += len/4; fhp->fh_handle.fh_size = 4 + len; fhp->fh_handle.fh_size = 4 + len; Loading Loading
fs/nfsd/nfsfh.c +41 −36 Original line number Original line Diff line number Diff line Loading @@ -431,43 +431,17 @@ static bool fsid_type_ok_for_exp(u8 fsid_type, struct svc_export *exp) return 1; return 1; } } __be32 fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, struct svc_fh *ref_fh) { /* ref_fh is a reference file handle. * if it is non-null and for the same filesystem, then we should compose * a filehandle which is of the same version, where possible. * Currently, that means that if ref_fh->fh_handle.fh_version == 0xca * Then create a 32byte filehandle using nfs_fhbase_old * */ static void set_version_and_fsid_type(struct svc_fh *fhp, struct svc_export *exp, struct svc_fh *ref_fh) { u8 version; u8 version; u8 fsid_type = 0; u8 fsid_type; struct inode * inode = dentry->d_inode; struct dentry *parent = dentry->d_parent; __u32 *datap; dev_t ex_dev = exp_sb(exp)->s_dev; dprintk("nfsd: fh_compose(exp %02x:%02x/%ld %s/%s, ino=%ld)\n", MAJOR(ex_dev), MINOR(ex_dev), (long) exp->ex_path.dentry->d_inode->i_ino, parent->d_name.name, dentry->d_name.name, (inode ? inode->i_ino : 0)); /* Choose filehandle version and fsid type based on * the reference filehandle (if it is in the same export) * or the export options. */ retry: retry: version = 1; version = 1; if (ref_fh && ref_fh->fh_export == exp) { if (ref_fh && ref_fh->fh_export == exp) { version = ref_fh->fh_handle.fh_version; version = ref_fh->fh_handle.fh_version; fsid_type = ref_fh->fh_handle.fh_fsid_type; fsid_type = ref_fh->fh_handle.fh_fsid_type; if (ref_fh == fhp) fh_put(ref_fh); ref_fh = NULL; ref_fh = NULL; switch (version) { switch (version) { Loading Loading @@ -502,11 +476,44 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, else else fsid_type = FSID_UUID4_INUM; fsid_type = FSID_UUID4_INUM; } } } else if (!old_valid_dev(ex_dev)) } else if (!old_valid_dev(exp_sb(exp)->s_dev)) /* for newer device numbers, we must use a newer fsid format */ /* for newer device numbers, we must use a newer fsid format */ fsid_type = FSID_ENCODE_DEV; fsid_type = FSID_ENCODE_DEV; else else fsid_type = FSID_DEV; fsid_type = FSID_DEV; fhp->fh_handle.fh_version = version; if (version) fhp->fh_handle.fh_fsid_type = fsid_type; } __be32 fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, struct svc_fh *ref_fh) { /* ref_fh is a reference file handle. * if it is non-null and for the same filesystem, then we should compose * a filehandle which is of the same version, where possible. * Currently, that means that if ref_fh->fh_handle.fh_version == 0xca * Then create a 32byte filehandle using nfs_fhbase_old * */ struct inode * inode = dentry->d_inode; struct dentry *parent = dentry->d_parent; __u32 *datap; dev_t ex_dev = exp_sb(exp)->s_dev; dprintk("nfsd: fh_compose(exp %02x:%02x/%ld %s/%s, ino=%ld)\n", MAJOR(ex_dev), MINOR(ex_dev), (long) exp->ex_path.dentry->d_inode->i_ino, parent->d_name.name, dentry->d_name.name, (inode ? inode->i_ino : 0)); /* Choose filehandle version and fsid type based on * the reference filehandle (if it is in the same export) * or the export options. */ set_version_and_fsid_type(fhp, exp, ref_fh); if (ref_fh == fhp) if (ref_fh == fhp) fh_put(ref_fh); fh_put(ref_fh); Loading @@ -524,7 +531,7 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, fhp->fh_export = exp; fhp->fh_export = exp; cache_get(&exp->h); cache_get(&exp->h); if (version == 0xca) { if (fhp->fh_handle.fh_version == 0xca) { /* old style filehandle please */ /* old style filehandle please */ memset(&fhp->fh_handle.fh_base, 0, NFS_FHSIZE); memset(&fhp->fh_handle.fh_base, 0, NFS_FHSIZE); fhp->fh_handle.fh_size = NFS_FHSIZE; fhp->fh_handle.fh_size = NFS_FHSIZE; Loading @@ -538,15 +545,13 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, _fh_update_old(dentry, exp, &fhp->fh_handle); _fh_update_old(dentry, exp, &fhp->fh_handle); } else { } else { int len; int len; fhp->fh_handle.fh_version = 1; fhp->fh_handle.fh_auth_type = 0; fhp->fh_handle.fh_auth_type = 0; datap = fhp->fh_handle.fh_auth+0; datap = fhp->fh_handle.fh_auth+0; fhp->fh_handle.fh_fsid_type = fsid_type; mk_fsid(fhp->fh_handle.fh_fsid_type, datap, ex_dev, mk_fsid(fsid_type, datap, ex_dev, exp->ex_path.dentry->d_inode->i_ino, exp->ex_path.dentry->d_inode->i_ino, exp->ex_fsid, exp->ex_uuid); exp->ex_fsid, exp->ex_uuid); len = key_len(fsid_type); len = key_len(fhp->fh_handle.fh_fsid_type); datap += len/4; datap += len/4; fhp->fh_handle.fh_size = 4 + len; fhp->fh_handle.fh_size = 4 + len; Loading