nfsd-6.8 fixes:
- Fix in-kernel RPC UDP transport - Fix NFSv4.0 RELEASE_LOCKOWNER -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEKLLlsBKG3yQ88j7+M2qzM29mf5cFAmWxLmUACgkQM2qzM29m f5eCJBAAqTyYweun0ca9wisypEVVWgfoHN8wNpxZR3iaPkL/pWudkk+ImHuSGFCC fxdBU+xpBbxTHJ5yrrjyIVBQwHXRx3HQyedxs5SpFxeEr6h4z4fTzC3oX69AxHvr zt4ynccUjZ4vjcyASQafONtPUoeCoTUEP9hkrF/WYNdETuKXhGuJ7rM969f3eLF/ V3oPz0l8PoCsyw6IrFgUOGsNYSdBfydR73WqMJTUP9Avc5l9yG2tKdNfV5n87xTg xPuAxyxBEKuzcK1N7qBjiBDt+MRn+QKSid/kVelhTEwb+vgW4DEqJwmBMNHjFzqN gy3x8xVatIlbuWvKslSE4MbrAplTdEZrSHK0Q7CNeREHptlf41QS5dgYdVCWcs15 vgYb18qTipkErdQ4sYGK7oN0PhPTlOkpit/28Vf8fiiSEXZTPBr9bcYvAGD3pZUS kzoA0JrZkZQB+TNHQ3j5T2r+XKunF3KkPVXmI7c6RSf8yWcJ1kqe29zpstIfll71 K157NBqeVM8FyiPOxZqT0AROW9aIPGml7f6SQ4DkUUp84LbEFaz8svkFMu9a7ONs oEkc5xbEuvIvyHdY1liBhxw5ugg1nNMIbchVwRHqQIIZGfy76p+KLRSZ2neidhxE pl0QNQchT3XsxZJOwcp5YboyBB+gVcKMpFB1rgX4NBcXTh1buWo= =t62e -----END PGP SIGNATURE----- Merge tag 'nfsd-6.8-1' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux 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()
This commit is contained in:
commit
b9fa4cbd84
@ -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,10 +7984,13 @@ nfsd4_release_lockowner(struct svc_rqst *rqstp,
|
||||
spin_unlock(&clp->cl_lock);
|
||||
return nfs_ok;
|
||||
}
|
||||
if (atomic_read(&lo->lo_owner.so_count) != 2) {
|
||||
spin_unlock(&clp->cl_lock);
|
||||
nfs4_put_stateowner(&lo->lo_owner);
|
||||
return nfserr_locks_held;
|
||||
|
||||
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)) {
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user