Quiet a WITNESS warning with the dirhash sx locks by setting the DUPOK

flag.  Specifically, if two threads race to create a dirhash for a
directory, then one might already have created a private dirhash
structure (and locked it) when it realizes the directory now has a
structure and tries to lock that one.
This commit is contained in:
jhb 2008-11-04 18:56:12 +00:00
parent 5af731a4af
commit 9f264a6a75

View File

@ -181,7 +181,16 @@ ufsdirhash_create(struct inode *ip)
if (ndh == NULL)
return (NULL);
refcount_init(&ndh->dh_refcount, 1);
sx_init(&ndh->dh_lock, "dirhash");
/*
* The DUPOK is to prevent warnings from the
* sx_slock() a few lines down which is safe
* since the duplicate lock in that case is
* the one for this dirhash we are creating
* now which has no external references until
* after this function returns.
*/
sx_init_flags(&ndh->dh_lock, "dirhash", SX_DUPOK);
sx_xlock(&ndh->dh_lock);
}
/*