kernel - Fix panic when the ccd device is used with swapcache
authorMatthew Dillon <dillon@apollo.backplane.com>
Wed, 27 Jul 2011 03:37:54 +0000 (20:37 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Wed, 27 Jul 2011 03:37:54 +0000 (20:37 -0700)
* The CCD device does not populate bp->b_xio.xio_npages or xio_pages[].
  A quirk in the xio test in vn_cache_strategy() could result in a null
  pointer dereference panic.

* Fix the test to avoid the panic.  Note that swapcache does not currently
  work well with the CCD device for stripe-crossing I/Os due to the way
  CCD breaks the I/O up.  It should no longer panic, though.

sys/kern/vfs_bio.c

index 9a30ccb..35d9953 100644 (file)
@@ -3774,8 +3774,11 @@ vn_cache_strategy(struct vnode *vp, struct bio *bio)
 
        /*
         * If we are good then issue the I/O using swap_pager_strategy().
+        *
+        * We can only do this if the buffer actually supports object-backed
+        * I/O.  If it doesn't npages will be 0.
         */
-       if (i == bp->b_xio.xio_npages) {
+       if (i && i == bp->b_xio.xio_npages) {
                m = bp->b_xio.xio_pages[0];
                nbio = push_bio(bio);
                nbio->bio_done = vn_cache_strategy_callback;