diff options
author | Olaf Kirch <okir@suse.de> | 2005-08-25 19:25:35 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2005-09-23 12:37:59 -0400 |
commit | 449231d6ddf50ca46b7fb2f76ecf790135222913 (patch) | |
tree | 0c493d7f4fb68f1f639c56258bcd025d5b904fb0 | |
parent | 20509f1bc553ed7fafa88fa8d01c6212d1876d9f (diff) |
From: Olaf Kirch <okir@suse.de>
[PATCH] Fix miscompare in __posix_lock_file
If an application requests the same lock twice, the
kernel should just leave the existing lock in place.
Currently, it will install a second lock of the same type.
Signed-off-by: Olaf Kirch <okir@suse.de>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r-- | fs/locks.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/fs/locks.c b/fs/locks.c index f7daa5f48949..7eb1d77b9204 100644 --- a/fs/locks.c +++ b/fs/locks.c | |||
@@ -829,12 +829,16 @@ static int __posix_lock_file(struct inode *inode, struct file_lock *request) | |||
829 | /* Detect adjacent or overlapping regions (if same lock type) | 829 | /* Detect adjacent or overlapping regions (if same lock type) |
830 | */ | 830 | */ |
831 | if (request->fl_type == fl->fl_type) { | 831 | if (request->fl_type == fl->fl_type) { |
832 | /* In all comparisons of start vs end, use | ||
833 | * "start - 1" rather than "end + 1". If end | ||
834 | * is OFFSET_MAX, end + 1 will become negative. | ||
835 | */ | ||
832 | if (fl->fl_end < request->fl_start - 1) | 836 | if (fl->fl_end < request->fl_start - 1) |
833 | goto next_lock; | 837 | goto next_lock; |
834 | /* If the next lock in the list has entirely bigger | 838 | /* If the next lock in the list has entirely bigger |
835 | * addresses than the new one, insert the lock here. | 839 | * addresses than the new one, insert the lock here. |
836 | */ | 840 | */ |
837 | if (fl->fl_start > request->fl_end + 1) | 841 | if (fl->fl_start - 1 > request->fl_end) |
838 | break; | 842 | break; |
839 | 843 | ||
840 | /* If we come here, the new and old lock are of the | 844 | /* If we come here, the new and old lock are of the |