kernel - Close possible hole in hammer inval code
authorMatthew Dillon <dillon@apollo.backplane.com>
Thu, 11 Nov 2010 18:12:59 +0000 (10:12 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Thu, 18 Nov 2010 17:43:42 +0000 (09:43 -0800)
* Do not use FINDBLK_TEST, instead have findblk() return a locked buffer
  cache buffer and deal with it from there.  While the original code
  should have been ok (it would getblk() the buffer cache in either case),
  it depended on certain MP race characteristics that might not hold so
  don't take any chances.

* This does not fix any known issues but removes some uncertainty.

sys/vfs/hammer/hammer_io.c

index 4573465..ac892f4 100644 (file)
@@ -437,13 +437,14 @@ hammer_io_inval(hammer_volume_t volume, hammer_off_t zone2_offset)
        lwkt_gettoken(&hmp->io_token);
 
        /*
-        * Warning: FINDBLK_TEST return stable storage but not stable
-        *          contents.  It happens to be ok in this case.
+        * If a device buffer already exists for the specified physical
+        * offset use that, otherwise instantiate a buffer to cover any
+        * related VM pages, set BNOCACHE, and brelse().
         */
        phys_offset = volume->ondisk->vol_buf_beg +
                      (zone2_offset & HAMMER_OFF_SHORT_MASK);
-       if ((bp = findblk(volume->devvp, phys_offset, FINDBLK_TEST)) != NULL)
-               bp = getblk(volume->devvp, phys_offset, bp->b_bufsize, 0, 0);
+       if ((bp = findblk(volume->devvp, phys_offset, 0)) != NULL)
+               bremfree(bp);
        else
                bp = getblk(volume->devvp, phys_offset, HAMMER_BUFSIZE, 0, 0);