pnfs: Use byte-range for cb_layoutrecall
Use recalled range to invalidate particular layout segments in the layout cache. Signed-off-by: Benny Halevy <bhalevy@panasas.com>
This commit is contained in:
parent
707ed5fdb5
commit
778b5502fd
@ -139,7 +139,7 @@ static u32 initiate_file_draining(struct nfs_client *clp,
|
|||||||
spin_lock(&ino->i_lock);
|
spin_lock(&ino->i_lock);
|
||||||
if (test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags) ||
|
if (test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags) ||
|
||||||
mark_matching_lsegs_invalid(lo, &free_me_list,
|
mark_matching_lsegs_invalid(lo, &free_me_list,
|
||||||
args->cbl_range.iomode))
|
&args->cbl_range))
|
||||||
rv = NFS4ERR_DELAY;
|
rv = NFS4ERR_DELAY;
|
||||||
else
|
else
|
||||||
rv = NFS4ERR_NOMATCHING_LAYOUT;
|
rv = NFS4ERR_NOMATCHING_LAYOUT;
|
||||||
@ -184,7 +184,7 @@ static u32 initiate_bulk_draining(struct nfs_client *clp,
|
|||||||
ino = lo->plh_inode;
|
ino = lo->plh_inode;
|
||||||
spin_lock(&ino->i_lock);
|
spin_lock(&ino->i_lock);
|
||||||
set_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags);
|
set_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags);
|
||||||
if (mark_matching_lsegs_invalid(lo, &free_me_list, range.iomode))
|
if (mark_matching_lsegs_invalid(lo, &free_me_list, &range))
|
||||||
rv = NFS4ERR_DELAY;
|
rv = NFS4ERR_DELAY;
|
||||||
list_del_init(&lo->plh_bulk_recall);
|
list_del_init(&lo->plh_bulk_recall);
|
||||||
spin_unlock(&ino->i_lock);
|
spin_unlock(&ino->i_lock);
|
||||||
|
@ -321,10 +321,12 @@ lo_seg_intersecting(struct pnfs_layout_range *l1,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
should_free_lseg(u32 lseg_iomode, u32 recall_iomode)
|
should_free_lseg(struct pnfs_layout_range *lseg_range,
|
||||||
|
struct pnfs_layout_range *recall_range)
|
||||||
{
|
{
|
||||||
return (recall_iomode == IOMODE_ANY ||
|
return (recall_range->iomode == IOMODE_ANY ||
|
||||||
lseg_iomode == recall_iomode);
|
lseg_range->iomode == recall_range->iomode) &&
|
||||||
|
lo_seg_intersecting(lseg_range, recall_range);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns 1 if lseg is removed from list, 0 otherwise */
|
/* Returns 1 if lseg is removed from list, 0 otherwise */
|
||||||
@ -355,7 +357,7 @@ static int mark_lseg_invalid(struct pnfs_layout_segment *lseg,
|
|||||||
int
|
int
|
||||||
mark_matching_lsegs_invalid(struct pnfs_layout_hdr *lo,
|
mark_matching_lsegs_invalid(struct pnfs_layout_hdr *lo,
|
||||||
struct list_head *tmp_list,
|
struct list_head *tmp_list,
|
||||||
u32 iomode)
|
struct pnfs_layout_range *recall_range)
|
||||||
{
|
{
|
||||||
struct pnfs_layout_segment *lseg, *next;
|
struct pnfs_layout_segment *lseg, *next;
|
||||||
int invalid = 0, removed = 0;
|
int invalid = 0, removed = 0;
|
||||||
@ -368,7 +370,8 @@ mark_matching_lsegs_invalid(struct pnfs_layout_hdr *lo,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
list_for_each_entry_safe(lseg, next, &lo->plh_segs, pls_list)
|
list_for_each_entry_safe(lseg, next, &lo->plh_segs, pls_list)
|
||||||
if (should_free_lseg(lseg->pls_range.iomode, iomode)) {
|
if (!recall_range ||
|
||||||
|
should_free_lseg(&lseg->pls_range, recall_range)) {
|
||||||
dprintk("%s: freeing lseg %p iomode %d "
|
dprintk("%s: freeing lseg %p iomode %d "
|
||||||
"offset %llu length %llu\n", __func__,
|
"offset %llu length %llu\n", __func__,
|
||||||
lseg, lseg->pls_range.iomode, lseg->pls_range.offset,
|
lseg, lseg->pls_range.iomode, lseg->pls_range.offset,
|
||||||
@ -417,7 +420,7 @@ pnfs_destroy_layout(struct nfs_inode *nfsi)
|
|||||||
lo = nfsi->layout;
|
lo = nfsi->layout;
|
||||||
if (lo) {
|
if (lo) {
|
||||||
lo->plh_block_lgets++; /* permanently block new LAYOUTGETs */
|
lo->plh_block_lgets++; /* permanently block new LAYOUTGETs */
|
||||||
mark_matching_lsegs_invalid(lo, &tmp_list, IOMODE_ANY);
|
mark_matching_lsegs_invalid(lo, &tmp_list, NULL);
|
||||||
}
|
}
|
||||||
spin_unlock(&nfsi->vfs_inode.i_lock);
|
spin_unlock(&nfsi->vfs_inode.i_lock);
|
||||||
pnfs_free_lseg_list(&tmp_list);
|
pnfs_free_lseg_list(&tmp_list);
|
||||||
|
@ -154,7 +154,7 @@ int pnfs_choose_layoutget_stateid(nfs4_stateid *dst,
|
|||||||
struct nfs4_state *open_state);
|
struct nfs4_state *open_state);
|
||||||
int mark_matching_lsegs_invalid(struct pnfs_layout_hdr *lo,
|
int mark_matching_lsegs_invalid(struct pnfs_layout_hdr *lo,
|
||||||
struct list_head *tmp_list,
|
struct list_head *tmp_list,
|
||||||
u32 iomode);
|
struct pnfs_layout_range *recall_range);
|
||||||
bool pnfs_roc(struct inode *ino);
|
bool pnfs_roc(struct inode *ino);
|
||||||
void pnfs_roc_release(struct inode *ino);
|
void pnfs_roc_release(struct inode *ino);
|
||||||
void pnfs_roc_set_barrier(struct inode *ino, u32 barrier);
|
void pnfs_roc_set_barrier(struct inode *ino, u32 barrier);
|
||||||
|
Loading…
Reference in New Issue
Block a user