nfsd: move some of fh_compose into helper functions
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
This commit is contained in:
@@ -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,
|
|||||||
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,
|
|||||||
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:
|
goto retry;
|
||||||
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;
|
|
||||||
/* 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)
|
|||||||
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:
|
||||||
|
Reference in New Issue
Block a user