diff options
Diffstat (limited to 'fs/locks.c')
| -rw-r--r-- | fs/locks.c | 97 | 
1 files changed, 30 insertions, 67 deletions
diff --git a/fs/locks.c b/fs/locks.c index af2031a1fcff..afefeb4ad6de 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -1858,8 +1858,8 @@ EXPORT_SYMBOL(generic_setlease);   *   * Call this to establish a lease on the file. The "lease" argument is not   * used for F_UNLCK requests and may be NULL. For commands that set or alter - * an existing lease, the (*lease)->fl_lmops->lm_break operation must be set; - * if not, this function will return -ENOLCK (and generate a scary-looking + * an existing lease, the ``(*lease)->fl_lmops->lm_break`` operation must be + * set; if not, this function will return -ENOLCK (and generate a scary-looking   * stack trace).   *   * The "priv" pointer is passed directly to the lm_setup function as-is. It @@ -1972,15 +1972,13 @@ EXPORT_SYMBOL(locks_lock_inode_wait);   *	@cmd: the type of lock to apply.   *   *	Apply a %FL_FLOCK style lock to an open file descriptor. - *	The @cmd can be one of + *	The @cmd can be one of:   * - *	%LOCK_SH -- a shared lock. - * - *	%LOCK_EX -- an exclusive lock. - * - *	%LOCK_UN -- remove an existing lock. - * - *	%LOCK_MAND -- a `mandatory' flock.  This exists to emulate Windows Share Modes. + *	- %LOCK_SH -- a shared lock. + *	- %LOCK_EX -- an exclusive lock. + *	- %LOCK_UN -- remove an existing lock. + *	- %LOCK_MAND -- a 'mandatory' flock. + *	  This exists to emulate Windows Share Modes.   *   *	%LOCK_MAND can be combined with %LOCK_READ or %LOCK_WRITE to allow other   *	processes read and write access respectively. @@ -2086,26 +2084,22 @@ static void posix_lock_to_flock64(struct flock64 *flock, struct file_lock *fl)  /* Report the first existing lock that would conflict with l.   * This implements the F_GETLK command of fcntl().   */ -int fcntl_getlk(struct file *filp, unsigned int cmd, struct flock __user *l) +int fcntl_getlk(struct file *filp, unsigned int cmd, struct flock *flock)  {  	struct file_lock file_lock; -	struct flock flock;  	int error; -	error = -EFAULT; -	if (copy_from_user(&flock, l, sizeof(flock))) -		goto out;  	error = -EINVAL; -	if ((flock.l_type != F_RDLCK) && (flock.l_type != F_WRLCK)) +	if (flock->l_type != F_RDLCK && flock->l_type != F_WRLCK)  		goto out; -	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_OFD_GETLK) {  		error = -EINVAL; -		if (flock.l_pid != 0) +		if (flock->l_pid != 0)  			goto out;  		cmd = F_GETLK; @@ -2117,15 +2111,12 @@ int fcntl_getlk(struct file *filp, unsigned int cmd, struct flock __user *l)  	if (error)  		goto out; -	flock.l_type = file_lock.fl_type; +	flock->l_type = file_lock.fl_type;  	if (file_lock.fl_type != F_UNLCK) { -		error = posix_lock_to_flock(&flock, &file_lock); +		error = posix_lock_to_flock(flock, &file_lock);  		if (error)  			goto rel_priv;  	} -	error = -EFAULT; -	if (!copy_to_user(l, &flock, sizeof(flock))) -		error = 0;  rel_priv:  	locks_release_private(&file_lock);  out: @@ -2218,26 +2209,16 @@ check_fmode_for_setlk(struct file_lock *fl)   * 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) +		struct flock *flock)  {  	struct file_lock *file_lock = locks_alloc_lock(); -	struct flock flock; -	struct inode *inode; +	struct inode *inode = locks_inode(filp);  	struct file *f;  	int error;  	if (file_lock == NULL)  		return -ENOLCK; -	inode = locks_inode(filp); - -	/* -	 * This might block, so we do it before checking the inode. -	 */ -	error = -EFAULT; -	if (copy_from_user(&flock, l, sizeof(flock))) -		goto out; -  	/* Don't allow mandatory locks on files that may be memory mapped  	 * and shared.  	 */ @@ -2246,7 +2227,7 @@ int fcntl_setlk(unsigned int fd, struct file *filp, unsigned int cmd,  		goto out;  	} -	error = flock_to_posix_lock(filp, file_lock, &flock); +	error = flock_to_posix_lock(filp, file_lock, flock);  	if (error)  		goto out; @@ -2261,7 +2242,7 @@ int fcntl_setlk(unsigned int fd, struct file *filp, unsigned int cmd,  	switch (cmd) {  	case F_OFD_SETLK:  		error = -EINVAL; -		if (flock.l_pid != 0) +		if (flock->l_pid != 0)  			goto out;  		cmd = F_SETLK; @@ -2270,7 +2251,7 @@ int fcntl_setlk(unsigned int fd, struct file *filp, unsigned int cmd,  		break;  	case F_OFD_SETLKW:  		error = -EINVAL; -		if (flock.l_pid != 0) +		if (flock->l_pid != 0)  			goto out;  		cmd = F_SETLKW; @@ -2315,26 +2296,22 @@ out:  /* Report the first existing lock that would conflict with l.   * This implements the F_GETLK command of fcntl().   */ -int fcntl_getlk64(struct file *filp, unsigned int cmd, struct flock64 __user *l) +int fcntl_getlk64(struct file *filp, unsigned int cmd, struct flock64 *flock)  {  	struct file_lock file_lock; -	struct flock64 flock;  	int error; -	error = -EFAULT; -	if (copy_from_user(&flock, l, sizeof(flock))) -		goto out;  	error = -EINVAL; -	if ((flock.l_type != F_RDLCK) && (flock.l_type != F_WRLCK)) +	if (flock->l_type != F_RDLCK && flock->l_type != F_WRLCK)  		goto out; -	error = flock64_to_posix_lock(filp, &file_lock, &flock); +	error = flock64_to_posix_lock(filp, &file_lock, flock);  	if (error)  		goto out;  	if (cmd == F_OFD_GETLK) {  		error = -EINVAL; -		if (flock.l_pid != 0) +		if (flock->l_pid != 0)  			goto out;  		cmd = F_GETLK64; @@ -2346,13 +2323,9 @@ int fcntl_getlk64(struct file *filp, unsigned int cmd, struct flock64 __user *l)  	if (error)  		goto out; -	flock.l_type = file_lock.fl_type; +	flock->l_type = file_lock.fl_type;  	if (file_lock.fl_type != F_UNLCK) -		posix_lock_to_flock64(&flock, &file_lock); - -	error = -EFAULT; -	if (!copy_to_user(l, &flock, sizeof(flock))) -		error = 0; +		posix_lock_to_flock64(flock, &file_lock);  	locks_release_private(&file_lock);  out: @@ -2363,26 +2336,16 @@ out:   * This implements both the F_SETLK and F_SETLKW commands of fcntl().   */  int fcntl_setlk64(unsigned int fd, struct file *filp, unsigned int cmd, -		struct flock64 __user *l) +		struct flock64 *flock)  {  	struct file_lock *file_lock = locks_alloc_lock(); -	struct flock64 flock; -	struct inode *inode; +	struct inode *inode = locks_inode(filp);  	struct file *f;  	int error;  	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 = locks_inode(filp); -  	/* Don't allow mandatory locks on files that may be memory mapped  	 * and shared.  	 */ @@ -2391,7 +2354,7 @@ int fcntl_setlk64(unsigned int fd, struct file *filp, unsigned int cmd,  		goto out;  	} -	error = flock64_to_posix_lock(filp, file_lock, &flock); +	error = flock64_to_posix_lock(filp, file_lock, flock);  	if (error)  		goto out; @@ -2406,7 +2369,7 @@ int fcntl_setlk64(unsigned int fd, struct file *filp, unsigned int cmd,  	switch (cmd) {  	case F_OFD_SETLK:  		error = -EINVAL; -		if (flock.l_pid != 0) +		if (flock->l_pid != 0)  			goto out;  		cmd = F_SETLK64; @@ -2415,7 +2378,7 @@ int fcntl_setlk64(unsigned int fd, struct file *filp, unsigned int cmd,  		break;  	case F_OFD_SETLKW:  		error = -EINVAL; -		if (flock.l_pid != 0) +		if (flock->l_pid != 0)  			goto out;  		cmd = F_SETLKW64;  | 
