mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-01 02:33:57 +00:00
nfs/blocklayout: Limit repeat device registration on failure
Every pNFS SCSI IO wants to do LAYOUTGET, then within the layout find the
device which can drive GETDEVINFO, then finally may need to prep the device
with a reservation. This slow work makes a mess of IO latencies if one of
the later steps is going to fail for awhile.
If we're unable to register a SCSI device, ensure we mark the device as
unavailable so that it will timeout and be re-added via GETDEVINFO. This
avoids repeated doomed attempts to register a device in the IO path.
Add some clarifying comments as well.
Fixes: d869da91cc
("nfs/blocklayout: Fix premature PR key unregistration")
Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
3a4ce14d9a
commit
614733f944
@ -571,19 +571,32 @@ bl_find_get_deviceid(struct nfs_server *server,
|
||||
if (!node)
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
||||
/*
|
||||
* Devices that are marked unavailable are left in the cache with a
|
||||
* timeout to avoid sending GETDEVINFO after every LAYOUTGET, or
|
||||
* constantly attempting to register the device. Once marked as
|
||||
* unavailable they must be deleted and never reused.
|
||||
*/
|
||||
if (test_bit(NFS_DEVICEID_UNAVAILABLE, &node->flags)) {
|
||||
unsigned long end = jiffies;
|
||||
unsigned long start = end - PNFS_DEVICE_RETRY_TIMEOUT;
|
||||
|
||||
if (!time_in_range(node->timestamp_unavailable, start, end)) {
|
||||
/* Uncork subsequent GETDEVINFO operations for this device */
|
||||
nfs4_delete_deviceid(node->ld, node->nfs_client, id);
|
||||
goto retry;
|
||||
}
|
||||
goto out_put;
|
||||
}
|
||||
|
||||
if (!bl_register_dev(container_of(node, struct pnfs_block_dev, node)))
|
||||
if (!bl_register_dev(container_of(node, struct pnfs_block_dev, node))) {
|
||||
/*
|
||||
* If we cannot register, treat this device as transient:
|
||||
* Make a negative cache entry for the device
|
||||
*/
|
||||
nfs4_mark_deviceid_unavailable(node);
|
||||
goto out_put;
|
||||
}
|
||||
|
||||
return node;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user