mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 20:54:03 +02:00
NFSv4/pnfs: Add support for the PNFS_LAYOUT_FILE_BULK_RETURN flag
Add a flag PNFS_LAYOUT_FILE_BULK_RETURN, that will attempt to return all the layouts in a pnfs_layout_destroy_byfsid/pnfs_layout_destroy_byclid call, instead of just invalidating them. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
8adc830210
commit
41d0a8ead9
|
|
@ -476,6 +476,18 @@ pnfs_mark_layout_stateid_invalid(struct pnfs_layout_hdr *lo,
|
||||||
return !list_empty(&lo->plh_segs);
|
return !list_empty(&lo->plh_segs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int pnfs_mark_layout_stateid_return(struct pnfs_layout_hdr *lo,
|
||||||
|
struct list_head *lseg_list,
|
||||||
|
enum pnfs_iomode iomode, u32 seq)
|
||||||
|
{
|
||||||
|
struct pnfs_layout_range range = {
|
||||||
|
.iomode = iomode,
|
||||||
|
.length = NFS4_MAX_UINT64,
|
||||||
|
};
|
||||||
|
|
||||||
|
return pnfs_mark_matching_lsegs_return(lo, lseg_list, &range, seq);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
pnfs_iomode_to_fail_bit(u32 iomode)
|
pnfs_iomode_to_fail_bit(u32 iomode)
|
||||||
{
|
{
|
||||||
|
|
@ -886,7 +898,10 @@ pnfs_layout_free_bulk_destroy_list(struct list_head *layout_list,
|
||||||
|
|
||||||
spin_lock(&inode->i_lock);
|
spin_lock(&inode->i_lock);
|
||||||
list_del_init(&lo->plh_bulk_destroy);
|
list_del_init(&lo->plh_bulk_destroy);
|
||||||
if (pnfs_mark_layout_stateid_invalid(lo, &lseg_list)) {
|
if (mode == PNFS_LAYOUT_FILE_BULK_RETURN) {
|
||||||
|
pnfs_mark_layout_stateid_return(lo, &lseg_list,
|
||||||
|
IOMODE_ANY, 0);
|
||||||
|
} else if (pnfs_mark_layout_stateid_invalid(lo, &lseg_list)) {
|
||||||
if (mode == PNFS_LAYOUT_BULK_RETURN)
|
if (mode == PNFS_LAYOUT_BULK_RETURN)
|
||||||
set_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags);
|
set_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags);
|
||||||
ret = -EAGAIN;
|
ret = -EAGAIN;
|
||||||
|
|
@ -1265,27 +1280,15 @@ pnfs_send_layoutreturn(struct pnfs_layout_hdr *lo,
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
|
||||||
pnfs_layout_segments_returnable(struct pnfs_layout_hdr *lo,
|
|
||||||
enum pnfs_iomode iomode,
|
|
||||||
u32 seq)
|
|
||||||
{
|
|
||||||
struct pnfs_layout_range recall_range = {
|
|
||||||
.length = NFS4_MAX_UINT64,
|
|
||||||
.iomode = iomode,
|
|
||||||
};
|
|
||||||
return pnfs_mark_matching_lsegs_return(lo, &lo->plh_return_segs,
|
|
||||||
&recall_range, seq) != -EBUSY;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return true if layoutreturn is needed */
|
/* Return true if layoutreturn is needed */
|
||||||
static bool
|
static bool
|
||||||
pnfs_layout_need_return(struct pnfs_layout_hdr *lo)
|
pnfs_layout_need_return(struct pnfs_layout_hdr *lo)
|
||||||
{
|
{
|
||||||
if (!test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags))
|
if (!test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags))
|
||||||
return false;
|
return false;
|
||||||
return pnfs_layout_segments_returnable(lo, lo->plh_return_iomode,
|
return pnfs_mark_layout_stateid_return(lo, &lo->plh_return_segs,
|
||||||
lo->plh_return_seq);
|
lo->plh_return_iomode,
|
||||||
|
lo->plh_return_seq) != EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pnfs_layoutreturn_before_put_layout_hdr(struct pnfs_layout_hdr *lo)
|
static void pnfs_layoutreturn_before_put_layout_hdr(struct pnfs_layout_hdr *lo)
|
||||||
|
|
|
||||||
|
|
@ -121,6 +121,7 @@ enum layoutdriver_policy_flags {
|
||||||
enum pnfs_layout_destroy_mode {
|
enum pnfs_layout_destroy_mode {
|
||||||
PNFS_LAYOUT_INVALIDATE = 0,
|
PNFS_LAYOUT_INVALIDATE = 0,
|
||||||
PNFS_LAYOUT_BULK_RETURN,
|
PNFS_LAYOUT_BULK_RETURN,
|
||||||
|
PNFS_LAYOUT_FILE_BULK_RETURN,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct nfs4_deviceid_node;
|
struct nfs4_deviceid_node;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user