From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sukadev Bhattiprolu Subject: [RFC][cr][PATCH 3/6] Define flock_set() Date: Tue, 4 May 2010 22:31:29 -0700 Message-ID: <20100505053129.GC20993@us.ibm.com> References: <20100505053016.GA20483@us.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: Containers , linux-fsdevel@vger.kernel.org, serue@us.ibm.com, matthltc@us.ibm.com, sukadev@us.ibm.com To: Oren Laadan Return-path: Received: from e34.co.us.ibm.com ([32.97.110.152]:41992 "EHLO e34.co.us.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755137Ab0EEFZV (ORCPT ); Wed, 5 May 2010 01:25:21 -0400 Received: from d03relay05.boulder.ibm.com (d03relay05.boulder.ibm.com [9.17.195.107]) by e34.co.us.ibm.com (8.14.3/8.13.1) with ESMTP id o455I2p7030005 for ; Tue, 4 May 2010 23:18:02 -0600 Received: from d03av01.boulder.ibm.com (d03av01.boulder.ibm.com [9.17.195.167]) by d03relay05.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o455PLSC106220 for ; Tue, 4 May 2010 23:25:21 -0600 Received: from d03av01.boulder.ibm.com (loopback [127.0.0.1]) by d03av01.boulder.ibm.com (8.14.3/8.13.1/NCO v10.0 AVout) with ESMTP id o455PKw6029423 for ; Tue, 4 May 2010 23:25:20 -0600 Content-Disposition: inline In-Reply-To: <20100505053016.GA20483@us.ibm.com> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: >>From e773dc3d5e3d4ead9db7ddbd85b58a20ec95afc0 Mon Sep 17 00:00:00 2001 From: Sukadev Bhattiprolu Date: Fri, 30 Apr 2010 11:03:28 -0700 Subject: [RFC][cr][PATCH 3/6] Define flock_set() Extract core functionality of fcntl_setlk() into a separate function, flock_set(). flock_set() can be also used when restarting a checkpointed application and restoring its file-locks. Signed-off-by: Sukadev Bhattiprolu --- fs/locks.c | 44 +++++++++++++++++++++++++++----------------- include/linux/fs.h | 1 + 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/fs/locks.c b/fs/locks.c index da53795..6c6ced4 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -1758,14 +1758,10 @@ static int do_lock_file_wait(struct file *filp, unsigned int cmd, return error; } -/* Apply the lock described by l to an open file descriptor. - * This implements both the F_SETLK and F_SETLKW commands of fcntl(). - */ -int fcntl_setlk(unsigned int fd, struct file *filp, unsigned int cmd, - struct flock __user *l) +int flock_set(unsigned int fd, struct file *filp, unsigned int cmd, + struct flock *flock) { struct file_lock *file_lock = locks_alloc_lock(); - struct flock flock; struct inode *inode; struct file *f; int error; @@ -1773,13 +1769,6 @@ int fcntl_setlk(unsigned int fd, struct file *filp, unsigned int cmd, if (file_lock == NULL) return -ENOLCK; - /* - * This might block, so we do it before checking the inode. - */ - error = -EFAULT; - if (copy_from_user(&flock, l, sizeof(flock))) - goto out; - inode = filp->f_path.dentry->d_inode; /* Don't allow mandatory locks on files that may be memory mapped @@ -1791,7 +1780,7 @@ int fcntl_setlk(unsigned int fd, struct file *filp, unsigned int cmd, } again: - error = flock_to_posix_lock(filp, file_lock, &flock); + error = flock_to_posix_lock(filp, file_lock, flock); if (error) goto out; if (cmd == F_SETLKW) { @@ -1799,7 +1788,7 @@ again: } error = -EBADF; - switch (flock.l_type) { + switch (flock->l_type) { case F_RDLCK: if (!(filp->f_mode & FMODE_READ)) goto out; @@ -1829,8 +1818,8 @@ again: spin_lock(¤t->files->file_lock); f = fcheck(fd); spin_unlock(¤t->files->file_lock); - if (!error && f != filp && flock.l_type != F_UNLCK) { - flock.l_type = F_UNLCK; + if (!error && f != filp && flock->l_type != F_UNLCK) { + flock->l_type = F_UNLCK; goto again; } @@ -1839,6 +1828,27 @@ out: return error; } +/* Apply the lock described by l to an open file descriptor. + * This implements both the F_SETLK and F_SETLKW commands of fcntl(). + */ +int fcntl_setlk(unsigned int fd, struct file *filp, unsigned int cmd, + struct flock __user *l) +{ + int error; + struct flock flock; + + /* + * This might block, so we do it before checking the inode + * in flock_set(). + */ + error = -EFAULT; + if (copy_from_user(&flock, l, sizeof(flock))) + return error; + + return flock_set(fd, filp, cmd, &flock); +} + + #if BITS_PER_LONG == 32 /* Report the first existing lock that would conflict with l. * This implements the F_GETLK command of fcntl(). diff --git a/include/linux/fs.h b/include/linux/fs.h index 909a535..5e9ea17 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1112,6 +1112,7 @@ extern void send_sigio(struct fown_struct *fown, int fd, int band); extern int fcntl_getlk(struct file *, struct flock __user *); extern int fcntl_setlk(unsigned int, struct file *, unsigned int, struct flock __user *); +extern int flock_set(unsigned int, struct file *, unsigned int, struct flock *); #if BITS_PER_LONG == 32 extern int fcntl_getlk64(struct file *, struct flock64 __user *); -- 1.6.0.4