Il 03/07/2013 08:30, Fam Zheng ha scritto: >> > The close notifier runs when the user invokes a drive_del or eject >> > command from the monitor. The drive_get_ref/drive_put_ref delays the >> > bdrv_delete until after nbd.c has cleaned up all the connections. > But drive_put_ref is called by close notifier.
Not necessarily. nbd_export_close calls nbd_client_close, which shuts down the socket. However, if requests are being processed, they will complete after nbd_export_close returns. Completing the requests leads to the following call chain: nbd_request_put (from nbd_trip) calls nbd_client_put calls nbd_export_put calls exp->close (if refcount goes to 0) calls drive_put_ref Completion will happen as soon as the main loop runs again, because after shutdown() the reads and writes will fail. Still, it is asynchronous, hence the call to drive_put_ref is also asynchronous. > I think it can be > omitted, registering a close notifier is enough, and close the export > when drive_del calls it. It doesn't make more sense w/ drive_get_ref, > does it? I think that would cause a dangling pointer if NBD requests are being processed at the time drive_del runs. Paolo