locks: make ->lock release private data before returning in GETLK case
authorJ. Bruce Fields <bfields@citi.umich.edu>
Thu, 22 Feb 2007 23:48:53 +0000 (18:48 -0500)
committerJ. Bruce Fields <bfields@citi.umich.edu>
Sun, 6 May 2007 21:38:19 +0000 (17:38 -0400)
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>"
fs/locks.c
fs/nfs/nfs4proc.c

index 957775ba6468faa1e36304a8e9834729af76f849..b07e6e6f819b62e2d944f800046591cd00acd928 100644 (file)
@@ -1665,8 +1665,6 @@ int fcntl_getlk(struct file *filp, struct flock __user *l)
 
        if (filp->f_op && filp->f_op->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)
                        goto out;
                else
@@ -1804,8 +1802,6 @@ int fcntl_getlk64(struct file *filp, struct flock64 __user *l)
 
        if (filp->f_op && filp->f_op->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)
                        goto out;
                else
index f52cf5c33c6c83adcde94ed37202adaf3a0d969f..d9000ec52f72cdc089d3b90cb8c4428f6b8d20f3 100644 (file)
@@ -3018,6 +3018,7 @@ static int _nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock
                case -NFS4ERR_DENIED:
                        status = 0;
        }
+       request->fl_ops->fl_release_private(request);
 out:
        up_read(&clp->cl_sem);
        return status;