Author: Olaf Kirch Date: Mon, 11 Jul 2005 12:32:45 +0200 [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 Signed-off-by: Trond Myklebust --- Index: linux-2.6.12/fs/locks.c =================================================================== --- linux-2.6.12.orig/fs/locks.c 2005-07-11 12:15:59.000000000 +0200 +++ linux-2.6.12/fs/locks.c 2005-07-11 12:16:41.000000000 +0200 @@ -828,12 +828,16 @@ static int __posix_lock_file(struct inod /* Detect adjacent or overlapping regions (if same lock type) */ if (request->fl_type == fl->fl_type) { + /* In all comparisons of start vs end, use + * "start - 1" rather than "end + 1". If end + * is OFFSET_MAX, end + 1 will become negative. + */ if (fl->fl_end < request->fl_start - 1) goto next_lock; /* If the next lock in the list has entirely bigger * addresses than the new one, insert the lock here. */ - if (fl->fl_start > request->fl_end + 1) + if (fl->fl_start - 1 > request->fl_end) break; /* If we come here, the new and old lock are of the