diff options
author | George Wilson <[email protected]> | 2012-12-21 14:57:09 -0800 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2013-01-08 10:35:44 -0800 |
commit | 1eb5bfa3dcdaecb19543d9df13131374a7a42947 (patch) | |
tree | ab0fafd17c371d778d5b195583709abd628d2c24 /module/zfs/dbuf.c | |
parent | 753c38392ddff9d3cf140bb4d28f3bfba52c92d2 (diff) |
Illumos #3145, #3212
3145 single-copy arc
3212 ztest: race condition between vdev_online() and spa_vdev_remove()
Reviewed by: Matt Ahrens <[email protected]>
Reviewed by: Adam Leventhal <[email protected]>
Reviewed by: Eric Schrock <[email protected]>
Reviewed by: Justin T. Gibbs <[email protected]>
Approved by: Eric Schrock <[email protected]>
References:
illumos-gate/commit/9253d63df408bb48584e0b1abfcc24ef2472382e
illumos changeset: 13840:97fd5cdf328a
https://www.illumos.org/issues/3145
https://www.illumos.org/issues/3212
Ported-by: Brian Behlendorf <[email protected]>
Closes #989
Closes #1137
Diffstat (limited to 'module/zfs/dbuf.c')
-rw-r--r-- | module/zfs/dbuf.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/module/zfs/dbuf.c b/module/zfs/dbuf.c index 99f728f4b..205abaada 100644 --- a/module/zfs/dbuf.c +++ b/module/zfs/dbuf.c @@ -2189,7 +2189,24 @@ dbuf_rele_and_unlock(dmu_buf_impl_t *db, void *tag) dbuf_evict(db); } else { VERIFY(arc_buf_remove_ref(db->db_buf, db) == 0); - if (!DBUF_IS_CACHEABLE(db)) + + /* + * A dbuf will be eligible for eviction if either the + * 'primarycache' property is set or a duplicate + * copy of this buffer is already cached in the arc. + * + * In the case of the 'primarycache' a buffer + * is considered for eviction if it matches the + * criteria set in the property. + * + * To decide if our buffer is considered a + * duplicate, we must call into the arc to determine + * if multiple buffers are referencing the same + * block on-disk. If so, then we simply evict + * ourselves. + */ + if (!DBUF_IS_CACHEABLE(db) || + arc_buf_eviction_needed(db->db_buf)) dbuf_clear(db); else mutex_exit(&db->db_mtx); |