pnfs: clean up *_resend_to_mds
Clean up pnfs_read_done_resend_to_mds and pnfs_write_done_resend_to_mds: - instead of passing all arguments from a nfs_pgio_header, just pass the header - share the common code Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Weston Andros Adamson <dros@primarydata.com> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
Родитель
4714fb51fd
Коммит
53113ad35e
|
@ -97,10 +97,7 @@ static void filelayout_reset_write(struct nfs_pgio_header *hdr)
|
||||||
hdr->args.count,
|
hdr->args.count,
|
||||||
(unsigned long long)hdr->args.offset);
|
(unsigned long long)hdr->args.offset);
|
||||||
|
|
||||||
task->tk_status = pnfs_write_done_resend_to_mds(hdr->inode,
|
task->tk_status = pnfs_write_done_resend_to_mds(hdr);
|
||||||
&hdr->pages,
|
|
||||||
hdr->completion_ops,
|
|
||||||
hdr->dreq);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,10 +114,7 @@ static void filelayout_reset_read(struct nfs_pgio_header *hdr)
|
||||||
hdr->args.count,
|
hdr->args.count,
|
||||||
(unsigned long long)hdr->args.offset);
|
(unsigned long long)hdr->args.offset);
|
||||||
|
|
||||||
task->tk_status = pnfs_read_done_resend_to_mds(hdr->inode,
|
task->tk_status = pnfs_read_done_resend_to_mds(hdr);
|
||||||
&hdr->pages,
|
|
||||||
hdr->completion_ops,
|
|
||||||
hdr->dreq);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -949,6 +949,38 @@ int nfs_pageio_add_request(struct nfs_pageio_descriptor *desc,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(nfs_pageio_add_request);
|
EXPORT_SYMBOL_GPL(nfs_pageio_add_request);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* nfs_pageio_resend - Transfer requests to new descriptor and resend
|
||||||
|
* @hdr - the pgio header to move request from
|
||||||
|
* @desc - the pageio descriptor to add requests to
|
||||||
|
*
|
||||||
|
* Try to move each request (nfs_page) from @hdr to @desc then attempt
|
||||||
|
* to send them.
|
||||||
|
*
|
||||||
|
* Returns 0 on success and < 0 on error.
|
||||||
|
*/
|
||||||
|
int nfs_pageio_resend(struct nfs_pageio_descriptor *desc,
|
||||||
|
struct nfs_pgio_header *hdr)
|
||||||
|
{
|
||||||
|
LIST_HEAD(failed);
|
||||||
|
|
||||||
|
desc->pg_dreq = hdr->dreq;
|
||||||
|
while (!list_empty(&hdr->pages)) {
|
||||||
|
struct nfs_page *req = nfs_list_entry(hdr->pages.next);
|
||||||
|
|
||||||
|
nfs_list_remove_request(req);
|
||||||
|
if (!nfs_pageio_add_request(desc, req))
|
||||||
|
nfs_list_add_request(req, &failed);
|
||||||
|
}
|
||||||
|
nfs_pageio_complete(desc);
|
||||||
|
if (!list_empty(&failed)) {
|
||||||
|
list_move(&failed, &hdr->pages);
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(nfs_pageio_resend);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* nfs_pageio_complete - Complete I/O on an nfs_pageio_descriptor
|
* nfs_pageio_complete - Complete I/O on an nfs_pageio_descriptor
|
||||||
* @desc: pointer to io descriptor
|
* @desc: pointer to io descriptor
|
||||||
|
|
|
@ -1470,35 +1470,14 @@ pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(pnfs_generic_pg_test);
|
EXPORT_SYMBOL_GPL(pnfs_generic_pg_test);
|
||||||
|
|
||||||
int pnfs_write_done_resend_to_mds(struct inode *inode,
|
int pnfs_write_done_resend_to_mds(struct nfs_pgio_header *hdr)
|
||||||
struct list_head *head,
|
|
||||||
const struct nfs_pgio_completion_ops *compl_ops,
|
|
||||||
struct nfs_direct_req *dreq)
|
|
||||||
{
|
{
|
||||||
struct nfs_pageio_descriptor pgio;
|
struct nfs_pageio_descriptor pgio;
|
||||||
LIST_HEAD(failed);
|
|
||||||
|
|
||||||
/* Resend all requests through the MDS */
|
/* Resend all requests through the MDS */
|
||||||
nfs_pageio_init_write(&pgio, inode, FLUSH_STABLE, true, compl_ops);
|
nfs_pageio_init_write(&pgio, hdr->inode, FLUSH_STABLE, true,
|
||||||
pgio.pg_dreq = dreq;
|
hdr->completion_ops);
|
||||||
while (!list_empty(head)) {
|
return nfs_pageio_resend(&pgio, hdr);
|
||||||
struct nfs_page *req = nfs_list_entry(head->next);
|
|
||||||
|
|
||||||
nfs_list_remove_request(req);
|
|
||||||
if (!nfs_pageio_add_request(&pgio, req))
|
|
||||||
nfs_list_add_request(req, &failed);
|
|
||||||
}
|
|
||||||
nfs_pageio_complete(&pgio);
|
|
||||||
|
|
||||||
if (!list_empty(&failed)) {
|
|
||||||
/* For some reason our attempt to resend pages. Mark the
|
|
||||||
* overall send request as having failed, and let
|
|
||||||
* nfs_writeback_release_full deal with the error.
|
|
||||||
*/
|
|
||||||
list_move(&failed, head);
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(pnfs_write_done_resend_to_mds);
|
EXPORT_SYMBOL_GPL(pnfs_write_done_resend_to_mds);
|
||||||
|
|
||||||
|
@ -1511,10 +1490,7 @@ static void pnfs_ld_handle_write_error(struct nfs_pgio_header *hdr)
|
||||||
pnfs_return_layout(hdr->inode);
|
pnfs_return_layout(hdr->inode);
|
||||||
}
|
}
|
||||||
if (!test_and_set_bit(NFS_IOHDR_REDO, &hdr->flags))
|
if (!test_and_set_bit(NFS_IOHDR_REDO, &hdr->flags))
|
||||||
hdr->task.tk_status = pnfs_write_done_resend_to_mds(hdr->inode,
|
hdr->task.tk_status = pnfs_write_done_resend_to_mds(hdr);
|
||||||
&hdr->pages,
|
|
||||||
hdr->completion_ops,
|
|
||||||
hdr->dreq);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1612,31 +1588,13 @@ pnfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(pnfs_generic_pg_writepages);
|
EXPORT_SYMBOL_GPL(pnfs_generic_pg_writepages);
|
||||||
|
|
||||||
int pnfs_read_done_resend_to_mds(struct inode *inode,
|
int pnfs_read_done_resend_to_mds(struct nfs_pgio_header *hdr)
|
||||||
struct list_head *head,
|
|
||||||
const struct nfs_pgio_completion_ops *compl_ops,
|
|
||||||
struct nfs_direct_req *dreq)
|
|
||||||
{
|
{
|
||||||
struct nfs_pageio_descriptor pgio;
|
struct nfs_pageio_descriptor pgio;
|
||||||
LIST_HEAD(failed);
|
|
||||||
|
|
||||||
/* Resend all requests through the MDS */
|
/* Resend all requests through the MDS */
|
||||||
nfs_pageio_init_read(&pgio, inode, true, compl_ops);
|
nfs_pageio_init_read(&pgio, hdr->inode, true, hdr->completion_ops);
|
||||||
pgio.pg_dreq = dreq;
|
return nfs_pageio_resend(&pgio, hdr);
|
||||||
while (!list_empty(head)) {
|
|
||||||
struct nfs_page *req = nfs_list_entry(head->next);
|
|
||||||
|
|
||||||
nfs_list_remove_request(req);
|
|
||||||
if (!nfs_pageio_add_request(&pgio, req))
|
|
||||||
nfs_list_add_request(req, &failed);
|
|
||||||
}
|
|
||||||
nfs_pageio_complete(&pgio);
|
|
||||||
|
|
||||||
if (!list_empty(&failed)) {
|
|
||||||
list_move(&failed, head);
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(pnfs_read_done_resend_to_mds);
|
EXPORT_SYMBOL_GPL(pnfs_read_done_resend_to_mds);
|
||||||
|
|
||||||
|
@ -1648,10 +1606,7 @@ static void pnfs_ld_handle_read_error(struct nfs_pgio_header *hdr)
|
||||||
pnfs_return_layout(hdr->inode);
|
pnfs_return_layout(hdr->inode);
|
||||||
}
|
}
|
||||||
if (!test_and_set_bit(NFS_IOHDR_REDO, &hdr->flags))
|
if (!test_and_set_bit(NFS_IOHDR_REDO, &hdr->flags))
|
||||||
hdr->task.tk_status = pnfs_read_done_resend_to_mds(hdr->inode,
|
hdr->task.tk_status = pnfs_read_done_resend_to_mds(hdr);
|
||||||
&hdr->pages,
|
|
||||||
hdr->completion_ops,
|
|
||||||
hdr->dreq);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -228,12 +228,8 @@ struct pnfs_layout_segment *pnfs_update_layout(struct inode *ino,
|
||||||
gfp_t gfp_flags);
|
gfp_t gfp_flags);
|
||||||
|
|
||||||
void nfs4_deviceid_mark_client_invalid(struct nfs_client *clp);
|
void nfs4_deviceid_mark_client_invalid(struct nfs_client *clp);
|
||||||
int pnfs_read_done_resend_to_mds(struct inode *inode, struct list_head *head,
|
int pnfs_read_done_resend_to_mds(struct nfs_pgio_header *);
|
||||||
const struct nfs_pgio_completion_ops *compl_ops,
|
int pnfs_write_done_resend_to_mds(struct nfs_pgio_header *);
|
||||||
struct nfs_direct_req *dreq);
|
|
||||||
int pnfs_write_done_resend_to_mds(struct inode *inode, struct list_head *head,
|
|
||||||
const struct nfs_pgio_completion_ops *compl_ops,
|
|
||||||
struct nfs_direct_req *dreq);
|
|
||||||
struct nfs4_threshold *pnfs_mdsthreshold_alloc(void);
|
struct nfs4_threshold *pnfs_mdsthreshold_alloc(void);
|
||||||
|
|
||||||
/* nfs4_deviceid_flags */
|
/* nfs4_deviceid_flags */
|
||||||
|
|
|
@ -112,6 +112,8 @@ extern void nfs_pageio_init(struct nfs_pageio_descriptor *desc,
|
||||||
int how);
|
int how);
|
||||||
extern int nfs_pageio_add_request(struct nfs_pageio_descriptor *,
|
extern int nfs_pageio_add_request(struct nfs_pageio_descriptor *,
|
||||||
struct nfs_page *);
|
struct nfs_page *);
|
||||||
|
extern int nfs_pageio_resend(struct nfs_pageio_descriptor *,
|
||||||
|
struct nfs_pgio_header *);
|
||||||
extern void nfs_pageio_complete(struct nfs_pageio_descriptor *desc);
|
extern void nfs_pageio_complete(struct nfs_pageio_descriptor *desc);
|
||||||
extern void nfs_pageio_cond_complete(struct nfs_pageio_descriptor *, pgoff_t);
|
extern void nfs_pageio_cond_complete(struct nfs_pageio_descriptor *, pgoff_t);
|
||||||
extern size_t nfs_generic_pg_test(struct nfs_pageio_descriptor *desc,
|
extern size_t nfs_generic_pg_test(struct nfs_pageio_descriptor *desc,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче