NFS: merge _full and _partial read rpc_ops
Decouple nfs_pgio_header and nfs_read_data, and have (possibly multiple) nfs_read_datas each take a refcount on nfs_pgio_header. For the moment keeps nfs_read_header as a way to preallocate a single nfs_read_data with the nfs_pgio_header. The code doesn't need this, and would be prettier without, but given the amount of churn I am already introducing I didn't want to play with tuning new mempools. This also fixes bug in pnfs_ld_handle_read_error. In the case of desc->pg_bsize < PAGE_CACHE_SIZE, the pages list was empty, causing replay attempt to do nothing. Signed-off-by: Fred Isaman <iisaman@netapp.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Esse commit está contido em:
@@ -319,10 +319,16 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_direct_req *dreq,
|
||||
bytes = min(rsize,count);
|
||||
|
||||
result = -ENOMEM;
|
||||
rhdr = nfs_readhdr_alloc(nfs_page_array_len(pgbase, bytes));
|
||||
rhdr = nfs_readhdr_alloc();
|
||||
if (unlikely(!rhdr))
|
||||
break;
|
||||
data = &rhdr->rpc_data;
|
||||
data = nfs_readdata_alloc(&rhdr->header, nfs_page_array_len(pgbase, bytes));
|
||||
if (!data) {
|
||||
nfs_readhdr_free(&rhdr->header);
|
||||
break;
|
||||
}
|
||||
data->header = &rhdr->header;
|
||||
atomic_inc(&data->header->refcnt);
|
||||
pages = &data->pages;
|
||||
|
||||
down_read(¤t->mm->mmap_sem);
|
||||
|
Referência em uma nova issue
Block a user