[interface] Unplug interface before calling intf_close() in intf_shutdown()
authorMichael Brown <mcb30@ipxe.org>
Wed, 25 Jan 2017 10:19:02 +0000 (10:19 +0000)
committerMichael Brown <mcb30@ipxe.org>
Wed, 25 Jan 2017 11:29:29 +0000 (11:29 +0000)
commitf450c75dad04061f2d51401088f156e1226804ac
tree73ac06fd9aecb6275b7f5c08686318457e3f6e22
parent5ff13830ec5e2a5f0e8d82d780c264b73faf1935
[interface] Unplug interface before calling intf_close() in intf_shutdown()

The call to intf_close() may result in the original interface being
reopened.  For example: when reading the capacity of a 2TB+ disk via
iSCSI, the SCSI layer will respond to the intf_close() from the READ
CAPACITY (10) command by immediately issuing a READ CAPACITY (16)
command.  The iSCSI layer happens to reuse the same interface for the
new command (since it allows only a single concurrent command).

Currently, intf_shutdown() unplugs the interface after the call to
intf_close() returns.  In the above scenario, this results in
unplugging the just-reopened interface.

Fix by transferring the interface destination (and its reference) to a
temporary interface, and so effectively performing the unplug before
making the call to intf_close().

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/interface.c