mirror of
https://github.com/torvalds/linux
synced 2024-10-15 07:47:34 +00:00
NFS: More fixes for nfs_direct_write_reschedule_io()
Ensure that all requests are put back onto the commit list so that they
can be rescheduled.
Fixes: 4daaeba938
("NFS: Fix nfs_direct_write_reschedule_io()")
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
b193a78ddb
commit
b11243f720
|
@ -780,18 +780,23 @@ static void nfs_write_sync_pgio_error(struct list_head *head, int error)
|
|||
static void nfs_direct_write_reschedule_io(struct nfs_pgio_header *hdr)
|
||||
{
|
||||
struct nfs_direct_req *dreq = hdr->dreq;
|
||||
struct nfs_page *req;
|
||||
struct nfs_commit_info cinfo;
|
||||
|
||||
trace_nfs_direct_write_reschedule_io(dreq);
|
||||
|
||||
nfs_init_cinfo_from_dreq(&cinfo, dreq);
|
||||
spin_lock(&dreq->lock);
|
||||
if (dreq->error == 0) {
|
||||
if (dreq->error == 0)
|
||||
dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
|
||||
/* fake unstable write to let common nfs resend pages */
|
||||
hdr->verf.committed = NFS_UNSTABLE;
|
||||
hdr->good_bytes = hdr->args.offset + hdr->args.count -
|
||||
hdr->io_start;
|
||||
}
|
||||
set_bit(NFS_IOHDR_REDO, &hdr->flags);
|
||||
spin_unlock(&dreq->lock);
|
||||
while (!list_empty(&hdr->pages)) {
|
||||
req = nfs_list_entry(hdr->pages.next);
|
||||
nfs_list_remove_request(req);
|
||||
nfs_unlock_request(req);
|
||||
nfs_mark_request_commit(req, NULL, &cinfo, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static const struct nfs_pgio_completion_ops nfs_direct_write_completion_ops = {
|
||||
|
|
Loading…
Reference in a new issue