Commit b9fa4cbd authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull nfsd fixes from Chuck Lever:

 - Fix in-kernel RPC UDP transport

 - Fix NFSv4.0 RELEASE_LOCKOWNER

* tag 'nfsd-6.8-1' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux:
  nfsd: fix RELEASE_LOCKOWNER
  SUNRPC: use request size to initialize bio_vec in svc_udp_sendto()
parents 3cb9871f edcf9725
Loading
Loading
Loading
Loading
+15 −11
Original line number Diff line number Diff line
@@ -7911,14 +7911,16 @@ check_for_locks(struct nfs4_file *fp, struct nfs4_lockowner *lowner)
{
	struct file_lock *fl;
	int status = false;
	struct nfsd_file *nf = find_any_file(fp);
	struct nfsd_file *nf;
	struct inode *inode;
	struct file_lock_context *flctx;

	spin_lock(&fp->fi_lock);
	nf = find_any_file_locked(fp);
	if (!nf) {
		/* Any valid lock stateid should have some sort of access */
		WARN_ON_ONCE(1);
		return status;
		goto out;
	}

	inode = file_inode(nf->nf_file);
@@ -7934,7 +7936,8 @@ check_for_locks(struct nfs4_file *fp, struct nfs4_lockowner *lowner)
		}
		spin_unlock(&flctx->flc_lock);
	}
	nfsd_file_put(nf);
out:
	spin_unlock(&fp->fi_lock);
	return status;
}

@@ -7944,10 +7947,8 @@ check_for_locks(struct nfs4_file *fp, struct nfs4_lockowner *lowner)
 * @cstate: NFSv4 COMPOUND state
 * @u: RELEASE_LOCKOWNER arguments
 *
 * The lockowner's so_count is bumped when a lock record is added
 * or when copying a conflicting lock. The latter case is brief,
 * but can lead to fleeting false positives when looking for
 * locks-in-use.
 * Check if theree are any locks still held and if not - free the lockowner
 * and any lock state that is owned.
 *
 * Return values:
 *   %nfs_ok: lockowner released or not found
@@ -7983,11 +7984,14 @@ nfsd4_release_lockowner(struct svc_rqst *rqstp,
		spin_unlock(&clp->cl_lock);
		return nfs_ok;
	}
	if (atomic_read(&lo->lo_owner.so_count) != 2) {

	list_for_each_entry(stp, &lo->lo_owner.so_stateids, st_perstateowner) {
		if (check_for_locks(stp->st_stid.sc_file, lo)) {
			spin_unlock(&clp->cl_lock);
			nfs4_put_stateowner(&lo->lo_owner);
			return nfserr_locks_held;
		}
	}
	unhash_lockowner_locked(lo);
	while (!list_empty(&lo->lo_owner.so_stateids)) {
		stp = list_first_entry(&lo->lo_owner.so_stateids,
+2 −2
Original line number Diff line number Diff line
@@ -717,12 +717,12 @@ static int svc_udp_sendto(struct svc_rqst *rqstp)
				ARRAY_SIZE(rqstp->rq_bvec), xdr);

	iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, rqstp->rq_bvec,
		      count, 0);
		      count, rqstp->rq_res.len);
	err = sock_sendmsg(svsk->sk_sock, &msg);
	if (err == -ECONNREFUSED) {
		/* ICMP error on earlier request. */
		iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, rqstp->rq_bvec,
			      count, 0);
			      count, rqstp->rq_res.len);
		err = sock_sendmsg(svsk->sk_sock, &msg);
	}