I must be missing something, but it seems that line 574 is excessive here.
On Sat, Nov 16, 2013 at 7:38 PM, Matthew Ahrens <[email protected]> wrote: > Steven, good observation, and thanks for the quick turnaround on this fix. > > I think that we should hold the dsl_pool_config lock while calling > dsl_dataset_name(), because otherwise the dd_parent could change (via > dsl_dir_rename_sync()) and the old parent be evicted while we are looking > at it. This would be an exceedingly tight race condition, probably > impossible to exercise in practice. But we should consider adding an > assertion to this effect (having dsl_dir_name assert that the lock is > held), and making sure that all callers adhere to this convention. That is > outside the scope of this specific fix, however. > > I'd suggest that we hold the lock until after dsl_dataset_name() is > called, using logic like the old code to ensure we drop the lock in the > error case as well; too bad this code is a bit ugly. > > --matt > > > On Sat, Nov 16, 2013 at 4:22 PM, Steven Hartland > <[email protected]>wrote: > >> Hi all looking for reviewers for: >> http://cr.illumos.org/~webrev/steveh/illumos-4322/ >> >> Which addresses: >> https://www.illumos.org/issues/4322 >> >> I've tested to confirm it fixes the issue but I have >> a concern that the dsl_pool_config lock should be >> held for dsl_dataset_name dsl_dataset_rele. >> >> The reason for this is that both the code path >> prior commit: a7a845e4bf22fd1b2a284729ccd95c7370a0438c >> did this: >> dsl_pool_config_enter(dp, FTAG); >> error = dsl_dataset_hold_obj(dp, dsobj, FTAG, &ds); >> if (error == 0) { >> char name[MAXNAMELEN]; >> dsl_dataset_name(ds, name); >> dsl_dataset_rele(ds, FTAG); >> dsl_pool_config_exit(dp, FTAG); >> (void) zfs_unmount_snap(name); >> } else { >> dsl_pool_config_exit(dp, FTAG); >> } >> >> As well as at least one other place I've found: >> spa.c - spa_prop_get >> dsl_pool_config_enter(dp, FTAG); >> if (err = dsl_dataset_hold_obj(dp, >> za.za_first_integer, FTAG, &ds)) { >> dsl_pool_config_exit(dp, FTAG); >> break; >> } >> >> strval = kmem_alloc( >> MAXNAMELEN + strlen(MOS_DIR_NAME) + 1, >> KM_SLEEP); >> dsl_dataset_name(ds, strval); >> dsl_dataset_rele(ds, FTAG); >> dsl_pool_config_exit(dp, FTAG); >> >> If the lock was only required for the obj hold I would >> have expected both of the above to do so as it would be >> cleaner. >> >> I have confirmed a kernel even with full asserts can >> quite happily run without deadlock and no other asserts >> are trigged during a send of a snapshot which is mounted, >> so there are no obvious issues but always best to ask ;-) >> >> Regards >> Steve >> >> ================================================ >> This e.mail is private and confidential between Multiplay (UK) Ltd. and >> the person or entity to whom it is addressed. In the event of misdirection, >> the recipient is prohibited from using, copying, printing or otherwise >> disseminating it or any information contained in it. >> In the event of misdirection, illegible or incomplete transmission please >> telephone +44 845 868 1337 >> or return the E.mail to [email protected]. >> >> >> >> ------------------------------------------- >> illumos-zfs >> Archives: https://www.listbox.com/member/archive/182191/=now >> RSS Feed: https://www.listbox.com/member/archive/rss/182191/ >> 21635000-ebd1d460 >> Modify Your Subscription: https://www.listbox.com/member/?&id_ >> secret=21635000-73dc201a <https://www.listbox.com/member/?&> >> >> Powered by Listbox: http://www.listbox.com >> > > *illumos-zfs* | Archives<https://www.listbox.com/member/archive/182191/=now> > <https://www.listbox.com/member/archive/rss/182191/24013066-c76c6d4d> | > Modify<https://www.listbox.com/member/?member_id=24013066&id_secret=24013066-bdf4d28f>Your > Subscription > <http://www.listbox.com> >
_______________________________________________ developer mailing list [email protected] http://lists.open-zfs.org/mailman/listinfo/developer
