summaryrefslogtreecommitdiffstats
path: root/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c
diff options
context:
space:
mode:
authordelphij <delphij@FreeBSD.org>2015-01-23 18:39:26 +0000
committerdelphij <delphij@FreeBSD.org>2015-01-23 18:39:26 +0000
commit902f541eb57090cc0e218020bd772528b1e1dd53 (patch)
tree16f7b3f42db592b638e56e2ac9f5e2576eb6bff2 /sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c
parent429a0a7af7eec333d5ae02fa4ae60f49a74500cd (diff)
downloadFreeBSD-src-902f541eb57090cc0e218020bd772528b1e1dd53.zip
FreeBSD-src-902f541eb57090cc0e218020bd772528b1e1dd53.tar.gz
MFC r275922: MFV r275914:
As of r270383, the dbuf_compare comparator compares the dbuf attributes in the following order: db_level (indirect level) db_blkid (block number) db_state (current state) the address of the element Because db_state is being considered before the element's state, changing of db_state would affect balancedness of the AVL tree, even when the address of element compares differently. For instance, in dbuf_create, db_state may be altered after the node is inserted into the AVL tree and may break AVL tree balancedness. Instead of using db_state as a comparision critera (introduced in r270383), consider it only when we are doing a lookup, that is one of the two dbuf pointers contains DB_SEARCH. Illumos issue: 5422 preserve AVL invariants in dn_dbufs
Diffstat (limited to 'sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c')
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c
index 66552c3..665165a 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c
@@ -81,16 +81,14 @@ dbuf_compare(const void *x1, const void *x2)
return (1);
}
- if (d1->db_state < d2->db_state) {
+ if (d1->db_state == DB_SEARCH) {
+ ASSERT3S(d2->db_state, !=, DB_SEARCH);
return (-1);
- }
- if (d1->db_state > d2->db_state) {
+ } else if (d2->db_state == DB_SEARCH) {
+ ASSERT3S(d1->db_state, !=, DB_SEARCH);
return (1);
}
- ASSERT3S(d1->db_state, !=, DB_SEARCH);
- ASSERT3S(d2->db_state, !=, DB_SEARCH);
-
if ((uintptr_t)d1 < (uintptr_t)d2) {
return (-1);
}
OpenPOWER on IntegriCloud