Skip to content

Commit

Permalink
locks: share more common lease code
Browse files Browse the repository at this point in the history
Share more code between setlease (used by nfsd) and fcntl.

Also some minor cleanup.

Signed-off-by: "J. Bruce Fields" <bfields@citi.umich.edu>
Acked-by: Christoph Hellwig <hch@infradead.org>
  • Loading branch information
J. Bruce Fields committed Jul 18, 2007
1 parent e32b8ee commit 6d5e8b0
Showing 1 changed file with 10 additions and 20 deletions.
30 changes: 10 additions & 20 deletions fs/locks.c
Original file line number Diff line number Diff line change
Expand Up @@ -1343,6 +1343,14 @@ static int __setlease(struct file *filp, long arg, struct file_lock **flp)
struct inode *inode = dentry->d_inode;
int error, rdlease_count = 0, wrlease_count = 0;

if ((current->fsuid != inode->i_uid) && !capable(CAP_LEASE))
return -EACCES;
if (!S_ISREG(inode->i_mode))
return -EINVAL;
error = security_file_lock(filp, arg);
if (error)
return error;

time_out_leases(inode);

BUG_ON(!(*flp)->fl_lmops->fl_break);
Expand Down Expand Up @@ -1426,18 +1434,8 @@ static int __setlease(struct file *filp, long arg, struct file_lock **flp)

int setlease(struct file *filp, long arg, struct file_lock **lease)
{
struct dentry *dentry = filp->f_path.dentry;
struct inode *inode = dentry->d_inode;
int error;

if ((current->fsuid != inode->i_uid) && !capable(CAP_LEASE))
return -EACCES;
if (!S_ISREG(inode->i_mode))
return -EINVAL;
error = security_file_lock(filp, arg);
if (error)
return error;

lock_kernel();
error = __setlease(filp, arg, lease);
unlock_kernel();
Expand All @@ -1464,14 +1462,6 @@ int fcntl_setlease(unsigned int fd, struct file *filp, long arg)
struct inode *inode = dentry->d_inode;
int error;

if ((current->fsuid != inode->i_uid) && !capable(CAP_LEASE))
return -EACCES;
if (!S_ISREG(inode->i_mode))
return -EINVAL;
error = security_file_lock(filp, arg);
if (error)
return error;

locks_init_lock(&fl);
error = lease_init(filp, arg, &fl);
if (error)
Expand All @@ -1485,9 +1475,9 @@ int fcntl_setlease(unsigned int fd, struct file *filp, long arg)

error = fasync_helper(fd, filp, 1, &flp->fl_fasync);
if (error < 0) {
/* remove lease just inserted by __setlease */
/* remove lease just inserted by setlease */
flp->fl_type = F_UNLCK | F_INPROGRESS;
flp->fl_break_time = jiffies- 10;
flp->fl_break_time = jiffies - 10;
time_out_leases(inode);
goto out_unlock;
}
Expand Down

0 comments on commit 6d5e8b0

Please sign in to comment.