[PATCH] fcntl(F_SETSIG) fix
fcntl(F_SETSIG) no longer works on leases because lease_release_private_callback() gets called as the lease is copied in order to initialise it. The problem is that lease_alloc() performs an unnecessary initialisation, which sets the lease_manager_ops. Avoid the problem by allocating the target lease structure using locks_alloc_lock(). Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
1d7ea7324a
commit
74361cb682
|
@ -1421,8 +1421,9 @@ static int __setlease(struct file *filp, long arg, struct file_lock **flp)
|
||||||
if (!leases_enable)
|
if (!leases_enable)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
error = lease_alloc(filp, arg, &fl);
|
error = -ENOMEM;
|
||||||
if (error)
|
fl = locks_alloc_lock();
|
||||||
|
if (fl == NULL)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
locks_copy_lock(fl, lease);
|
locks_copy_lock(fl, lease);
|
||||||
|
@ -1430,6 +1431,7 @@ static int __setlease(struct file *filp, long arg, struct file_lock **flp)
|
||||||
locks_insert_lock(before, fl);
|
locks_insert_lock(before, fl);
|
||||||
|
|
||||||
*flp = fl;
|
*flp = fl;
|
||||||
|
error = 0;
|
||||||
out:
|
out:
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue