Loading fs/nfsd/nfsfh.c +45 −38 Original line number Original line Diff line number Diff line Loading @@ -397,6 +397,40 @@ static inline void _fh_update_old(struct dentry *dentry, fh->ofh_dirino = 0; fh->ofh_dirino = 0; } } static bool is_root_export(struct svc_export *exp) { return exp->ex_path.dentry == exp->ex_path.dentry->d_sb->s_root; } static struct super_block *exp_sb(struct svc_export *exp) { return exp->ex_path.dentry->d_inode->i_sb; } static bool fsid_type_ok_for_exp(u8 fsid_type, struct svc_export *exp) { switch (fsid_type) { case FSID_DEV: if (!old_valid_dev(exp_sb(exp)->s_dev)) return 0; /* FALL THROUGH */ case FSID_MAJOR_MINOR: case FSID_ENCODE_DEV: return exp_sb(exp)->s_type->fs_flags & FS_REQUIRES_DEV; case FSID_NUM: return exp->ex_flags & NFSEXP_FSID; case FSID_UUID8: case FSID_UUID16: if (!is_root_export(exp)) return 0; /* fall through */ case FSID_UUID4_INUM: case FSID_UUID16_INUM: return exp->ex_uuid != NULL; } return 1; } __be32 __be32 fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, struct svc_fh *ref_fh) struct svc_fh *ref_fh) Loading @@ -414,8 +448,7 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, struct inode * inode = dentry->d_inode; struct inode * inode = dentry->d_inode; struct dentry *parent = dentry->d_parent; struct dentry *parent = dentry->d_parent; __u32 *datap; __u32 *datap; dev_t ex_dev = exp->ex_path.dentry->d_inode->i_sb->s_dev; dev_t ex_dev = exp_sb(exp)->s_dev; int root_export = (exp->ex_path.dentry == exp->ex_path.dentry->d_sb->s_root); dprintk("nfsd: fh_compose(exp %02x:%02x/%ld %s/%s, ino=%ld)\n", dprintk("nfsd: fh_compose(exp %02x:%02x/%ld %s/%s, ino=%ld)\n", MAJOR(ex_dev), MINOR(ex_dev), MAJOR(ex_dev), MINOR(ex_dev), Loading Loading @@ -447,49 +480,24 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, goto retry; goto retry; } } /* Need to check that this type works for this /* * export point. As the fsid -> filesystem mapping * As the fsid -> filesystem mapping was guided by * was guided by user-space, there is no guarantee * user-space, there is no guarantee that the filesystem * that the filesystem actually supports that fsid * actually supports that fsid type. If it doesn't we * type. If it doesn't we loop around again without * loop around again without ref_fh set. * ref_fh set. */ */ switch(fsid_type) { if (!fsid_type_ok_for_exp(fsid_type, exp)) case FSID_DEV: if (!old_valid_dev(ex_dev)) goto retry; /* FALL THROUGH */ case FSID_MAJOR_MINOR: case FSID_ENCODE_DEV: if (!(exp->ex_path.dentry->d_inode->i_sb->s_type->fs_flags & FS_REQUIRES_DEV)) goto retry; break; case FSID_NUM: if (! (exp->ex_flags & NFSEXP_FSID)) goto retry; break; case FSID_UUID8: case FSID_UUID16: if (!root_export) goto retry; goto retry; /* fall through */ case FSID_UUID4_INUM: case FSID_UUID16_INUM: if (exp->ex_uuid == NULL) goto retry; break; } } else if (exp->ex_flags & NFSEXP_FSID) { } else if (exp->ex_flags & NFSEXP_FSID) { fsid_type = FSID_NUM; fsid_type = FSID_NUM; } else if (exp->ex_uuid) { } else if (exp->ex_uuid) { if (fhp->fh_maxsize >= 64) { if (fhp->fh_maxsize >= 64) { if (root_export) if (is_root_export(exp)) fsid_type = FSID_UUID16; fsid_type = FSID_UUID16; else else fsid_type = FSID_UUID16_INUM; fsid_type = FSID_UUID16_INUM; } else { } else { if (root_export) if (is_root_export(exp)) fsid_type = FSID_UUID8; fsid_type = FSID_UUID8; else else fsid_type = FSID_UUID4_INUM; fsid_type = FSID_UUID4_INUM; Loading Loading @@ -639,8 +647,7 @@ enum fsid_source fsid_source(struct svc_fh *fhp) case FSID_DEV: case FSID_DEV: case FSID_ENCODE_DEV: case FSID_ENCODE_DEV: case FSID_MAJOR_MINOR: case FSID_MAJOR_MINOR: if (fhp->fh_export->ex_path.dentry->d_inode->i_sb->s_type->fs_flags if (exp_sb(fhp->fh_export)->s_type->fs_flags & FS_REQUIRES_DEV) & FS_REQUIRES_DEV) return FSIDSOURCE_DEV; return FSIDSOURCE_DEV; break; break; case FSID_NUM: case FSID_NUM: Loading Loading
fs/nfsd/nfsfh.c +45 −38 Original line number Original line Diff line number Diff line Loading @@ -397,6 +397,40 @@ static inline void _fh_update_old(struct dentry *dentry, fh->ofh_dirino = 0; fh->ofh_dirino = 0; } } static bool is_root_export(struct svc_export *exp) { return exp->ex_path.dentry == exp->ex_path.dentry->d_sb->s_root; } static struct super_block *exp_sb(struct svc_export *exp) { return exp->ex_path.dentry->d_inode->i_sb; } static bool fsid_type_ok_for_exp(u8 fsid_type, struct svc_export *exp) { switch (fsid_type) { case FSID_DEV: if (!old_valid_dev(exp_sb(exp)->s_dev)) return 0; /* FALL THROUGH */ case FSID_MAJOR_MINOR: case FSID_ENCODE_DEV: return exp_sb(exp)->s_type->fs_flags & FS_REQUIRES_DEV; case FSID_NUM: return exp->ex_flags & NFSEXP_FSID; case FSID_UUID8: case FSID_UUID16: if (!is_root_export(exp)) return 0; /* fall through */ case FSID_UUID4_INUM: case FSID_UUID16_INUM: return exp->ex_uuid != NULL; } return 1; } __be32 __be32 fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, struct svc_fh *ref_fh) struct svc_fh *ref_fh) Loading @@ -414,8 +448,7 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, struct inode * inode = dentry->d_inode; struct inode * inode = dentry->d_inode; struct dentry *parent = dentry->d_parent; struct dentry *parent = dentry->d_parent; __u32 *datap; __u32 *datap; dev_t ex_dev = exp->ex_path.dentry->d_inode->i_sb->s_dev; dev_t ex_dev = exp_sb(exp)->s_dev; int root_export = (exp->ex_path.dentry == exp->ex_path.dentry->d_sb->s_root); dprintk("nfsd: fh_compose(exp %02x:%02x/%ld %s/%s, ino=%ld)\n", dprintk("nfsd: fh_compose(exp %02x:%02x/%ld %s/%s, ino=%ld)\n", MAJOR(ex_dev), MINOR(ex_dev), MAJOR(ex_dev), MINOR(ex_dev), Loading Loading @@ -447,49 +480,24 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, goto retry; goto retry; } } /* Need to check that this type works for this /* * export point. As the fsid -> filesystem mapping * As the fsid -> filesystem mapping was guided by * was guided by user-space, there is no guarantee * user-space, there is no guarantee that the filesystem * that the filesystem actually supports that fsid * actually supports that fsid type. If it doesn't we * type. If it doesn't we loop around again without * loop around again without ref_fh set. * ref_fh set. */ */ switch(fsid_type) { if (!fsid_type_ok_for_exp(fsid_type, exp)) case FSID_DEV: if (!old_valid_dev(ex_dev)) goto retry; /* FALL THROUGH */ case FSID_MAJOR_MINOR: case FSID_ENCODE_DEV: if (!(exp->ex_path.dentry->d_inode->i_sb->s_type->fs_flags & FS_REQUIRES_DEV)) goto retry; break; case FSID_NUM: if (! (exp->ex_flags & NFSEXP_FSID)) goto retry; break; case FSID_UUID8: case FSID_UUID16: if (!root_export) goto retry; goto retry; /* fall through */ case FSID_UUID4_INUM: case FSID_UUID16_INUM: if (exp->ex_uuid == NULL) goto retry; break; } } else if (exp->ex_flags & NFSEXP_FSID) { } else if (exp->ex_flags & NFSEXP_FSID) { fsid_type = FSID_NUM; fsid_type = FSID_NUM; } else if (exp->ex_uuid) { } else if (exp->ex_uuid) { if (fhp->fh_maxsize >= 64) { if (fhp->fh_maxsize >= 64) { if (root_export) if (is_root_export(exp)) fsid_type = FSID_UUID16; fsid_type = FSID_UUID16; else else fsid_type = FSID_UUID16_INUM; fsid_type = FSID_UUID16_INUM; } else { } else { if (root_export) if (is_root_export(exp)) fsid_type = FSID_UUID8; fsid_type = FSID_UUID8; else else fsid_type = FSID_UUID4_INUM; fsid_type = FSID_UUID4_INUM; Loading Loading @@ -639,8 +647,7 @@ enum fsid_source fsid_source(struct svc_fh *fhp) case FSID_DEV: case FSID_DEV: case FSID_ENCODE_DEV: case FSID_ENCODE_DEV: case FSID_MAJOR_MINOR: case FSID_MAJOR_MINOR: if (fhp->fh_export->ex_path.dentry->d_inode->i_sb->s_type->fs_flags if (exp_sb(fhp->fh_export)->s_type->fs_flags & FS_REQUIRES_DEV) & FS_REQUIRES_DEV) return FSIDSOURCE_DEV; return FSIDSOURCE_DEV; break; break; case FSID_NUM: case FSID_NUM: Loading