Commit 8e498751 authored by J. Bruce Fields's avatar J. Bruce Fields

nfsd: move some of fh_compose into helper functions

Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
parent 557ce264
...@@ -397,6 +397,40 @@ static inline void _fh_update_old(struct dentry *dentry, ...@@ -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)
...@@ -414,8 +448,7 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, ...@@ -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),
...@@ -447,49 +480,24 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, ...@@ -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; goto retry;
break;
case FSID_UUID8:
case FSID_UUID16:
if (!root_export)
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;
...@@ -639,8 +647,7 @@ enum fsid_source fsid_source(struct svc_fh *fhp) ...@@ -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:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment