Skip to content

Commit

Permalink
locks: let the caller free file_lock on ->setlease failure
Browse files Browse the repository at this point in the history
The caller allocated it, the caller should free it.

The only issue so far is that we could change the flp pointer even on an
error return if the fl_change callback failed.  But we can simply move
the flp assignment after the fl_change invocation, as the callers don't
care about the flp return value if the setlease call failed.

Signed-off-by: Christoph Hellwig <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Christoph Hellwig authored and torvalds committed Oct 31, 2010
1 parent 96f9359 commit 51ee4b8
Show file tree
Hide file tree
Showing 5 changed files with 13 additions and 17 deletions.
5 changes: 1 addition & 4 deletions fs/cifs/cifsfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -625,11 +625,8 @@ static int cifs_setlease(struct file *file, long arg, struct file_lock **lease)
knows that the file won't be changed on the server
by anyone else */
return generic_setlease(file, arg, lease);
else {
if (arg != F_UNLCK)
locks_free_lock(*lease);
else
return -EAGAIN;
}
}

struct file_system_type cifs_fs_type = {
Expand Down
2 changes: 0 additions & 2 deletions fs/gfs2/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -629,8 +629,6 @@ static ssize_t gfs2_file_aio_write(struct kiocb *iocb, const struct iovec *iov,

static int gfs2_setlease(struct file *file, long arg, struct file_lock **fl)
{
if (arg != F_UNLCK)
locks_free_lock(*fl);
return -EINVAL;
}

Expand Down
20 changes: 11 additions & 9 deletions fs/locks.c
Original file line number Diff line number Diff line change
Expand Up @@ -1428,8 +1428,9 @@ int generic_setlease(struct file *filp, long arg, struct file_lock **flp)
goto out;

if (my_before != NULL) {
*flp = *my_before;
error = lease->fl_lmops->fl_change(my_before, arg);
if (!error)
*flp = *my_before;
goto out;
}

Expand All @@ -1444,8 +1445,6 @@ int generic_setlease(struct file *filp, long arg, struct file_lock **flp)
return 0;

out:
if (arg != F_UNLCK)
locks_free_lock(lease);
return error;
}
EXPORT_SYMBOL(generic_setlease);
Expand Down Expand Up @@ -1524,8 +1523,11 @@ static int do_fcntl_add_lease(unsigned int fd, struct file *filp, long arg)
}
lock_flocks();
error = __vfs_setlease(filp, arg, &fl);
if (error)
goto out_unlock;
if (error) {
unlock_flocks();
locks_free_lock(fl);
goto out_free_fasync;
}

/*
* fasync_insert_entry() returns the old entry if any.
Expand All @@ -1541,12 +1543,12 @@ static int do_fcntl_add_lease(unsigned int fd, struct file *filp, long arg)
fl->fl_type = F_UNLCK | F_INPROGRESS;
fl->fl_break_time = jiffies - 10;
time_out_leases(inode);
goto out_unlock;
} else {
error = __f_setown(filp, task_pid(current), PIDTYPE_PID, 0);
}

error = __f_setown(filp, task_pid(current), PIDTYPE_PID, 0);
out_unlock:
unlock_flocks();

out_free_fasync:
if (new)
fasync_free(new);
return error;
Expand Down
2 changes: 0 additions & 2 deletions fs/nfs/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -884,7 +884,5 @@ static int nfs_setlease(struct file *file, long arg, struct file_lock **fl)
dprintk("NFS: setlease(%s/%s, arg=%ld)\n",
file->f_path.dentry->d_parent->d_name.name,
file->f_path.dentry->d_name.name, arg);
if (arg != F_UNLCK)
locks_free_lock(*fl);
return -EINVAL;
}
1 change: 1 addition & 0 deletions fs/nfsd/nfs4state.c
Original file line number Diff line number Diff line change
Expand Up @@ -2652,6 +2652,7 @@ nfs4_open_delegation(struct svc_fh *fh, struct nfsd4_open *open, struct nfs4_sta
if ((status = vfs_setlease(fl->fl_file, fl->fl_type, &fl))) {
dprintk("NFSD: setlease failed [%d], no delegation\n", status);
dp->dl_flock = NULL;
locks_free_lock(fl);
unhash_delegation(dp);
flag = NFS4_OPEN_DELEGATE_NONE;
goto out;
Expand Down

0 comments on commit 51ee4b8

Please sign in to comment.