Loading fs/nfs/pagelist.c +3 −2 Original line number Diff line number Diff line Loading @@ -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; Loading include/linux/nfs_page.h +37 −1 Original line number Diff line number Diff line Loading @@ -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 */ Loading @@ -41,7 +42,10 @@ enum { struct nfs_inode; struct nfs_page { struct list_head wb_list; /* Defines state of page: */ 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 */ Loading Loading @@ -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 */ Loading Loading
fs/nfs/pagelist.c +3 −2 Original line number Diff line number Diff line Loading @@ -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; Loading
include/linux/nfs_page.h +37 −1 Original line number Diff line number Diff line Loading @@ -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 */ Loading @@ -41,7 +42,10 @@ enum { struct nfs_inode; struct nfs_page { struct list_head wb_list; /* Defines state of page: */ 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 */ Loading Loading @@ -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 */ Loading