Selaa lähdekoodia

locks: make ->lock release private data before returning in GETLK case

The file_lock argument to ->lock is used to return the conflicting lock
when found.  There's no reason for the filesystem to return any private
information with this conflicting lock, but nfsv4 is.

Fix nfsv4 client, and modify locks.c to stop calling fl_release_private
for it in this case.

Signed-off-by: "J. Bruce Fields" <bfields@citi.umich.edu>
Cc: "Trond Myklebust" <Trond.Myklebust@netapp.com>"
J. Bruce Fields 18 vuotta sitten
vanhempi
commit
70cc6487a4
2 muutettua tiedostoa jossa 1 lisäystä ja 4 poistoa
  1. 0 4
      fs/locks.c
  2. 1 0
      fs/nfs/nfs4proc.c

+ 0 - 4
fs/locks.c

@@ -1665,8 +1665,6 @@ int fcntl_getlk(struct file *filp, struct flock __user *l)
 
 
 	if (filp->f_op && filp->f_op->lock) {
 	if (filp->f_op && filp->f_op->lock) {
 		error = filp->f_op->lock(filp, F_GETLK, &file_lock);
 		error = filp->f_op->lock(filp, F_GETLK, &file_lock);
-		if (file_lock.fl_ops && file_lock.fl_ops->fl_release_private)
-			file_lock.fl_ops->fl_release_private(&file_lock);
 		if (error < 0)
 		if (error < 0)
 			goto out;
 			goto out;
 		else
 		else
@@ -1804,8 +1802,6 @@ int fcntl_getlk64(struct file *filp, struct flock64 __user *l)
 
 
 	if (filp->f_op && filp->f_op->lock) {
 	if (filp->f_op && filp->f_op->lock) {
 		error = filp->f_op->lock(filp, F_GETLK, &file_lock);
 		error = filp->f_op->lock(filp, F_GETLK, &file_lock);
-		if (file_lock.fl_ops && file_lock.fl_ops->fl_release_private)
-			file_lock.fl_ops->fl_release_private(&file_lock);
 		if (error < 0)
 		if (error < 0)
 			goto out;
 			goto out;
 		else
 		else

+ 1 - 0
fs/nfs/nfs4proc.c

@@ -3018,6 +3018,7 @@ static int _nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock
 		case -NFS4ERR_DENIED:
 		case -NFS4ERR_DENIED:
 			status = 0;
 			status = 0;
 	}
 	}
+	request->fl_ops->fl_release_private(request);
 out:
 out:
 	up_read(&clp->cl_sem);
 	up_read(&clp->cl_sem);
 	return status;
 	return status;