diff options
-rw-r--r-- | fs/fuse/file.c | 3 | ||||
-rw-r--r-- | fs/gfs2/locking/nolock/main.c | 8 | ||||
-rw-r--r-- | fs/gfs2/ops_file.c | 7 | ||||
-rw-r--r-- | fs/lockd/svclock.c | 13 | ||||
-rw-r--r-- | fs/locks.c | 37 | ||||
-rw-r--r-- | fs/nfs/file.c | 7 | ||||
-rw-r--r-- | fs/nfsd/nfs4state.c | 6 | ||||
-rw-r--r-- | include/linux/fs.h | 2 |
8 files changed, 32 insertions, 51 deletions
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 2fd06927e851..acfad65a6e8e 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c | |||
@@ -738,8 +738,7 @@ static int fuse_file_lock(struct file *file, int cmd, struct file_lock *fl) | |||
738 | 738 | ||
739 | if (cmd == F_GETLK) { | 739 | if (cmd == F_GETLK) { |
740 | if (fc->no_lock) { | 740 | if (fc->no_lock) { |
741 | if (!posix_test_lock(file, fl, fl)) | 741 | posix_test_lock(file, fl); |
742 | fl->fl_type = F_UNLCK; | ||
743 | err = 0; | 742 | err = 0; |
744 | } else | 743 | } else |
745 | err = fuse_getlk(file, fl); | 744 | err = fuse_getlk(file, fl); |
diff --git a/fs/gfs2/locking/nolock/main.c b/fs/gfs2/locking/nolock/main.c index acfbc941f319..5cc1dfa7944a 100644 --- a/fs/gfs2/locking/nolock/main.c +++ b/fs/gfs2/locking/nolock/main.c | |||
@@ -164,13 +164,7 @@ static void nolock_unhold_lvb(void *lock, char *lvb) | |||
164 | static int nolock_plock_get(void *lockspace, struct lm_lockname *name, | 164 | static int nolock_plock_get(void *lockspace, struct lm_lockname *name, |
165 | struct file *file, struct file_lock *fl) | 165 | struct file *file, struct file_lock *fl) |
166 | { | 166 | { |
167 | struct file_lock tmp; | 167 | posix_test_lock(file, fl); |
168 | int ret; | ||
169 | |||
170 | ret = posix_test_lock(file, fl, &tmp); | ||
171 | fl->fl_type = F_UNLCK; | ||
172 | if (ret) | ||
173 | memcpy(fl, &tmp, sizeof(struct file_lock)); | ||
174 | 168 | ||
175 | return 0; | 169 | return 0; |
176 | } | 170 | } |
diff --git a/fs/gfs2/ops_file.c b/fs/gfs2/ops_file.c index b50180e22779..48b248d7c823 100644 --- a/fs/gfs2/ops_file.c +++ b/fs/gfs2/ops_file.c | |||
@@ -513,12 +513,7 @@ static int gfs2_lock(struct file *file, int cmd, struct file_lock *fl) | |||
513 | 513 | ||
514 | if (sdp->sd_args.ar_localflocks) { | 514 | if (sdp->sd_args.ar_localflocks) { |
515 | if (IS_GETLK(cmd)) { | 515 | if (IS_GETLK(cmd)) { |
516 | struct file_lock tmp; | 516 | posix_test_lock(file, fl); |
517 | int ret; | ||
518 | ret = posix_test_lock(file, fl, &tmp); | ||
519 | fl->fl_type = F_UNLCK; | ||
520 | if (ret) | ||
521 | memcpy(fl, &tmp, sizeof(struct file_lock)); | ||
522 | return 0; | 517 | return 0; |
523 | } else { | 518 | } else { |
524 | return posix_lock_file_wait(file, fl); | 519 | return posix_lock_file_wait(file, fl); |
diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c index cf51f849e76c..97b0160ef10f 100644 --- a/fs/lockd/svclock.c +++ b/fs/lockd/svclock.c | |||
@@ -426,15 +426,18 @@ nlmsvc_testlock(struct nlm_file *file, struct nlm_lock *lock, | |||
426 | (long long)lock->fl.fl_start, | 426 | (long long)lock->fl.fl_start, |
427 | (long long)lock->fl.fl_end); | 427 | (long long)lock->fl.fl_end); |
428 | 428 | ||
429 | if (posix_test_lock(file->f_file, &lock->fl, &conflock->fl)) { | 429 | if (posix_test_lock(file->f_file, &lock->fl)) { |
430 | dprintk("lockd: conflicting lock(ty=%d, %Ld-%Ld)\n", | 430 | dprintk("lockd: conflicting lock(ty=%d, %Ld-%Ld)\n", |
431 | conflock->fl.fl_type, | 431 | lock->fl.fl_type, |
432 | (long long)conflock->fl.fl_start, | 432 | (long long)lock->fl.fl_start, |
433 | (long long)conflock->fl.fl_end); | 433 | (long long)lock->fl.fl_end); |
434 | conflock->caller = "somehost"; /* FIXME */ | 434 | conflock->caller = "somehost"; /* FIXME */ |
435 | conflock->len = strlen(conflock->caller); | 435 | conflock->len = strlen(conflock->caller); |
436 | conflock->oh.len = 0; /* don't return OH info */ | 436 | conflock->oh.len = 0; /* don't return OH info */ |
437 | conflock->svid = conflock->fl.fl_pid; | 437 | conflock->svid = lock->fl.fl_pid; |
438 | conflock->fl.fl_type = lock->fl.fl_type; | ||
439 | conflock->fl.fl_start = lock->fl.fl_start; | ||
440 | conflock->fl.fl_end = lock->fl.fl_end; | ||
438 | return nlm_lck_denied; | 441 | return nlm_lck_denied; |
439 | } | 442 | } |
440 | 443 | ||
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; |
diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 8e66b5a2d490..5eaee6dd040b 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c | |||
@@ -391,17 +391,12 @@ out_swapfile: | |||
391 | 391 | ||
392 | static int do_getlk(struct file *filp, int cmd, struct file_lock *fl) | 392 | static int do_getlk(struct file *filp, int cmd, struct file_lock *fl) |
393 | { | 393 | { |
394 | struct file_lock cfl; | ||
395 | struct inode *inode = filp->f_mapping->host; | 394 | struct inode *inode = filp->f_mapping->host; |
396 | int status = 0; | 395 | int status = 0; |
397 | 396 | ||
398 | lock_kernel(); | 397 | lock_kernel(); |
399 | /* Try local locking first */ | 398 | /* Try local locking first */ |
400 | if (posix_test_lock(filp, fl, &cfl)) { | 399 | if (posix_test_lock(filp, fl)) { |
401 | fl->fl_start = cfl.fl_start; | ||
402 | fl->fl_end = cfl.fl_end; | ||
403 | fl->fl_type = cfl.fl_type; | ||
404 | fl->fl_pid = cfl.fl_pid; | ||
405 | goto out; | 400 | goto out; |
406 | } | 401 | } |
407 | 402 | ||
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index af360705e551..e42c7a0eb6fa 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c | |||
@@ -2813,7 +2813,6 @@ nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | |||
2813 | struct inode *inode; | 2813 | struct inode *inode; |
2814 | struct file file; | 2814 | struct file file; |
2815 | struct file_lock file_lock; | 2815 | struct file_lock file_lock; |
2816 | struct file_lock conflock; | ||
2817 | __be32 status; | 2816 | __be32 status; |
2818 | 2817 | ||
2819 | if (nfs4_in_grace()) | 2818 | if (nfs4_in_grace()) |
@@ -2878,9 +2877,10 @@ nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | |||
2878 | file.f_path.dentry = cstate->current_fh.fh_dentry; | 2877 | file.f_path.dentry = cstate->current_fh.fh_dentry; |
2879 | 2878 | ||
2880 | status = nfs_ok; | 2879 | status = nfs_ok; |
2881 | if (posix_test_lock(&file, &file_lock, &conflock)) { | 2880 | posix_test_lock(&file, &file_lock); |
2881 | if (file_lock.fl_type != F_UNLCK) { | ||
2882 | status = nfserr_denied; | 2882 | status = nfserr_denied; |
2883 | nfs4_set_lock_denied(&conflock, &lockt->lt_denied); | 2883 | nfs4_set_lock_denied(&file_lock, &lockt->lt_denied); |
2884 | } | 2884 | } |
2885 | out: | 2885 | out: |
2886 | nfs4_unlock_state(); | 2886 | nfs4_unlock_state(); |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 86ec3f4a7da6..9e1ddffe3884 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -851,7 +851,7 @@ extern void locks_init_lock(struct file_lock *); | |||
851 | extern void locks_copy_lock(struct file_lock *, struct file_lock *); | 851 | extern void locks_copy_lock(struct file_lock *, struct file_lock *); |
852 | extern void locks_remove_posix(struct file *, fl_owner_t); | 852 | extern void locks_remove_posix(struct file *, fl_owner_t); |
853 | extern void locks_remove_flock(struct file *); | 853 | extern void locks_remove_flock(struct file *); |
854 | extern int posix_test_lock(struct file *, struct file_lock *, struct file_lock *); | 854 | extern int posix_test_lock(struct file *, struct file_lock *); |
855 | extern int posix_lock_file_conf(struct file *, struct file_lock *, struct file_lock *); | 855 | extern int posix_lock_file_conf(struct file *, struct file_lock *, struct file_lock *); |
856 | extern int posix_lock_file(struct file *, struct file_lock *); | 856 | extern int posix_lock_file(struct file *, struct file_lock *); |
857 | extern int posix_lock_file_wait(struct file *, struct file_lock *); | 857 | extern int posix_lock_file_wait(struct file *, struct file_lock *); |