|
@@ -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;
|
|
|
}
|