Files
linux/fs
Pavel Emelyanov 85c59580b3 locks: Fix potential OOPS in generic_setlease()
This code is run under lock_kernel(), which is dropped during
sleeping operations, so the following race is possible:

CPU1:                                CPU2:
  vfs_setlease();                    vfs_setlease();
  lock_kernel();
                                     lock_kernel(); /* spin */
  generic_setlease():
    ...
    for (before = ...)
    /* here we found some lease after
     * which we will insert the new one
     */
    fl = locks_alloc_lock();
    /* go to sleep in this allocation and
     * drop the BKL
     */
                                     generic_setlease():
                                       ...
                                       for (before = ...)
                                       /* here we find the "before" pointing
                                        * at the one we found on CPU1
                                        */
                                      ->fl_change(my_before, arg);
                                              lease_modify();
                                                     locks_free_lock();
                                                     /* and we freed it */
                                     ...
                                     unlock_kernel();
   locks_insert_lock(before, fl);
   /* OOPS! We have just tried to add the lease
    * at the tail of already removed one
    */

The similar races are already handled in other code - all the
allocations are performed before any checks/updates.

Thanks to Kamalesh Babulal for testing and for a bug report on an
earlier version.

Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Cc: Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>
2007-10-09 18:32:45 -04:00
..
2007-09-11 17:21:19 -07:00
2007-08-22 19:52:46 -07:00
2007-05-08 11:14:59 -07:00
2007-09-28 15:36:42 -07:00
2007-07-16 09:05:52 -07:00
2007-07-31 15:39:36 -07:00
2007-09-11 17:21:19 -07:00
2007-09-25 08:51:04 -07:00
2007-10-08 12:58:14 -07:00
2007-07-21 17:49:14 -07:00
2007-07-20 08:44:19 -07:00
2007-07-19 10:04:43 -07:00
2007-07-19 10:04:45 -07:00
2007-07-29 17:09:29 -07:00
2007-05-18 13:09:34 -07:00
2007-09-20 13:19:59 -07:00
2007-05-21 09:18:19 -07:00
2007-05-08 11:15:01 -07:00
2007-05-08 11:15:09 -07:00
2007-07-16 09:05:48 -07:00
2007-09-11 11:38:25 -07:00
2007-05-09 06:44:57 +02:00
2007-05-11 08:29:36 -07:00
2007-07-19 10:04:45 -07:00
2007-07-19 10:04:45 -07:00
2007-07-27 08:08:51 +02:00
2007-07-27 15:40:13 -07:00
2007-07-10 08:04:15 +02:00
2007-09-20 13:19:59 -07:00
2007-07-16 09:05:46 -07:00