NFS: Don't fail an O_DIRECT read/write if get_user_pages() returns pages
There is no need to fail the entire O_DIRECT read/write just because get_user_pages() returned fewer pages than we requested. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
Родитель
070ea60214
Коммит
d9df8d6b38
|
@ -295,9 +295,14 @@ static ssize_t nfs_direct_read_schedule(struct nfs_direct_req *dreq, unsigned lo
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ((unsigned)result < data->npages) {
|
if ((unsigned)result < data->npages) {
|
||||||
nfs_direct_release_pages(data->pagevec, result);
|
bytes = result * PAGE_SIZE;
|
||||||
nfs_readdata_release(data);
|
if (bytes <= pgbase) {
|
||||||
break;
|
nfs_direct_release_pages(data->pagevec, result);
|
||||||
|
nfs_readdata_release(data);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
bytes -= pgbase;
|
||||||
|
data->npages = result;
|
||||||
}
|
}
|
||||||
|
|
||||||
get_dreq(dreq);
|
get_dreq(dreq);
|
||||||
|
@ -630,9 +635,14 @@ static ssize_t nfs_direct_write_schedule(struct nfs_direct_req *dreq, unsigned l
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ((unsigned)result < data->npages) {
|
if ((unsigned)result < data->npages) {
|
||||||
nfs_direct_release_pages(data->pagevec, result);
|
bytes = result * PAGE_SIZE;
|
||||||
nfs_writedata_release(data);
|
if (bytes <= pgbase) {
|
||||||
break;
|
nfs_direct_release_pages(data->pagevec, result);
|
||||||
|
nfs_writedata_release(data);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
bytes -= pgbase;
|
||||||
|
data->npages = result;
|
||||||
}
|
}
|
||||||
|
|
||||||
get_dreq(dreq);
|
get_dreq(dreq);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче