kernel -- FFS: Take softdep lock in softdep_disk_io_initiation.
authorVenkatesh Srinivas <me@endeavour.zapto.org>
Mon, 2 Apr 2012 17:02:25 +0000 (10:02 -0700)
committerVenkatesh Srinivas <me@endeavour.zapto.org>
Mon, 2 Apr 2012 17:31:51 +0000 (10:31 -0700)
softdep_disk_io_initiation was using the mplock rather than the softdep
lock to protect the softdep work queue and items on it. Take the softdep
lock and allow it to be taken recursively, so that io_start bioops can
call into other parts of softdep. Prevents softdep completion callback
from racing softdep_disk_io_initiation, remaining panics of 2291.

Eventually the MPLOCK in the bio_ops callback can go away, but that will
require more testing.

Closes-bug: 2291

sys/vfs/ufs/ffs_softdep.c

index eda63fd..5995eaa 100644 (file)
@@ -1030,7 +1030,7 @@ softdep_initialize(void)
                M_INODEDEP->ks_limit / (2 * sizeof(struct inodedep)));
        pagedep_hashtbl = hashinit(desiredvnodes / 5, M_PAGEDEP,
            &pagedep_hash);
-       lockinit(&lk, "ffs_softdep", 0, 0);
+       lockinit(&lk, "ffs_softdep", 0, LK_CANRECURSE);
        sema_init(&pagedep_in_progress, "pagedep", 0, 0);
        inodedep_hashtbl = hashinit(desiredvnodes, M_INODEDEP, &inodedep_hash);
        sema_init(&inodedep_in_progress, "inodedep", 0, 0);
@@ -3024,6 +3024,7 @@ softdep_disk_io_initiation(struct buf *bp)
                panic("softdep_disk_io_initiation: read");
 
        get_mplock();
+       ACQUIRE_LOCK(&lk);
        marker.wk_type = D_LAST + 1;    /* Not a normal workitem */
        
        /*
@@ -3086,6 +3087,7 @@ softdep_disk_io_initiation(struct buf *bp)
                        /* NOTREACHED */
                }
        }
+       FREE_LOCK(&lk);
        rel_mplock();
 }