diff options
author | Trond Myklebust <trond.myklebust@fys.uio.no> | 2006-08-29 02:15:54 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-09-08 14:51:38 -0700 |
commit | f4eb9f37abad092ac27fabc7d451d6980fff8fb1 (patch) | |
tree | 5d035a5e47c23b90f7166fce2a8cad818e76d9a3 /fs | |
parent | a13aeb6eb26f3457e47f0c604104e30ed8262ca9 (diff) | |
download | linux-stable-f4eb9f37abad092ac27fabc7d451d6980fff8fb1.tar.gz |
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>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/locks.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/fs/locks.c b/fs/locks.c index ab61a8b54829..529a0ed179f1 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -1389,8 +1389,9 @@ static int __setlease(struct file *filp, long arg, struct file_lock **flp) if (!leases_enable) goto out; - error = lease_alloc(filp, arg, &fl); - if (error) + error = -ENOMEM; + fl = locks_alloc_lock(); + if (fl == NULL) goto out; locks_copy_lock(fl, lease); @@ -1398,6 +1399,7 @@ static int __setlease(struct file *filp, long arg, struct file_lock **flp) locks_insert_lock(before, fl); *flp = fl; + error = 0; out: return error; } |