NFSv4.1 resend LAYOUTGET on data server invalid layout errors
The "invalid layout" class of errors is handled by destroying the layout and getting a new layout from the server. Currently, the layout must be destroyed before a new layout can be obtained. This means that all references (e.g.lsegs) to the "to be destroyed" layout header must be dropped before it can be destroyed. This in turn means waiting for all in flight RPC's using the old layout as well as draining the data server session slot table wait queue. Set the NFS_LAYOUT_INVALID flag to redirect I/O to the MDS while waiting for the old layout to be destroyed. Signed-off-by: Andy Adamson <andros@netapp.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:

committed by
Trond Myklebust

parent
b4a2967e52
commit
041245c88a
@@ -128,12 +128,25 @@ filelayout_mark_devid_invalid(struct nfs4_deviceid_node *node)
|
||||
set_bit(NFS_DEVICEID_INVALID, &node->flags);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
filelayout_test_layout_invalid(struct pnfs_layout_hdr *lo)
|
||||
{
|
||||
return test_bit(NFS_LAYOUT_INVALID, &lo->plh_flags);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
filelayout_test_devid_invalid(struct nfs4_deviceid_node *node)
|
||||
{
|
||||
return test_bit(NFS_DEVICEID_INVALID, &node->flags);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
filelayout_reset_to_mds(struct pnfs_layout_segment *lseg)
|
||||
{
|
||||
return filelayout_test_devid_invalid(FILELAYOUT_DEVID_NODE(lseg)) ||
|
||||
filelayout_test_layout_invalid(lseg->pls_layout);
|
||||
}
|
||||
|
||||
extern struct nfs_fh *
|
||||
nfs4_fl_select_ds_fh(struct pnfs_layout_segment *lseg, u32 j);
|
||||
|
||||
|
Reference in New Issue
Block a user