@ -1631,6 +1631,16 @@ pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *pgio,
}
EXPORT_SYMBOL_GPL ( pnfs_generic_pg_init_write ) ;
void
pnfs_generic_pg_cleanup ( struct nfs_pageio_descriptor * desc )
{
if ( desc - > pg_lseg ) {
pnfs_put_lseg ( desc - > pg_lseg ) ;
desc - > pg_lseg = NULL ;
}
}
EXPORT_SYMBOL_GPL ( pnfs_generic_pg_cleanup ) ;
/*
* Return 0 if @ req cannot be coalesced into @ pgio , otherwise return the number
* of bytes ( maximum @ req - > wb_bytes ) that can be coalesced .
@ -1756,11 +1766,9 @@ pnfs_do_write(struct nfs_pageio_descriptor *desc,
struct pnfs_layout_segment * lseg = desc - > pg_lseg ;
enum pnfs_try_status trypnfs ;
desc - > pg_lseg = NULL ;
trypnfs = pnfs_try_to_write_data ( hdr , call_ops , lseg , how ) ;
if ( trypnfs = = PNFS_NOT_ATTEMPTED )
pnfs_write_through_mds ( desc , hdr ) ;
pnfs_put_lseg ( lseg ) ;
}
static void pnfs_writehdr_free ( struct nfs_pgio_header * hdr )
@ -1779,17 +1787,13 @@ pnfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
hdr = nfs_pgio_header_alloc ( desc - > pg_rw_ops ) ;
if ( ! hdr ) {
desc - > pg_completion_ops - > error_cleanup ( & desc - > pg_list ) ;
pnfs_put_lseg ( desc - > pg_lseg ) ;
desc - > pg_lseg = NULL ;
return - ENOMEM ;
}
nfs_pgheader_init ( desc , hdr , pnfs_writehdr_free ) ;
hdr - > lseg = pnfs_get_lseg ( desc - > pg_lseg ) ;
ret = nfs_generic_pgio ( desc , hdr ) ;
if ( ret ! = 0 ) {
pnfs_put_lseg ( desc - > pg_lseg ) ;
desc - > pg_lseg = NULL ;
} else
if ( ! ret )
pnfs_do_write ( desc , hdr , desc - > pg_ioflags ) ;
return ret ;
}
@ -1874,11 +1878,9 @@ pnfs_do_read(struct nfs_pageio_descriptor *desc, struct nfs_pgio_header *hdr)
struct pnfs_layout_segment * lseg = desc - > pg_lseg ;
enum pnfs_try_status trypnfs ;
desc - > pg_lseg = NULL ;
trypnfs = pnfs_try_to_read_data ( hdr , call_ops , lseg ) ;
if ( trypnfs = = PNFS_NOT_ATTEMPTED )
pnfs_read_through_mds ( desc , hdr ) ;
pnfs_put_lseg ( lseg ) ;
}
static void pnfs_readhdr_free ( struct nfs_pgio_header * hdr )
@ -1897,18 +1899,12 @@ pnfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
hdr = nfs_pgio_header_alloc ( desc - > pg_rw_ops ) ;
if ( ! hdr ) {
desc - > pg_completion_ops - > error_cleanup ( & desc - > pg_list ) ;
ret = - ENOMEM ;
pnfs_put_lseg ( desc - > pg_lseg ) ;
desc - > pg_lseg = NULL ;
return ret ;
return - ENOMEM ;
}
nfs_pgheader_init ( desc , hdr , pnfs_readhdr_free ) ;
hdr - > lseg = pnfs_get_lseg ( desc - > pg_lseg ) ;
ret = nfs_generic_pgio ( desc , hdr ) ;
if ( ret ! = 0 ) {
pnfs_put_lseg ( desc - > pg_lseg ) ;
desc - > pg_lseg = NULL ;
} else
if ( ! ret )
pnfs_do_read ( desc , hdr ) ;
return ret ;
}