NFS: Add basic functionality for tracking folios in struct nfs_page
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
Родитель
785207aa3d
Коммит
35c5db0ec4
|
@ -500,9 +500,10 @@ nfs_create_subreq(struct nfs_page *req,
|
|||
{
|
||||
struct nfs_page *last;
|
||||
struct nfs_page *ret;
|
||||
struct page *page = nfs_page_to_page(req, pgbase);
|
||||
|
||||
ret = __nfs_create_request(req->wb_lock_context, req->wb_page,
|
||||
pgbase, offset, count);
|
||||
ret = __nfs_create_request(req->wb_lock_context, page, pgbase, offset,
|
||||
count);
|
||||
if (!IS_ERR(ret)) {
|
||||
/* find the last request */
|
||||
for (last = req->wb_head;
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
enum {
|
||||
PG_BUSY = 0, /* nfs_{un}lock_request */
|
||||
PG_MAPPED, /* page private set for buffered io */
|
||||
PG_FOLIO, /* Tracking a folio (unset for O_DIRECT) */
|
||||
PG_CLEAN, /* write succeeded */
|
||||
PG_COMMIT_TO_DS, /* used by pnfs layouts */
|
||||
PG_INODE_REF, /* extra ref held by inode when in writeback */
|
||||
|
@ -41,7 +42,10 @@ enum {
|
|||
struct nfs_inode;
|
||||
struct nfs_page {
|
||||
struct list_head wb_list; /* Defines state of page: */
|
||||
struct page *wb_page; /* page to read in/write out */
|
||||
union {
|
||||
struct page *wb_page; /* page to read in/write out */
|
||||
struct folio *wb_folio;
|
||||
};
|
||||
struct nfs_lock_context *wb_lock_context; /* lock context info */
|
||||
pgoff_t wb_index; /* Offset >> PAGE_SHIFT */
|
||||
unsigned int wb_offset, /* Offset & ~PAGE_MASK */
|
||||
|
@ -153,6 +157,38 @@ extern int nfs_page_set_headlock(struct nfs_page *req);
|
|||
extern void nfs_page_clear_headlock(struct nfs_page *req);
|
||||
extern bool nfs_async_iocounter_wait(struct rpc_task *, struct nfs_lock_context *);
|
||||
|
||||
/**
|
||||
* nfs_page_to_folio - Retrieve a struct folio for the request
|
||||
* @req: pointer to a struct nfs_page
|
||||
*
|
||||
* If a folio was assigned to @req, then return it, otherwise return NULL.
|
||||
*/
|
||||
static inline struct folio *nfs_page_to_folio(const struct nfs_page *req)
|
||||
{
|
||||
if (test_bit(PG_FOLIO, &req->wb_flags))
|
||||
return req->wb_folio;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* nfs_page_to_page - Retrieve a struct page for the request
|
||||
* @req: pointer to a struct nfs_page
|
||||
* @pgbase: folio byte offset
|
||||
*
|
||||
* Return the page containing the byte that is at offset @pgbase relative
|
||||
* to the start of the folio.
|
||||
* Note: The request starts at offset @req->wb_pgbase.
|
||||
*/
|
||||
static inline struct page *nfs_page_to_page(const struct nfs_page *req,
|
||||
size_t pgbase)
|
||||
{
|
||||
struct folio *folio = nfs_page_to_folio(req);
|
||||
|
||||
if (folio == NULL)
|
||||
return req->wb_page;
|
||||
return folio_page(folio, pgbase >> PAGE_SHIFT);
|
||||
}
|
||||
|
||||
/*
|
||||
* Lock the page of an asynchronous request
|
||||
*/
|
||||
|
|
Загрузка…
Ссылка в новой задаче