locks: share more common lease code
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>
This commit is contained in:
parent
e32b8ee27b
commit
6d5e8b05ca
1 changed files with 10 additions and 20 deletions
30
fs/locks.c
30
fs/locks.c
|
@ -1343,6 +1343,14 @@ static int __setlease(struct file *filp, long arg, struct file_lock **flp)
|
||||||
struct inode *inode = dentry->d_inode;
|
struct inode *inode = dentry->d_inode;
|
||||||
int error, rdlease_count = 0, wrlease_count = 0;
|
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);
|
time_out_leases(inode);
|
||||||
|
|
||||||
BUG_ON(!(*flp)->fl_lmops->fl_break);
|
BUG_ON(!(*flp)->fl_lmops->fl_break);
|
||||||
|
@ -1426,18 +1434,8 @@ out:
|
||||||
|
|
||||||
int setlease(struct file *filp, long arg, struct file_lock **lease)
|
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;
|
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();
|
lock_kernel();
|
||||||
error = __setlease(filp, arg, lease);
|
error = __setlease(filp, arg, lease);
|
||||||
unlock_kernel();
|
unlock_kernel();
|
||||||
|
@ -1464,14 +1462,6 @@ int fcntl_setlease(unsigned int fd, struct file *filp, long arg)
|
||||||
struct inode *inode = dentry->d_inode;
|
struct inode *inode = dentry->d_inode;
|
||||||
int error;
|
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);
|
locks_init_lock(&fl);
|
||||||
error = lease_init(filp, arg, &fl);
|
error = lease_init(filp, arg, &fl);
|
||||||
if (error)
|
if (error)
|
||||||
|
@ -1485,9 +1475,9 @@ int fcntl_setlease(unsigned int fd, struct file *filp, long arg)
|
||||||
|
|
||||||
error = fasync_helper(fd, filp, 1, &flp->fl_fasync);
|
error = fasync_helper(fd, filp, 1, &flp->fl_fasync);
|
||||||
if (error < 0) {
|
if (error < 0) {
|
||||||
/* remove lease just inserted by __setlease */
|
/* remove lease just inserted by setlease */
|
||||||
flp->fl_type = F_UNLCK | F_INPROGRESS;
|
flp->fl_type = F_UNLCK | F_INPROGRESS;
|
||||||
flp->fl_break_time = jiffies- 10;
|
flp->fl_break_time = jiffies - 10;
|
||||||
time_out_leases(inode);
|
time_out_leases(inode);
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue