/** * nfs_pageio_do_add_request - Attempt to coalesce a request into a page list. * @desc: destination io descriptor * @req: request * * Returns true if the request 'req' was successfully coalesced into the * existing list of pages 'desc'. */ static int nfs_pageio_do_add_request(struct nfs_pageio_descriptor *desc, struct nfs_page *req) { size_t newlen = req->wb_bytes; if (desc->pg_count != 0) { struct nfs_page *prev; /* * FIXME: ideally we should be able to coalesce all requests * that are not block boundary aligned, but currently this * is problematic for the case of bsize < PAGE_CACHE_SIZE, * since nfs_flush_multi and nfs_pagein_multi assume you * can have only one struct nfs_page. */ if (desc->pg_bsize < PAGE_SIZE) return 0; newlen += desc->pg_count; if (newlen > desc->pg_bsize) return 0; prev = nfs_list_entry(desc->pg_list.prev); if (!nfs_can_coalesce_requests(prev, req)) return 0; } else desc->pg_base = req->wb_pgbase; nfs_list_remove_request(req); nfs_list_add_request(req, &desc->pg_list); desc->pg_count = newlen; return 1; }
/** * nfs_pageio_do_add_request - Attempt to coalesce a request into a page list. * @desc: destination io descriptor * @req: request * * Returns true if the request 'req' was successfully coalesced into the * existing list of pages 'desc'. */ static int nfs_pageio_do_add_request(struct nfs_pageio_descriptor *desc, struct nfs_page *req) { if (desc->pg_count != 0) { struct nfs_page *prev; prev = nfs_list_entry(desc->pg_list.prev); if (!nfs_can_coalesce_requests(prev, req, desc)) return 0; } else { desc->pg_base = req->wb_pgbase; } nfs_list_remove_request(req); nfs_list_add_request(req, &desc->pg_list); desc->pg_count += req->wb_bytes; return 1; }