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

Commit 6409a5a6 authored by J. Bruce Fields's avatar J. Bruce Fields
Browse files

nfsd4: clean up downgrading code



In response to some review comments, get rid of the somewhat obscure
for-loop with bitops, and improve a comment.

Reported-by: default avatarSteve Dickson <steved@redhat.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent 71c3bcd7
Loading
Loading
Loading
Loading
+22 −9
Original line number Diff line number Diff line
@@ -3523,16 +3523,29 @@ nfsd4_open_confirm(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
	return status;
}

static inline void nfs4_file_downgrade(struct nfs4_ol_stateid *stp, unsigned int to_access)
static inline void nfs4_stateid_downgrade_bit(struct nfs4_ol_stateid *stp, u32 access)
{
	int i;

	for (i = 1; i < 4; i++) {
		if (test_bit(i, &stp->st_access_bmap)
					&& ((i & to_access) != i)) {
			nfs4_file_put_access(stp->st_file, nfs4_access_to_omode(i));
			__clear_bit(i, &stp->st_access_bmap);
	if (!test_bit(access, &stp->st_access_bmap))
		return;
	nfs4_file_put_access(stp->st_file, nfs4_access_to_omode(access));
	__clear_bit(access, &stp->st_access_bmap);
}

static inline void nfs4_stateid_downgrade(struct nfs4_ol_stateid *stp, u32 to_access)
{
	switch (to_access) {
	case NFS4_SHARE_ACCESS_READ:
		nfs4_stateid_downgrade_bit(stp, NFS4_SHARE_ACCESS_WRITE);
		nfs4_stateid_downgrade_bit(stp, NFS4_SHARE_ACCESS_BOTH);
		break;
	case NFS4_SHARE_ACCESS_WRITE:
		nfs4_stateid_downgrade_bit(stp, NFS4_SHARE_ACCESS_READ);
		nfs4_stateid_downgrade_bit(stp, NFS4_SHARE_ACCESS_BOTH);
		break;
	case NFS4_SHARE_ACCESS_BOTH:
		break;
	default:
		BUG();
	}
}

@@ -3578,7 +3591,7 @@ nfsd4_open_downgrade(struct svc_rqst *rqstp,
			stp->st_deny_bmap, od->od_share_deny);
		goto out;
	}
	nfs4_file_downgrade(stp, od->od_share_access);
	nfs4_stateid_downgrade(stp, od->od_share_access);

	reset_union_bmap_deny(od->od_share_deny, &stp->st_deny_bmap);

+5 −3
Original line number Diff line number Diff line
@@ -403,9 +403,11 @@ struct nfs4_file {
	/* One each for O_RDONLY, O_WRONLY, O_RDWR: */
	struct file *		fi_fds[3];
	/*
	 * Each open or lock stateid contributes 1 to either
	 * fi_access[O_RDONLY], fi_access[O_WRONLY], or both, depending
	 * on open or lock mode:
	 * Each open or lock stateid contributes 0-4 to the counts
	 * below depending on which bits are set in st_access_bitmap:
	 *     1 to fi_access[O_RDONLY] if NFS4_SHARE_ACCES_READ is set
	 *   + 1 to fi_access[O_WRONLY] if NFS4_SHARE_ACCESS_WRITE is set
	 *   + 1 to both of the above if NFS4_SHARE_ACCESS_BOTH is set.
	 */
	atomic_t		fi_access[2];
	struct file		*fi_deleg_file;