diff options
Diffstat (limited to 'fs/locks.c')
| -rw-r--r-- | fs/locks.c | 37 |
1 files changed, 16 insertions, 21 deletions
diff --git a/fs/locks.c b/fs/locks.c index b07e6e6f819b..749a0dc7cd4b 100644 --- a/fs/locks.c +++ b/fs/locks.c | |||
| @@ -666,11 +666,11 @@ static int locks_block_on_timeout(struct file_lock *blocker, struct file_lock *w | |||
| 666 | } | 666 | } |
| 667 | 667 | ||
| 668 | int | 668 | int |
| 669 | posix_test_lock(struct file *filp, struct file_lock *fl, | 669 | posix_test_lock(struct file *filp, struct file_lock *fl) |
| 670 | struct file_lock *conflock) | ||
| 671 | { | 670 | { |
| 672 | struct file_lock *cfl; | 671 | struct file_lock *cfl; |
| 673 | 672 | ||
| 673 | fl->fl_type = F_UNLCK; | ||
| 674 | lock_kernel(); | 674 | lock_kernel(); |
| 675 | for (cfl = filp->f_path.dentry->d_inode->i_flock; cfl; cfl = cfl->fl_next) { | 675 | for (cfl = filp->f_path.dentry->d_inode->i_flock; cfl; cfl = cfl->fl_next) { |
| 676 | if (!IS_POSIX(cfl)) | 676 | if (!IS_POSIX(cfl)) |
| @@ -679,7 +679,7 @@ posix_test_lock(struct file *filp, struct file_lock *fl, | |||
| 679 | break; | 679 | break; |
| 680 | } | 680 | } |
| 681 | if (cfl) { | 681 | if (cfl) { |
| 682 | __locks_copy_lock(conflock, cfl); | 682 | __locks_copy_lock(fl, cfl); |
| 683 | unlock_kernel(); | 683 | unlock_kernel(); |
| 684 | return 1; | 684 | return 1; |
| 685 | } | 685 | } |
| @@ -1648,7 +1648,7 @@ static void posix_lock_to_flock64(struct flock64 *flock, struct file_lock *fl) | |||
| 1648 | */ | 1648 | */ |
| 1649 | int fcntl_getlk(struct file *filp, struct flock __user *l) | 1649 | int fcntl_getlk(struct file *filp, struct flock __user *l) |
| 1650 | { | 1650 | { |
| 1651 | struct file_lock *fl, cfl, file_lock; | 1651 | struct file_lock file_lock; |
| 1652 | struct flock flock; | 1652 | struct flock flock; |
| 1653 | int error; | 1653 | int error; |
| 1654 | 1654 | ||
| @@ -1667,15 +1667,12 @@ int fcntl_getlk(struct file *filp, struct flock __user *l) | |||
| 1667 | error = filp->f_op->lock(filp, F_GETLK, &file_lock); | 1667 | error = filp->f_op->lock(filp, F_GETLK, &file_lock); |
| 1668 | if (error < 0) | 1668 | if (error < 0) |
| 1669 | goto out; | 1669 | goto out; |
| 1670 | else | 1670 | } else |
| 1671 | fl = (file_lock.fl_type == F_UNLCK ? NULL : &file_lock); | 1671 | posix_test_lock(filp, &file_lock); |
| 1672 | } else { | ||
| 1673 | fl = (posix_test_lock(filp, &file_lock, &cfl) ? &cfl : NULL); | ||
| 1674 | } | ||
| 1675 | 1672 | ||
| 1676 | flock.l_type = F_UNLCK; | 1673 | flock.l_type = file_lock.fl_type; |
| 1677 | if (fl != NULL) { | 1674 | if (file_lock.fl_type != F_UNLCK) { |
| 1678 | error = posix_lock_to_flock(&flock, fl); | 1675 | error = posix_lock_to_flock(&flock, &file_lock); |
| 1679 | if (error) | 1676 | if (error) |
| 1680 | goto out; | 1677 | goto out; |
| 1681 | } | 1678 | } |
| @@ -1785,7 +1782,7 @@ out: | |||
| 1785 | */ | 1782 | */ |
| 1786 | int fcntl_getlk64(struct file *filp, struct flock64 __user *l) | 1783 | int fcntl_getlk64(struct file *filp, struct flock64 __user *l) |
| 1787 | { | 1784 | { |
| 1788 | struct file_lock *fl, cfl, file_lock; | 1785 | struct file_lock file_lock; |
| 1789 | struct flock64 flock; | 1786 | struct flock64 flock; |
| 1790 | int error; | 1787 | int error; |
| 1791 | 1788 | ||
| @@ -1804,15 +1801,13 @@ int fcntl_getlk64(struct file *filp, struct flock64 __user *l) | |||
| 1804 | error = filp->f_op->lock(filp, F_GETLK, &file_lock); | 1801 | error = filp->f_op->lock(filp, F_GETLK, &file_lock); |
| 1805 | if (error < 0) | 1802 | if (error < 0) |
| 1806 | goto out; | 1803 | goto out; |
| 1807 | else | 1804 | } else |
| 1808 | fl = (file_lock.fl_type == F_UNLCK ? NULL : &file_lock); | 1805 | posix_test_lock(filp, &file_lock); |
| 1809 | } else { | ||
| 1810 | fl = (posix_test_lock(filp, &file_lock, &cfl) ? &cfl : NULL); | ||
| 1811 | } | ||
| 1812 | 1806 | ||
| 1813 | flock.l_type = F_UNLCK; | 1807 | flock.l_type = file_lock.fl_type; |
| 1814 | if (fl != NULL) | 1808 | if (file_lock.fl_type != F_UNLCK) |
| 1815 | posix_lock_to_flock64(&flock, fl); | 1809 | posix_lock_to_flock64(&flock, &file_lock); |
| 1810 | |||
| 1816 | error = -EFAULT; | 1811 | error = -EFAULT; |
| 1817 | if (!copy_to_user(l, &flock, sizeof(flock))) | 1812 | if (!copy_to_user(l, &flock, sizeof(flock))) |
| 1818 | error = 0; | 1813 | error = 0; |
