On Mon, Jan 30, 2017 at 04:23:10PM -0800, Darrick J. Wong wrote: > From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > > We use di_format and if_flags to decide whether we're grabbing the ilock > in btree mode (btree extents not loaded) or shared mode (anything else), > but the state of those fields can be changed by other threads that are > also trying to load the btree extents -- IFEXTENTS gets set before the > _bmap_read_extents call and cleared if it fails. Therefore, once we've > grabbed the shared ilock we have to re-check the fields to see if we > actually need to upgrade to the exclusive ilock in order to try loading > the extents. > > Without this patch, we trigger ilock assert failures when a bunch of > threads try to access a btree format directory with a corrupt bmbt root > and corrupt the incore data structures, leading to a crash. I see the problem here, but I really don't like the fix. Instead I'd much rather check for a new flag that tells that the extent list hasn't been read, which can only be cleared under the exclusive ilock. That way we shouldn't need any additional relocking or checks. -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html