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:
John Baldwin 2008-11-04 18:56:12 +00:00
parent 7265164f53
commit 2ef42c06d6

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);
}
/*