linux/include/linux/nfs_page.h

/* SPDX-License-Identifier: GPL-2.0 */
/*
 * linux/include/linux/nfs_page.h
 *
 * Copyright (C) 2000 Trond Myklebust
 *
 * NFS page cache wrapper.
 */

#ifndef _LINUX_NFS_PAGE_H
#define _LINUX_NFS_PAGE_H


#include <linux/list.h>
#include <linux/pagemap.h>
#include <linux/wait.h>
#include <linux/sunrpc/auth.h>
#include <linux/nfs_xdr.h>

#include <linux/kref.h>

/*
 * Valid flags for a dirty buffer
 */
enum {};

struct nfs_inode;
struct nfs_page {};

struct nfs_pgio_mirror;
struct nfs_pageio_descriptor;
struct nfs_pageio_ops {};

struct nfs_rw_ops {};

struct nfs_pgio_mirror {};

struct nfs_pageio_descriptor {};

/* arbitrarily selected limit to number of mirrors */
#define NFS_PAGEIO_DESCRIPTOR_MIRROR_MAX

#define NFS_WBACK_BUSY(req)

extern struct nfs_page *nfs_page_create_from_page(struct nfs_open_context *ctx,
						  struct page *page,
						  unsigned int pgbase,
						  loff_t offset,
						  unsigned int count);
extern struct nfs_page *nfs_page_create_from_folio(struct nfs_open_context *ctx,
						   struct folio *folio,
						   unsigned int offset,
						   unsigned int count);
extern	void nfs_release_request(struct nfs_page *);


extern	void nfs_pageio_init(struct nfs_pageio_descriptor *desc,
			     struct inode *inode,
			     const struct nfs_pageio_ops *pg_ops,
			     const struct nfs_pgio_completion_ops *compl_ops,
			     const struct nfs_rw_ops *rw_ops,
			     size_t bsize,
			     int how);
extern	int nfs_pageio_add_request(struct nfs_pageio_descriptor *,
				   struct nfs_page *);
extern  int nfs_pageio_resend(struct nfs_pageio_descriptor *,
			      struct nfs_pgio_header *);
extern	void nfs_pageio_complete(struct nfs_pageio_descriptor *desc);
extern	void nfs_pageio_cond_complete(struct nfs_pageio_descriptor *, pgoff_t);
extern size_t nfs_generic_pg_test(struct nfs_pageio_descriptor *desc,
				struct nfs_page *prev,
				struct nfs_page *req);
extern	void nfs_unlock_request(struct nfs_page *req);
extern	void nfs_unlock_and_release_request(struct nfs_page *);
extern void nfs_join_page_group(struct nfs_page *head,
				struct nfs_commit_info *cinfo,
				struct inode *inode);
extern int nfs_page_group_lock(struct nfs_page *);
extern void nfs_page_group_unlock(struct nfs_page *);
extern bool nfs_page_group_sync_on_bit(struct nfs_page *, unsigned int);
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)
{}

/**
 * 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)
{}

/**
 * nfs_page_to_inode - Retrieve an inode for the request
 * @req: pointer to a struct nfs_page
 */
static inline struct inode *nfs_page_to_inode(const struct nfs_page *req)
{}

/**
 * nfs_page_max_length - Retrieve the maximum possible length for a request
 * @req: pointer to a struct nfs_page
 *
 * Returns the maximum possible length of a request
 */
static inline size_t nfs_page_max_length(const struct nfs_page *req)
{}

/*
 * Lock the page of an asynchronous request
 */
static inline int
nfs_lock_request(struct nfs_page *req)
{}

/**
 * nfs_list_add_request - Insert a request into a list
 * @req: request
 * @head: head of list into which to insert the request.
 */
static inline void
nfs_list_add_request(struct nfs_page *req, struct list_head *head)
{}

/**
 * nfs_list_move_request - Move a request to a new list
 * @req: request
 * @head: head of list into which to insert the request.
 */
static inline void
nfs_list_move_request(struct nfs_page *req, struct list_head *head)
{}

/**
 * nfs_list_remove_request - Remove a request from its wb_list
 * @req: request
 */
static inline void
nfs_list_remove_request(struct nfs_page *req)
{}

static inline struct nfs_page *
nfs_list_entry(struct list_head *head)
{}

static inline loff_t req_offset(const struct nfs_page *req)
{}

static inline struct nfs_open_context *
nfs_req_openctx(struct nfs_page *req)
{}

#endif /* _LINUX_NFS_PAGE_H */