Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

nfsd: move some of fh_compose into helper functions

parent 557ce264
Loading
Loading
Loading
Loading
+45 −38
Original line number Original line Diff line number Diff line
@@ -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:
			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;
@@ -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: