Print this page
3752 want more verifiable dbuf user eviction
Submitted by:   Justin Gibbs <justing@spectralogic.com>
Submitted by:   Will Andrews <willa@spectralogic.com>

@@ -456,12 +456,16 @@
         if (dn->dn_dirtyctx_firstset != NULL) {
                 kmem_free(dn->dn_dirtyctx_firstset, 1);
                 dn->dn_dirtyctx_firstset = NULL;
         }
         if (dn->dn_bonus != NULL) {
+                list_t evict_list;
+
+                dmu_buf_create_user_evict_list(&evict_list);
                 mutex_enter(&dn->dn_bonus->db_mtx);
-                dbuf_evict(dn->dn_bonus);
+                dbuf_evict(dn->dn_bonus, &evict_list);
+                dmu_buf_destroy_user_evict_list(&evict_list);
                 dn->dn_bonus = NULL;
         }
         dn->dn_zio = NULL;
 
         dn->dn_have_spill = B_FALSE;

@@ -955,19 +959,16 @@
         DNODE_VERIFY(dn);
         return (dn);
 }
 
 static void
-dnode_buf_pageout(dmu_buf_t *db, void *arg)
+dnode_buf_pageout(dmu_buf_user_t *dbu)
 {
-        dnode_children_t *children_dnodes = arg;
+        dnode_children_t *children_dnodes = (dnode_children_t *)dbu;
         int i;
-        int epb = db->db_size >> DNODE_SHIFT;
-
-        ASSERT(epb == children_dnodes->dnc_count);
 
-        for (i = 0; i < epb; i++) {
+        for (i = 0; i < children_dnodes->dnc_count; i++) {
                 dnode_handle_t *dnh = &children_dnodes->dnc_children[i];
                 dnode_t *dn;
 
                 /*
                  * The dnode handle lock guards against the dnode moving to

@@ -993,11 +994,11 @@
                 dnode_destroy(dn); /* implicit zrl_remove() */
                 zrl_destroy(&dnh->dnh_zrlock);
                 dnh->dnh_dnode = NULL;
         }
         kmem_free(children_dnodes, sizeof (dnode_children_t) +
-            (epb - 1) * sizeof (dnode_handle_t));
+            (children_dnodes->dnc_count - 1) * sizeof (dnode_handle_t));
 }
 
 /*
  * errors:
  * EINVAL - invalid object number.

@@ -1073,11 +1074,11 @@
         epb = db->db.db_size >> DNODE_SHIFT;
 
         idx = object & (epb-1);
 
         ASSERT(DB_DNODE(db)->dn_type == DMU_OT_DNODE);
-        children_dnodes = dmu_buf_get_user(&db->db);
+        children_dnodes = (dnode_children_t *)dmu_buf_get_user(&db->db);
         if (children_dnodes == NULL) {
                 int i;
                 dnode_children_t *winner;
                 children_dnodes = kmem_alloc(sizeof (dnode_children_t) +
                     (epb - 1) * sizeof (dnode_handle_t), KM_SLEEP);

@@ -1085,12 +1086,15 @@
                 dnh = &children_dnodes->dnc_children[0];
                 for (i = 0; i < epb; i++) {
                         zrl_init(&dnh[i].dnh_zrlock);
                         dnh[i].dnh_dnode = NULL;
                 }
-                if (winner = dmu_buf_set_user(&db->db, children_dnodes, NULL,
-                    dnode_buf_pageout)) {
+                dmu_buf_init_user(&children_dnodes->db_evict,
+                    dnode_buf_pageout);
+                winner = (dnode_children_t *)
+                    dmu_buf_set_user(&db->db, &children_dnodes->db_evict);
+                if (winner) {
                         kmem_free(children_dnodes, sizeof (dnode_children_t) +
                             (epb - 1) * sizeof (dnode_handle_t));
                         children_dnodes = winner;
                 }
         }