162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * pNFS client data structures. 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (c) 2002 562306a36Sopenharmony_ci * The Regents of the University of Michigan 662306a36Sopenharmony_ci * All Rights Reserved 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Dean Hildebrand <dhildebz@umich.edu> 962306a36Sopenharmony_ci * 1062306a36Sopenharmony_ci * Permission is granted to use, copy, create derivative works, and 1162306a36Sopenharmony_ci * redistribute this software and such derivative works for any purpose, 1262306a36Sopenharmony_ci * so long as the name of the University of Michigan is not used in 1362306a36Sopenharmony_ci * any advertising or publicity pertaining to the use or distribution 1462306a36Sopenharmony_ci * of this software without specific, written prior authorization. If 1562306a36Sopenharmony_ci * the above copyright notice or any other identification of the 1662306a36Sopenharmony_ci * University of Michigan is included in any copy of any portion of 1762306a36Sopenharmony_ci * this software, then the disclaimer below must also be included. 1862306a36Sopenharmony_ci * 1962306a36Sopenharmony_ci * This software is provided as is, without representation or warranty 2062306a36Sopenharmony_ci * of any kind either express or implied, including without limitation 2162306a36Sopenharmony_ci * the implied warranties of merchantability, fitness for a particular 2262306a36Sopenharmony_ci * purpose, or noninfringement. The Regents of the University of 2362306a36Sopenharmony_ci * Michigan shall not be liable for any damages, including special, 2462306a36Sopenharmony_ci * indirect, incidental, or consequential damages, with respect to any 2562306a36Sopenharmony_ci * claim arising out of or in connection with the use of the software, 2662306a36Sopenharmony_ci * even if it has been or is hereafter advised of the possibility of 2762306a36Sopenharmony_ci * such damages. 2862306a36Sopenharmony_ci */ 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#ifndef FS_NFS_PNFS_H 3162306a36Sopenharmony_ci#define FS_NFS_PNFS_H 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#include <linux/refcount.h> 3462306a36Sopenharmony_ci#include <linux/nfs_fs.h> 3562306a36Sopenharmony_ci#include <linux/nfs_page.h> 3662306a36Sopenharmony_ci#include <linux/workqueue.h> 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistruct nfs4_opendata; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cienum { 4162306a36Sopenharmony_ci NFS_LSEG_VALID = 0, /* cleared when lseg is recalled/returned */ 4262306a36Sopenharmony_ci NFS_LSEG_ROC, /* roc bit received from server */ 4362306a36Sopenharmony_ci NFS_LSEG_LAYOUTCOMMIT, /* layoutcommit bit set for layoutcommit */ 4462306a36Sopenharmony_ci NFS_LSEG_LAYOUTRETURN, /* layoutreturn bit set for layoutreturn */ 4562306a36Sopenharmony_ci NFS_LSEG_UNAVAILABLE, /* unavailable bit set for temporary problem */ 4662306a36Sopenharmony_ci}; 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci/* Individual ip address */ 4962306a36Sopenharmony_cistruct nfs4_pnfs_ds_addr { 5062306a36Sopenharmony_ci struct sockaddr_storage da_addr; 5162306a36Sopenharmony_ci size_t da_addrlen; 5262306a36Sopenharmony_ci struct list_head da_node; /* nfs4_pnfs_dev_hlist dev_dslist */ 5362306a36Sopenharmony_ci char *da_remotestr; /* human readable addr+port */ 5462306a36Sopenharmony_ci const char *da_netid; 5562306a36Sopenharmony_ci int da_transport; 5662306a36Sopenharmony_ci}; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistruct nfs4_pnfs_ds { 5962306a36Sopenharmony_ci struct list_head ds_node; /* nfs4_pnfs_dev_hlist dev_dslist */ 6062306a36Sopenharmony_ci char *ds_remotestr; /* comma sep list of addrs */ 6162306a36Sopenharmony_ci struct list_head ds_addrs; 6262306a36Sopenharmony_ci struct nfs_client *ds_clp; 6362306a36Sopenharmony_ci refcount_t ds_count; 6462306a36Sopenharmony_ci unsigned long ds_state; 6562306a36Sopenharmony_ci#define NFS4DS_CONNECTING 0 /* ds is establishing connection */ 6662306a36Sopenharmony_ci}; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_cistruct pnfs_layout_segment { 6962306a36Sopenharmony_ci struct list_head pls_list; 7062306a36Sopenharmony_ci struct list_head pls_lc_list; 7162306a36Sopenharmony_ci struct list_head pls_commits; 7262306a36Sopenharmony_ci struct pnfs_layout_range pls_range; 7362306a36Sopenharmony_ci refcount_t pls_refcount; 7462306a36Sopenharmony_ci u32 pls_seq; 7562306a36Sopenharmony_ci unsigned long pls_flags; 7662306a36Sopenharmony_ci struct pnfs_layout_hdr *pls_layout; 7762306a36Sopenharmony_ci}; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_cienum pnfs_try_status { 8062306a36Sopenharmony_ci PNFS_ATTEMPTED = 0, 8162306a36Sopenharmony_ci PNFS_NOT_ATTEMPTED = 1, 8262306a36Sopenharmony_ci PNFS_TRY_AGAIN = 2, 8362306a36Sopenharmony_ci}; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci#ifdef CONFIG_NFS_V4_1 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci#define LAYOUT_NFSV4_1_MODULE_PREFIX "nfs-layouttype4" 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci/* 9062306a36Sopenharmony_ci * Default data server connection timeout and retrans vaules. 9162306a36Sopenharmony_ci * Set by module parameters dataserver_timeo and dataserver_retrans. 9262306a36Sopenharmony_ci */ 9362306a36Sopenharmony_ci#define NFS4_DEF_DS_TIMEO 600 /* in tenths of a second */ 9462306a36Sopenharmony_ci#define NFS4_DEF_DS_RETRANS 5 9562306a36Sopenharmony_ci#define PNFS_DEVICE_RETRY_TIMEOUT (120*HZ) 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_cienum { 9862306a36Sopenharmony_ci NFS_LAYOUT_RO_FAILED = 0, /* get ro layout failed stop trying */ 9962306a36Sopenharmony_ci NFS_LAYOUT_RW_FAILED, /* get rw layout failed stop trying */ 10062306a36Sopenharmony_ci NFS_LAYOUT_BULK_RECALL, /* bulk recall affecting layout */ 10162306a36Sopenharmony_ci NFS_LAYOUT_RETURN, /* layoutreturn in progress */ 10262306a36Sopenharmony_ci NFS_LAYOUT_RETURN_LOCK, /* Serialise layoutreturn */ 10362306a36Sopenharmony_ci NFS_LAYOUT_RETURN_REQUESTED, /* Return this layout ASAP */ 10462306a36Sopenharmony_ci NFS_LAYOUT_INVALID_STID, /* layout stateid id is invalid */ 10562306a36Sopenharmony_ci NFS_LAYOUT_FIRST_LAYOUTGET, /* Serialize first layoutget */ 10662306a36Sopenharmony_ci NFS_LAYOUT_INODE_FREEING, /* The inode is being freed */ 10762306a36Sopenharmony_ci NFS_LAYOUT_HASHED, /* The layout visible */ 10862306a36Sopenharmony_ci NFS_LAYOUT_DRAIN, 10962306a36Sopenharmony_ci}; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_cienum layoutdriver_policy_flags { 11262306a36Sopenharmony_ci /* Should the pNFS client commit and return the layout upon truncate to 11362306a36Sopenharmony_ci * a smaller size */ 11462306a36Sopenharmony_ci PNFS_LAYOUTRET_ON_SETATTR = 1 << 0, 11562306a36Sopenharmony_ci PNFS_LAYOUTRET_ON_ERROR = 1 << 1, 11662306a36Sopenharmony_ci PNFS_READ_WHOLE_PAGE = 1 << 2, 11762306a36Sopenharmony_ci PNFS_LAYOUTGET_ON_OPEN = 1 << 3, 11862306a36Sopenharmony_ci}; 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_cistruct nfs4_deviceid_node; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci/* Per-layout driver specific registration structure */ 12362306a36Sopenharmony_cistruct pnfs_layoutdriver_type { 12462306a36Sopenharmony_ci struct list_head pnfs_tblid; 12562306a36Sopenharmony_ci const u32 id; 12662306a36Sopenharmony_ci const char *name; 12762306a36Sopenharmony_ci struct module *owner; 12862306a36Sopenharmony_ci unsigned flags; 12962306a36Sopenharmony_ci unsigned max_deviceinfo_size; 13062306a36Sopenharmony_ci unsigned max_layoutget_response; 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci int (*set_layoutdriver) (struct nfs_server *, const struct nfs_fh *); 13362306a36Sopenharmony_ci int (*clear_layoutdriver) (struct nfs_server *); 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci struct pnfs_layout_hdr * (*alloc_layout_hdr) (struct inode *inode, gfp_t gfp_flags); 13662306a36Sopenharmony_ci void (*free_layout_hdr) (struct pnfs_layout_hdr *); 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci struct pnfs_layout_segment * (*alloc_lseg) (struct pnfs_layout_hdr *layoutid, struct nfs4_layoutget_res *lgr, gfp_t gfp_flags); 13962306a36Sopenharmony_ci void (*free_lseg) (struct pnfs_layout_segment *lseg); 14062306a36Sopenharmony_ci void (*add_lseg) (struct pnfs_layout_hdr *layoutid, 14162306a36Sopenharmony_ci struct pnfs_layout_segment *lseg, 14262306a36Sopenharmony_ci struct list_head *free_me); 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci void (*return_range) (struct pnfs_layout_hdr *lo, 14562306a36Sopenharmony_ci struct pnfs_layout_range *range); 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci /* test for nfs page cache coalescing */ 14862306a36Sopenharmony_ci const struct nfs_pageio_ops *pg_read_ops; 14962306a36Sopenharmony_ci const struct nfs_pageio_ops *pg_write_ops; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci struct pnfs_ds_commit_info *(*get_ds_info) (struct inode *inode); 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci int (*sync)(struct inode *inode, bool datasync); 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci /* 15662306a36Sopenharmony_ci * Return PNFS_ATTEMPTED to indicate the layout code has attempted 15762306a36Sopenharmony_ci * I/O, else return PNFS_NOT_ATTEMPTED to fall back to normal NFS 15862306a36Sopenharmony_ci */ 15962306a36Sopenharmony_ci enum pnfs_try_status (*read_pagelist)(struct nfs_pgio_header *); 16062306a36Sopenharmony_ci enum pnfs_try_status (*write_pagelist)(struct nfs_pgio_header *, int); 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci void (*free_deviceid_node) (struct nfs4_deviceid_node *); 16362306a36Sopenharmony_ci struct nfs4_deviceid_node * (*alloc_deviceid_node) 16462306a36Sopenharmony_ci (struct nfs_server *server, struct pnfs_device *pdev, 16562306a36Sopenharmony_ci gfp_t gfp_flags); 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci int (*prepare_layoutreturn) (struct nfs4_layoutreturn_args *); 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci void (*cleanup_layoutcommit) (struct nfs4_layoutcommit_data *data); 17062306a36Sopenharmony_ci int (*prepare_layoutcommit) (struct nfs4_layoutcommit_args *args); 17162306a36Sopenharmony_ci int (*prepare_layoutstats) (struct nfs42_layoutstat_args *args); 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci void (*cancel_io)(struct pnfs_layout_segment *lseg); 17462306a36Sopenharmony_ci}; 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_cistruct pnfs_commit_ops { 17762306a36Sopenharmony_ci void (*setup_ds_info)(struct pnfs_ds_commit_info *, 17862306a36Sopenharmony_ci struct pnfs_layout_segment *); 17962306a36Sopenharmony_ci void (*release_ds_info)(struct pnfs_ds_commit_info *, 18062306a36Sopenharmony_ci struct inode *inode); 18162306a36Sopenharmony_ci int (*commit_pagelist)(struct inode *inode, 18262306a36Sopenharmony_ci struct list_head *mds_pages, 18362306a36Sopenharmony_ci int how, 18462306a36Sopenharmony_ci struct nfs_commit_info *cinfo); 18562306a36Sopenharmony_ci void (*mark_request_commit) (struct nfs_page *req, 18662306a36Sopenharmony_ci struct pnfs_layout_segment *lseg, 18762306a36Sopenharmony_ci struct nfs_commit_info *cinfo, 18862306a36Sopenharmony_ci u32 ds_commit_idx); 18962306a36Sopenharmony_ci void (*clear_request_commit) (struct nfs_page *req, 19062306a36Sopenharmony_ci struct nfs_commit_info *cinfo); 19162306a36Sopenharmony_ci int (*scan_commit_lists) (struct nfs_commit_info *cinfo, 19262306a36Sopenharmony_ci int max); 19362306a36Sopenharmony_ci void (*recover_commit_reqs) (struct list_head *list, 19462306a36Sopenharmony_ci struct nfs_commit_info *cinfo); 19562306a36Sopenharmony_ci struct nfs_page * (*search_commit_reqs)(struct nfs_commit_info *cinfo, 19662306a36Sopenharmony_ci struct folio *folio); 19762306a36Sopenharmony_ci}; 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_cistruct pnfs_layout_hdr { 20062306a36Sopenharmony_ci refcount_t plh_refcount; 20162306a36Sopenharmony_ci atomic_t plh_outstanding; /* number of RPCs out */ 20262306a36Sopenharmony_ci struct list_head plh_layouts; /* other client layouts */ 20362306a36Sopenharmony_ci struct list_head plh_bulk_destroy; 20462306a36Sopenharmony_ci struct list_head plh_segs; /* layout segments list */ 20562306a36Sopenharmony_ci struct list_head plh_return_segs; /* invalid layout segments */ 20662306a36Sopenharmony_ci unsigned long plh_block_lgets; /* block LAYOUTGET if >0 */ 20762306a36Sopenharmony_ci unsigned long plh_retry_timestamp; 20862306a36Sopenharmony_ci unsigned long plh_flags; 20962306a36Sopenharmony_ci nfs4_stateid plh_stateid; 21062306a36Sopenharmony_ci u32 plh_barrier; /* ignore lower seqids */ 21162306a36Sopenharmony_ci u32 plh_return_seq; 21262306a36Sopenharmony_ci enum pnfs_iomode plh_return_iomode; 21362306a36Sopenharmony_ci loff_t plh_lwb; /* last write byte for layoutcommit */ 21462306a36Sopenharmony_ci const struct cred *plh_lc_cred; /* layoutcommit cred */ 21562306a36Sopenharmony_ci struct inode *plh_inode; 21662306a36Sopenharmony_ci struct rcu_head plh_rcu; 21762306a36Sopenharmony_ci}; 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_cistruct pnfs_device { 22062306a36Sopenharmony_ci struct nfs4_deviceid dev_id; 22162306a36Sopenharmony_ci unsigned int layout_type; 22262306a36Sopenharmony_ci unsigned int mincount; 22362306a36Sopenharmony_ci unsigned int maxcount; /* gdia_maxcount */ 22462306a36Sopenharmony_ci struct page **pages; 22562306a36Sopenharmony_ci unsigned int pgbase; 22662306a36Sopenharmony_ci unsigned int pglen; /* reply buffer length */ 22762306a36Sopenharmony_ci unsigned char nocache : 1;/* May not be cached */ 22862306a36Sopenharmony_ci}; 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci#define NFS4_PNFS_GETDEVLIST_MAXNUM 16 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_cistruct pnfs_devicelist { 23362306a36Sopenharmony_ci unsigned int eof; 23462306a36Sopenharmony_ci unsigned int num_devs; 23562306a36Sopenharmony_ci struct nfs4_deviceid dev_id[NFS4_PNFS_GETDEVLIST_MAXNUM]; 23662306a36Sopenharmony_ci}; 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ciextern int pnfs_register_layoutdriver(struct pnfs_layoutdriver_type *); 23962306a36Sopenharmony_ciextern void pnfs_unregister_layoutdriver(struct pnfs_layoutdriver_type *); 24062306a36Sopenharmony_ciextern const struct pnfs_layoutdriver_type *pnfs_find_layoutdriver(u32 id); 24162306a36Sopenharmony_ciextern void pnfs_put_layoutdriver(const struct pnfs_layoutdriver_type *ld); 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci/* nfs4proc.c */ 24462306a36Sopenharmony_ciextern size_t max_response_pages(struct nfs_server *server); 24562306a36Sopenharmony_ciextern int nfs4_proc_getdeviceinfo(struct nfs_server *server, 24662306a36Sopenharmony_ci struct pnfs_device *dev, 24762306a36Sopenharmony_ci const struct cred *cred); 24862306a36Sopenharmony_ciextern struct pnfs_layout_segment* nfs4_proc_layoutget(struct nfs4_layoutget *lgp, long *timeout); 24962306a36Sopenharmony_ciextern int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync); 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci/* pnfs.c */ 25262306a36Sopenharmony_civoid pnfs_get_layout_hdr(struct pnfs_layout_hdr *lo); 25362306a36Sopenharmony_civoid pnfs_put_lseg(struct pnfs_layout_segment *lseg); 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_civoid set_pnfs_layoutdriver(struct nfs_server *, const struct nfs_fh *, struct nfs_fsinfo *); 25662306a36Sopenharmony_civoid unset_pnfs_layoutdriver(struct nfs_server *); 25762306a36Sopenharmony_civoid pnfs_generic_pg_check_layout(struct nfs_pageio_descriptor *pgio); 25862306a36Sopenharmony_civoid pnfs_generic_pg_check_range(struct nfs_pageio_descriptor *pgio, struct nfs_page *req); 25962306a36Sopenharmony_civoid pnfs_generic_pg_init_read(struct nfs_pageio_descriptor *, struct nfs_page *); 26062306a36Sopenharmony_ciint pnfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc); 26162306a36Sopenharmony_civoid pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *pgio, 26262306a36Sopenharmony_ci struct nfs_page *req, u64 wb_size); 26362306a36Sopenharmony_civoid pnfs_generic_pg_cleanup(struct nfs_pageio_descriptor *); 26462306a36Sopenharmony_ciint pnfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc); 26562306a36Sopenharmony_cisize_t pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, 26662306a36Sopenharmony_ci struct nfs_page *prev, struct nfs_page *req); 26762306a36Sopenharmony_civoid pnfs_set_lo_fail(struct pnfs_layout_segment *lseg); 26862306a36Sopenharmony_cistruct pnfs_layout_segment *pnfs_layout_process(struct nfs4_layoutget *lgp); 26962306a36Sopenharmony_civoid pnfs_layoutget_free(struct nfs4_layoutget *lgp); 27062306a36Sopenharmony_civoid pnfs_free_lseg_list(struct list_head *tmp_list); 27162306a36Sopenharmony_civoid pnfs_destroy_layout(struct nfs_inode *); 27262306a36Sopenharmony_civoid pnfs_destroy_layout_final(struct nfs_inode *); 27362306a36Sopenharmony_civoid pnfs_destroy_all_layouts(struct nfs_client *); 27462306a36Sopenharmony_ciint pnfs_destroy_layouts_byfsid(struct nfs_client *clp, 27562306a36Sopenharmony_ci struct nfs_fsid *fsid, 27662306a36Sopenharmony_ci bool is_recall); 27762306a36Sopenharmony_ciint pnfs_destroy_layouts_byclid(struct nfs_client *clp, 27862306a36Sopenharmony_ci bool is_recall); 27962306a36Sopenharmony_cibool nfs4_layout_refresh_old_stateid(nfs4_stateid *dst, 28062306a36Sopenharmony_ci struct pnfs_layout_range *dst_range, 28162306a36Sopenharmony_ci struct inode *inode); 28262306a36Sopenharmony_civoid pnfs_put_layout_hdr(struct pnfs_layout_hdr *lo); 28362306a36Sopenharmony_civoid pnfs_set_layout_stateid(struct pnfs_layout_hdr *lo, 28462306a36Sopenharmony_ci const nfs4_stateid *new, 28562306a36Sopenharmony_ci const struct cred *cred, 28662306a36Sopenharmony_ci bool update_barrier); 28762306a36Sopenharmony_ciint pnfs_mark_matching_lsegs_invalid(struct pnfs_layout_hdr *lo, 28862306a36Sopenharmony_ci struct list_head *tmp_list, 28962306a36Sopenharmony_ci const struct pnfs_layout_range *recall_range, 29062306a36Sopenharmony_ci u32 seq); 29162306a36Sopenharmony_ciint pnfs_mark_matching_lsegs_return(struct pnfs_layout_hdr *lo, 29262306a36Sopenharmony_ci struct list_head *tmp_list, 29362306a36Sopenharmony_ci const struct pnfs_layout_range *recall_range, 29462306a36Sopenharmony_ci u32 seq); 29562306a36Sopenharmony_ciint pnfs_mark_layout_stateid_invalid(struct pnfs_layout_hdr *lo, 29662306a36Sopenharmony_ci struct list_head *lseg_list); 29762306a36Sopenharmony_cibool pnfs_roc(struct inode *ino, 29862306a36Sopenharmony_ci struct nfs4_layoutreturn_args *args, 29962306a36Sopenharmony_ci struct nfs4_layoutreturn_res *res, 30062306a36Sopenharmony_ci const struct cred *cred); 30162306a36Sopenharmony_ciint pnfs_roc_done(struct rpc_task *task, struct nfs4_layoutreturn_args **argpp, 30262306a36Sopenharmony_ci struct nfs4_layoutreturn_res **respp, int *ret); 30362306a36Sopenharmony_civoid pnfs_roc_release(struct nfs4_layoutreturn_args *args, 30462306a36Sopenharmony_ci struct nfs4_layoutreturn_res *res, 30562306a36Sopenharmony_ci int ret); 30662306a36Sopenharmony_cibool pnfs_wait_on_layoutreturn(struct inode *ino, struct rpc_task *task); 30762306a36Sopenharmony_civoid pnfs_set_layoutcommit(struct inode *, struct pnfs_layout_segment *, loff_t); 30862306a36Sopenharmony_civoid pnfs_cleanup_layoutcommit(struct nfs4_layoutcommit_data *data); 30962306a36Sopenharmony_ciint pnfs_layoutcommit_inode(struct inode *inode, bool sync); 31062306a36Sopenharmony_ciint pnfs_generic_sync(struct inode *inode, bool datasync); 31162306a36Sopenharmony_ciint pnfs_nfs_generic_sync(struct inode *inode, bool datasync); 31262306a36Sopenharmony_ciint _pnfs_return_layout(struct inode *); 31362306a36Sopenharmony_ciint pnfs_commit_and_return_layout(struct inode *); 31462306a36Sopenharmony_civoid pnfs_ld_write_done(struct nfs_pgio_header *); 31562306a36Sopenharmony_civoid pnfs_ld_read_done(struct nfs_pgio_header *); 31662306a36Sopenharmony_civoid pnfs_read_resend_pnfs(struct nfs_pgio_header *, unsigned int mirror_idx); 31762306a36Sopenharmony_cistruct pnfs_layout_segment *pnfs_update_layout(struct inode *ino, 31862306a36Sopenharmony_ci struct nfs_open_context *ctx, 31962306a36Sopenharmony_ci loff_t pos, 32062306a36Sopenharmony_ci u64 count, 32162306a36Sopenharmony_ci enum pnfs_iomode iomode, 32262306a36Sopenharmony_ci bool strict_iomode, 32362306a36Sopenharmony_ci gfp_t gfp_flags); 32462306a36Sopenharmony_civoid pnfs_layoutreturn_free_lsegs(struct pnfs_layout_hdr *lo, 32562306a36Sopenharmony_ci const nfs4_stateid *arg_stateid, 32662306a36Sopenharmony_ci const struct pnfs_layout_range *range, 32762306a36Sopenharmony_ci const nfs4_stateid *stateid); 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_civoid pnfs_generic_layout_insert_lseg(struct pnfs_layout_hdr *lo, 33062306a36Sopenharmony_ci struct pnfs_layout_segment *lseg, 33162306a36Sopenharmony_ci bool (*is_after)(const struct pnfs_layout_range *lseg_range, 33262306a36Sopenharmony_ci const struct pnfs_layout_range *old), 33362306a36Sopenharmony_ci bool (*do_merge)(struct pnfs_layout_segment *lseg, 33462306a36Sopenharmony_ci struct pnfs_layout_segment *old), 33562306a36Sopenharmony_ci struct list_head *free_me); 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_civoid nfs4_deviceid_mark_client_invalid(struct nfs_client *clp); 33862306a36Sopenharmony_ciint pnfs_read_done_resend_to_mds(struct nfs_pgio_header *); 33962306a36Sopenharmony_ciint pnfs_write_done_resend_to_mds(struct nfs_pgio_header *); 34062306a36Sopenharmony_cistruct nfs4_threshold *pnfs_mdsthreshold_alloc(void); 34162306a36Sopenharmony_civoid pnfs_error_mark_layout_for_return(struct inode *inode, 34262306a36Sopenharmony_ci struct pnfs_layout_segment *lseg); 34362306a36Sopenharmony_civoid pnfs_layout_return_unused_byclid(struct nfs_client *clp, 34462306a36Sopenharmony_ci enum pnfs_iomode iomode); 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_ci/* nfs4_deviceid_flags */ 34762306a36Sopenharmony_cienum { 34862306a36Sopenharmony_ci NFS_DEVICEID_INVALID = 0, /* set when MDS clientid recalled */ 34962306a36Sopenharmony_ci NFS_DEVICEID_UNAVAILABLE, /* device temporarily unavailable */ 35062306a36Sopenharmony_ci NFS_DEVICEID_NOCACHE, /* device may not be cached */ 35162306a36Sopenharmony_ci}; 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_ci/* pnfs_dev.c */ 35462306a36Sopenharmony_cistruct nfs4_deviceid_node { 35562306a36Sopenharmony_ci struct hlist_node node; 35662306a36Sopenharmony_ci struct hlist_node tmpnode; 35762306a36Sopenharmony_ci const struct pnfs_layoutdriver_type *ld; 35862306a36Sopenharmony_ci const struct nfs_client *nfs_client; 35962306a36Sopenharmony_ci unsigned long flags; 36062306a36Sopenharmony_ci unsigned long timestamp_unavailable; 36162306a36Sopenharmony_ci struct nfs4_deviceid deviceid; 36262306a36Sopenharmony_ci struct rcu_head rcu; 36362306a36Sopenharmony_ci atomic_t ref; 36462306a36Sopenharmony_ci}; 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_cistruct nfs4_deviceid_node * 36762306a36Sopenharmony_cinfs4_find_get_deviceid(struct nfs_server *server, 36862306a36Sopenharmony_ci const struct nfs4_deviceid *id, const struct cred *cred, 36962306a36Sopenharmony_ci gfp_t gfp_mask); 37062306a36Sopenharmony_civoid nfs4_delete_deviceid(const struct pnfs_layoutdriver_type *, const struct nfs_client *, const struct nfs4_deviceid *); 37162306a36Sopenharmony_civoid nfs4_init_deviceid_node(struct nfs4_deviceid_node *, struct nfs_server *, 37262306a36Sopenharmony_ci const struct nfs4_deviceid *); 37362306a36Sopenharmony_cibool nfs4_put_deviceid_node(struct nfs4_deviceid_node *); 37462306a36Sopenharmony_civoid nfs4_mark_deviceid_available(struct nfs4_deviceid_node *node); 37562306a36Sopenharmony_civoid nfs4_mark_deviceid_unavailable(struct nfs4_deviceid_node *node); 37662306a36Sopenharmony_cibool nfs4_test_deviceid_unavailable(struct nfs4_deviceid_node *node); 37762306a36Sopenharmony_civoid nfs4_deviceid_purge_client(const struct nfs_client *); 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_ci/* pnfs_nfs.c */ 38062306a36Sopenharmony_cistruct pnfs_commit_array *pnfs_alloc_commit_array(size_t n, gfp_t gfp_flags); 38162306a36Sopenharmony_civoid pnfs_free_commit_array(struct pnfs_commit_array *p); 38262306a36Sopenharmony_cistruct pnfs_commit_array *pnfs_add_commit_array(struct pnfs_ds_commit_info *, 38362306a36Sopenharmony_ci struct pnfs_commit_array *, 38462306a36Sopenharmony_ci struct pnfs_layout_segment *); 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_civoid pnfs_generic_ds_cinfo_release_lseg(struct pnfs_ds_commit_info *fl_cinfo, 38762306a36Sopenharmony_ci struct pnfs_layout_segment *lseg); 38862306a36Sopenharmony_civoid pnfs_generic_ds_cinfo_destroy(struct pnfs_ds_commit_info *fl_cinfo); 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_civoid pnfs_generic_clear_request_commit(struct nfs_page *req, 39162306a36Sopenharmony_ci struct nfs_commit_info *cinfo); 39262306a36Sopenharmony_civoid pnfs_generic_commit_release(void *calldata); 39362306a36Sopenharmony_civoid pnfs_generic_prepare_to_resend_writes(struct nfs_commit_data *data); 39462306a36Sopenharmony_civoid pnfs_generic_rw_release(void *data); 39562306a36Sopenharmony_civoid pnfs_generic_recover_commit_reqs(struct list_head *dst, 39662306a36Sopenharmony_ci struct nfs_commit_info *cinfo); 39762306a36Sopenharmony_cistruct nfs_page *pnfs_generic_search_commit_reqs(struct nfs_commit_info *cinfo, 39862306a36Sopenharmony_ci struct folio *folio); 39962306a36Sopenharmony_ciint pnfs_generic_commit_pagelist(struct inode *inode, 40062306a36Sopenharmony_ci struct list_head *mds_pages, 40162306a36Sopenharmony_ci int how, 40262306a36Sopenharmony_ci struct nfs_commit_info *cinfo, 40362306a36Sopenharmony_ci int (*initiate_commit)(struct nfs_commit_data *data, 40462306a36Sopenharmony_ci int how)); 40562306a36Sopenharmony_ciint pnfs_generic_scan_commit_lists(struct nfs_commit_info *cinfo, int max); 40662306a36Sopenharmony_civoid pnfs_generic_write_commit_done(struct rpc_task *task, void *data); 40762306a36Sopenharmony_civoid nfs4_pnfs_ds_put(struct nfs4_pnfs_ds *ds); 40862306a36Sopenharmony_cistruct nfs4_pnfs_ds *nfs4_pnfs_ds_add(struct list_head *dsaddrs, 40962306a36Sopenharmony_ci gfp_t gfp_flags); 41062306a36Sopenharmony_civoid nfs4_pnfs_v3_ds_connect_unload(void); 41162306a36Sopenharmony_ciint nfs4_pnfs_ds_connect(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds, 41262306a36Sopenharmony_ci struct nfs4_deviceid_node *devid, unsigned int timeo, 41362306a36Sopenharmony_ci unsigned int retrans, u32 version, u32 minor_version); 41462306a36Sopenharmony_cistruct nfs4_pnfs_ds_addr *nfs4_decode_mp_ds_addr(struct net *net, 41562306a36Sopenharmony_ci struct xdr_stream *xdr, 41662306a36Sopenharmony_ci gfp_t gfp_flags); 41762306a36Sopenharmony_civoid pnfs_layout_mark_request_commit(struct nfs_page *req, 41862306a36Sopenharmony_ci struct pnfs_layout_segment *lseg, 41962306a36Sopenharmony_ci struct nfs_commit_info *cinfo, 42062306a36Sopenharmony_ci u32 ds_commit_idx); 42162306a36Sopenharmony_civoid pnfs_lgopen_prepare(struct nfs4_opendata *data, 42262306a36Sopenharmony_ci struct nfs_open_context *ctx); 42362306a36Sopenharmony_civoid pnfs_parse_lgopen(struct inode *ino, struct nfs4_layoutget *lgp, 42462306a36Sopenharmony_ci struct nfs_open_context *ctx); 42562306a36Sopenharmony_civoid nfs4_lgopen_release(struct nfs4_layoutget *lgp); 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_cistatic inline bool nfs_have_layout(struct inode *inode) 42862306a36Sopenharmony_ci{ 42962306a36Sopenharmony_ci return NFS_I(inode)->layout != NULL; 43062306a36Sopenharmony_ci} 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_cistatic inline bool pnfs_layout_is_valid(const struct pnfs_layout_hdr *lo) 43362306a36Sopenharmony_ci{ 43462306a36Sopenharmony_ci return test_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags) == 0; 43562306a36Sopenharmony_ci} 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_cistatic inline struct nfs4_deviceid_node * 43862306a36Sopenharmony_cinfs4_get_deviceid(struct nfs4_deviceid_node *d) 43962306a36Sopenharmony_ci{ 44062306a36Sopenharmony_ci atomic_inc(&d->ref); 44162306a36Sopenharmony_ci return d; 44262306a36Sopenharmony_ci} 44362306a36Sopenharmony_ci 44462306a36Sopenharmony_cistatic inline struct pnfs_layout_segment * 44562306a36Sopenharmony_cipnfs_get_lseg(struct pnfs_layout_segment *lseg) 44662306a36Sopenharmony_ci{ 44762306a36Sopenharmony_ci if (lseg) { 44862306a36Sopenharmony_ci refcount_inc(&lseg->pls_refcount); 44962306a36Sopenharmony_ci smp_mb__after_atomic(); 45062306a36Sopenharmony_ci } 45162306a36Sopenharmony_ci return lseg; 45262306a36Sopenharmony_ci} 45362306a36Sopenharmony_ci 45462306a36Sopenharmony_cistatic inline bool 45562306a36Sopenharmony_cipnfs_is_valid_lseg(struct pnfs_layout_segment *lseg) 45662306a36Sopenharmony_ci{ 45762306a36Sopenharmony_ci return test_bit(NFS_LSEG_VALID, &lseg->pls_flags) != 0; 45862306a36Sopenharmony_ci} 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_ci/* Return true if a layout driver is being used for this mountpoint */ 46162306a36Sopenharmony_cistatic inline int pnfs_enabled_sb(struct nfs_server *nfss) 46262306a36Sopenharmony_ci{ 46362306a36Sopenharmony_ci return nfss->pnfs_curr_ld != NULL; 46462306a36Sopenharmony_ci} 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_cistatic inline int 46762306a36Sopenharmony_cipnfs_commit_list(struct inode *inode, struct list_head *mds_pages, int how, 46862306a36Sopenharmony_ci struct nfs_commit_info *cinfo) 46962306a36Sopenharmony_ci{ 47062306a36Sopenharmony_ci struct pnfs_ds_commit_info *fl_cinfo = cinfo->ds; 47162306a36Sopenharmony_ci 47262306a36Sopenharmony_ci if (fl_cinfo == NULL || fl_cinfo->ncommitting == 0) 47362306a36Sopenharmony_ci return PNFS_NOT_ATTEMPTED; 47462306a36Sopenharmony_ci return fl_cinfo->ops->commit_pagelist(inode, mds_pages, how, cinfo); 47562306a36Sopenharmony_ci} 47662306a36Sopenharmony_ci 47762306a36Sopenharmony_cistatic inline struct pnfs_ds_commit_info * 47862306a36Sopenharmony_cipnfs_get_ds_info(struct inode *inode) 47962306a36Sopenharmony_ci{ 48062306a36Sopenharmony_ci struct pnfs_layoutdriver_type *ld = NFS_SERVER(inode)->pnfs_curr_ld; 48162306a36Sopenharmony_ci 48262306a36Sopenharmony_ci if (ld == NULL || ld->get_ds_info == NULL) 48362306a36Sopenharmony_ci return NULL; 48462306a36Sopenharmony_ci return ld->get_ds_info(inode); 48562306a36Sopenharmony_ci} 48662306a36Sopenharmony_ci 48762306a36Sopenharmony_cistatic inline void 48862306a36Sopenharmony_cipnfs_init_ds_commit_info_ops(struct pnfs_ds_commit_info *fl_cinfo, struct inode *inode) 48962306a36Sopenharmony_ci{ 49062306a36Sopenharmony_ci struct pnfs_ds_commit_info *inode_cinfo = pnfs_get_ds_info(inode); 49162306a36Sopenharmony_ci if (inode_cinfo != NULL) 49262306a36Sopenharmony_ci fl_cinfo->ops = inode_cinfo->ops; 49362306a36Sopenharmony_ci} 49462306a36Sopenharmony_ci 49562306a36Sopenharmony_cistatic inline void 49662306a36Sopenharmony_cipnfs_init_ds_commit_info(struct pnfs_ds_commit_info *fl_cinfo) 49762306a36Sopenharmony_ci{ 49862306a36Sopenharmony_ci INIT_LIST_HEAD(&fl_cinfo->commits); 49962306a36Sopenharmony_ci fl_cinfo->ops = NULL; 50062306a36Sopenharmony_ci} 50162306a36Sopenharmony_ci 50262306a36Sopenharmony_cistatic inline void 50362306a36Sopenharmony_cipnfs_release_ds_info(struct pnfs_ds_commit_info *fl_cinfo, struct inode *inode) 50462306a36Sopenharmony_ci{ 50562306a36Sopenharmony_ci if (fl_cinfo->ops != NULL && fl_cinfo->ops->release_ds_info != NULL) 50662306a36Sopenharmony_ci fl_cinfo->ops->release_ds_info(fl_cinfo, inode); 50762306a36Sopenharmony_ci} 50862306a36Sopenharmony_ci 50962306a36Sopenharmony_cistatic inline void 51062306a36Sopenharmony_cipnfs_generic_mark_devid_invalid(struct nfs4_deviceid_node *node) 51162306a36Sopenharmony_ci{ 51262306a36Sopenharmony_ci set_bit(NFS_DEVICEID_INVALID, &node->flags); 51362306a36Sopenharmony_ci} 51462306a36Sopenharmony_ci 51562306a36Sopenharmony_cistatic inline bool 51662306a36Sopenharmony_cipnfs_mark_request_commit(struct nfs_page *req, struct pnfs_layout_segment *lseg, 51762306a36Sopenharmony_ci struct nfs_commit_info *cinfo, u32 ds_commit_idx) 51862306a36Sopenharmony_ci{ 51962306a36Sopenharmony_ci struct pnfs_ds_commit_info *fl_cinfo = cinfo->ds; 52062306a36Sopenharmony_ci 52162306a36Sopenharmony_ci if (!lseg || !fl_cinfo->ops || !fl_cinfo->ops->mark_request_commit) 52262306a36Sopenharmony_ci return false; 52362306a36Sopenharmony_ci fl_cinfo->ops->mark_request_commit(req, lseg, cinfo, ds_commit_idx); 52462306a36Sopenharmony_ci return true; 52562306a36Sopenharmony_ci} 52662306a36Sopenharmony_ci 52762306a36Sopenharmony_cistatic inline bool 52862306a36Sopenharmony_cipnfs_clear_request_commit(struct nfs_page *req, struct nfs_commit_info *cinfo) 52962306a36Sopenharmony_ci{ 53062306a36Sopenharmony_ci struct pnfs_ds_commit_info *fl_cinfo = cinfo->ds; 53162306a36Sopenharmony_ci 53262306a36Sopenharmony_ci if (!fl_cinfo || !fl_cinfo->ops || !fl_cinfo->ops->clear_request_commit) 53362306a36Sopenharmony_ci return false; 53462306a36Sopenharmony_ci fl_cinfo->ops->clear_request_commit(req, cinfo); 53562306a36Sopenharmony_ci return true; 53662306a36Sopenharmony_ci} 53762306a36Sopenharmony_ci 53862306a36Sopenharmony_cistatic inline int 53962306a36Sopenharmony_cipnfs_scan_commit_lists(struct inode *inode, struct nfs_commit_info *cinfo, 54062306a36Sopenharmony_ci int max) 54162306a36Sopenharmony_ci{ 54262306a36Sopenharmony_ci struct pnfs_ds_commit_info *fl_cinfo = cinfo->ds; 54362306a36Sopenharmony_ci 54462306a36Sopenharmony_ci if (!fl_cinfo || fl_cinfo->nwritten == 0) 54562306a36Sopenharmony_ci return 0; 54662306a36Sopenharmony_ci return fl_cinfo->ops->scan_commit_lists(cinfo, max); 54762306a36Sopenharmony_ci} 54862306a36Sopenharmony_ci 54962306a36Sopenharmony_cistatic inline void 55062306a36Sopenharmony_cipnfs_recover_commit_reqs(struct list_head *head, struct nfs_commit_info *cinfo) 55162306a36Sopenharmony_ci{ 55262306a36Sopenharmony_ci struct pnfs_ds_commit_info *fl_cinfo = cinfo->ds; 55362306a36Sopenharmony_ci 55462306a36Sopenharmony_ci if (fl_cinfo && fl_cinfo->nwritten != 0) 55562306a36Sopenharmony_ci fl_cinfo->ops->recover_commit_reqs(head, cinfo); 55662306a36Sopenharmony_ci} 55762306a36Sopenharmony_ci 55862306a36Sopenharmony_cistatic inline struct nfs_page * 55962306a36Sopenharmony_cipnfs_search_commit_reqs(struct inode *inode, struct nfs_commit_info *cinfo, 56062306a36Sopenharmony_ci struct folio *folio) 56162306a36Sopenharmony_ci{ 56262306a36Sopenharmony_ci struct pnfs_ds_commit_info *fl_cinfo = cinfo->ds; 56362306a36Sopenharmony_ci 56462306a36Sopenharmony_ci if (!fl_cinfo->ops || !fl_cinfo->ops->search_commit_reqs) 56562306a36Sopenharmony_ci return NULL; 56662306a36Sopenharmony_ci return fl_cinfo->ops->search_commit_reqs(cinfo, folio); 56762306a36Sopenharmony_ci} 56862306a36Sopenharmony_ci 56962306a36Sopenharmony_ci/* Should the pNFS client commit and return the layout upon a setattr */ 57062306a36Sopenharmony_cistatic inline bool 57162306a36Sopenharmony_cipnfs_ld_layoutret_on_setattr(struct inode *inode) 57262306a36Sopenharmony_ci{ 57362306a36Sopenharmony_ci if (!pnfs_enabled_sb(NFS_SERVER(inode))) 57462306a36Sopenharmony_ci return false; 57562306a36Sopenharmony_ci return NFS_SERVER(inode)->pnfs_curr_ld->flags & 57662306a36Sopenharmony_ci PNFS_LAYOUTRET_ON_SETATTR; 57762306a36Sopenharmony_ci} 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_cistatic inline bool 58062306a36Sopenharmony_cipnfs_ld_read_whole_page(struct inode *inode) 58162306a36Sopenharmony_ci{ 58262306a36Sopenharmony_ci if (!pnfs_enabled_sb(NFS_SERVER(inode))) 58362306a36Sopenharmony_ci return false; 58462306a36Sopenharmony_ci return NFS_SERVER(inode)->pnfs_curr_ld->flags & PNFS_READ_WHOLE_PAGE; 58562306a36Sopenharmony_ci} 58662306a36Sopenharmony_ci 58762306a36Sopenharmony_cistatic inline int 58862306a36Sopenharmony_cipnfs_sync_inode(struct inode *inode, bool datasync) 58962306a36Sopenharmony_ci{ 59062306a36Sopenharmony_ci if (!pnfs_enabled_sb(NFS_SERVER(inode))) 59162306a36Sopenharmony_ci return 0; 59262306a36Sopenharmony_ci return NFS_SERVER(inode)->pnfs_curr_ld->sync(inode, datasync); 59362306a36Sopenharmony_ci} 59462306a36Sopenharmony_ci 59562306a36Sopenharmony_cistatic inline bool 59662306a36Sopenharmony_cipnfs_layoutcommit_outstanding(struct inode *inode) 59762306a36Sopenharmony_ci{ 59862306a36Sopenharmony_ci struct nfs_inode *nfsi = NFS_I(inode); 59962306a36Sopenharmony_ci 60062306a36Sopenharmony_ci return test_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->flags) != 0 || 60162306a36Sopenharmony_ci test_bit(NFS_INO_LAYOUTCOMMITTING, &nfsi->flags) != 0; 60262306a36Sopenharmony_ci} 60362306a36Sopenharmony_ci 60462306a36Sopenharmony_cistatic inline int pnfs_return_layout(struct inode *ino) 60562306a36Sopenharmony_ci{ 60662306a36Sopenharmony_ci struct nfs_inode *nfsi = NFS_I(ino); 60762306a36Sopenharmony_ci struct nfs_server *nfss = NFS_SERVER(ino); 60862306a36Sopenharmony_ci 60962306a36Sopenharmony_ci if (pnfs_enabled_sb(nfss) && nfsi->layout) { 61062306a36Sopenharmony_ci set_bit(NFS_LAYOUT_RETURN_REQUESTED, &nfsi->layout->plh_flags); 61162306a36Sopenharmony_ci return _pnfs_return_layout(ino); 61262306a36Sopenharmony_ci } 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_ci return 0; 61562306a36Sopenharmony_ci} 61662306a36Sopenharmony_ci 61762306a36Sopenharmony_cistatic inline bool 61862306a36Sopenharmony_cipnfs_use_threshold(struct nfs4_threshold **dst, struct nfs4_threshold *src, 61962306a36Sopenharmony_ci struct nfs_server *nfss) 62062306a36Sopenharmony_ci{ 62162306a36Sopenharmony_ci return (dst && src && src->bm != 0 && nfss->pnfs_curr_ld && 62262306a36Sopenharmony_ci nfss->pnfs_curr_ld->id == src->l_type); 62362306a36Sopenharmony_ci} 62462306a36Sopenharmony_ci 62562306a36Sopenharmony_cistatic inline u64 62662306a36Sopenharmony_cipnfs_calc_offset_end(u64 offset, u64 len) 62762306a36Sopenharmony_ci{ 62862306a36Sopenharmony_ci if (len == NFS4_MAX_UINT64 || len >= NFS4_MAX_UINT64 - offset) 62962306a36Sopenharmony_ci return NFS4_MAX_UINT64; 63062306a36Sopenharmony_ci return offset + len - 1; 63162306a36Sopenharmony_ci} 63262306a36Sopenharmony_ci 63362306a36Sopenharmony_cistatic inline u64 63462306a36Sopenharmony_cipnfs_calc_offset_length(u64 offset, u64 end) 63562306a36Sopenharmony_ci{ 63662306a36Sopenharmony_ci if (end == NFS4_MAX_UINT64 || end <= offset) 63762306a36Sopenharmony_ci return NFS4_MAX_UINT64; 63862306a36Sopenharmony_ci return 1 + end - offset; 63962306a36Sopenharmony_ci} 64062306a36Sopenharmony_ci 64162306a36Sopenharmony_cistatic inline void 64262306a36Sopenharmony_cipnfs_copy_range(struct pnfs_layout_range *dst, 64362306a36Sopenharmony_ci const struct pnfs_layout_range *src) 64462306a36Sopenharmony_ci{ 64562306a36Sopenharmony_ci memcpy(dst, src, sizeof(*dst)); 64662306a36Sopenharmony_ci} 64762306a36Sopenharmony_ci 64862306a36Sopenharmony_cistatic inline u64 64962306a36Sopenharmony_cipnfs_end_offset(u64 start, u64 len) 65062306a36Sopenharmony_ci{ 65162306a36Sopenharmony_ci if (NFS4_MAX_UINT64 - start <= len) 65262306a36Sopenharmony_ci return NFS4_MAX_UINT64; 65362306a36Sopenharmony_ci return start + len; 65462306a36Sopenharmony_ci} 65562306a36Sopenharmony_ci 65662306a36Sopenharmony_ci/* 65762306a36Sopenharmony_ci * Are 2 ranges intersecting? 65862306a36Sopenharmony_ci * start1 end1 65962306a36Sopenharmony_ci * [----------------------------------) 66062306a36Sopenharmony_ci * start2 end2 66162306a36Sopenharmony_ci * [----------------) 66262306a36Sopenharmony_ci */ 66362306a36Sopenharmony_cistatic inline bool 66462306a36Sopenharmony_cipnfs_is_range_intersecting(u64 start1, u64 end1, u64 start2, u64 end2) 66562306a36Sopenharmony_ci{ 66662306a36Sopenharmony_ci return (end1 == NFS4_MAX_UINT64 || start2 < end1) && 66762306a36Sopenharmony_ci (end2 == NFS4_MAX_UINT64 || start1 < end2); 66862306a36Sopenharmony_ci} 66962306a36Sopenharmony_ci 67062306a36Sopenharmony_cistatic inline bool 67162306a36Sopenharmony_cipnfs_lseg_range_intersecting(const struct pnfs_layout_range *l1, 67262306a36Sopenharmony_ci const struct pnfs_layout_range *l2) 67362306a36Sopenharmony_ci{ 67462306a36Sopenharmony_ci u64 end1 = pnfs_end_offset(l1->offset, l1->length); 67562306a36Sopenharmony_ci u64 end2 = pnfs_end_offset(l2->offset, l2->length); 67662306a36Sopenharmony_ci 67762306a36Sopenharmony_ci return pnfs_is_range_intersecting(l1->offset, end1, l2->offset, end2); 67862306a36Sopenharmony_ci} 67962306a36Sopenharmony_ci 68062306a36Sopenharmony_cistatic inline bool 68162306a36Sopenharmony_cipnfs_lseg_request_intersecting(struct pnfs_layout_segment *lseg, struct nfs_page *req) 68262306a36Sopenharmony_ci{ 68362306a36Sopenharmony_ci u64 seg_last = pnfs_end_offset(lseg->pls_range.offset, lseg->pls_range.length); 68462306a36Sopenharmony_ci u64 req_last = req_offset(req) + req->wb_bytes; 68562306a36Sopenharmony_ci 68662306a36Sopenharmony_ci return pnfs_is_range_intersecting(lseg->pls_range.offset, seg_last, 68762306a36Sopenharmony_ci req_offset(req), req_last); 68862306a36Sopenharmony_ci} 68962306a36Sopenharmony_ci 69062306a36Sopenharmony_cistatic inline void pnfs_lseg_cancel_io(struct nfs_server *server, 69162306a36Sopenharmony_ci struct pnfs_layout_segment *lseg) 69262306a36Sopenharmony_ci{ 69362306a36Sopenharmony_ci if (server->pnfs_curr_ld->cancel_io) 69462306a36Sopenharmony_ci server->pnfs_curr_ld->cancel_io(lseg); 69562306a36Sopenharmony_ci} 69662306a36Sopenharmony_ci 69762306a36Sopenharmony_ciextern unsigned int layoutstats_timer; 69862306a36Sopenharmony_ci 69962306a36Sopenharmony_ci#ifdef NFS_DEBUG 70062306a36Sopenharmony_civoid nfs4_print_deviceid(const struct nfs4_deviceid *dev_id); 70162306a36Sopenharmony_ci#else 70262306a36Sopenharmony_cistatic inline void nfs4_print_deviceid(const struct nfs4_deviceid *dev_id) 70362306a36Sopenharmony_ci{ 70462306a36Sopenharmony_ci} 70562306a36Sopenharmony_ci 70662306a36Sopenharmony_ci#endif /* NFS_DEBUG */ 70762306a36Sopenharmony_ci#else /* CONFIG_NFS_V4_1 */ 70862306a36Sopenharmony_ci 70962306a36Sopenharmony_cistatic inline bool nfs_have_layout(struct inode *inode) 71062306a36Sopenharmony_ci{ 71162306a36Sopenharmony_ci return false; 71262306a36Sopenharmony_ci} 71362306a36Sopenharmony_ci 71462306a36Sopenharmony_cistatic inline void pnfs_destroy_all_layouts(struct nfs_client *clp) 71562306a36Sopenharmony_ci{ 71662306a36Sopenharmony_ci} 71762306a36Sopenharmony_ci 71862306a36Sopenharmony_cistatic inline void pnfs_destroy_layout(struct nfs_inode *nfsi) 71962306a36Sopenharmony_ci{ 72062306a36Sopenharmony_ci} 72162306a36Sopenharmony_ci 72262306a36Sopenharmony_cistatic inline void pnfs_destroy_layout_final(struct nfs_inode *nfsi) 72362306a36Sopenharmony_ci{ 72462306a36Sopenharmony_ci} 72562306a36Sopenharmony_ci 72662306a36Sopenharmony_cistatic inline struct pnfs_layout_segment * 72762306a36Sopenharmony_cipnfs_get_lseg(struct pnfs_layout_segment *lseg) 72862306a36Sopenharmony_ci{ 72962306a36Sopenharmony_ci return NULL; 73062306a36Sopenharmony_ci} 73162306a36Sopenharmony_ci 73262306a36Sopenharmony_cistatic inline void pnfs_put_lseg(struct pnfs_layout_segment *lseg) 73362306a36Sopenharmony_ci{ 73462306a36Sopenharmony_ci} 73562306a36Sopenharmony_ci 73662306a36Sopenharmony_cistatic inline int pnfs_return_layout(struct inode *ino) 73762306a36Sopenharmony_ci{ 73862306a36Sopenharmony_ci return 0; 73962306a36Sopenharmony_ci} 74062306a36Sopenharmony_ci 74162306a36Sopenharmony_cistatic inline int pnfs_commit_and_return_layout(struct inode *inode) 74262306a36Sopenharmony_ci{ 74362306a36Sopenharmony_ci return 0; 74462306a36Sopenharmony_ci} 74562306a36Sopenharmony_ci 74662306a36Sopenharmony_cistatic inline bool 74762306a36Sopenharmony_cipnfs_ld_layoutret_on_setattr(struct inode *inode) 74862306a36Sopenharmony_ci{ 74962306a36Sopenharmony_ci return false; 75062306a36Sopenharmony_ci} 75162306a36Sopenharmony_ci 75262306a36Sopenharmony_cistatic inline bool 75362306a36Sopenharmony_cipnfs_ld_read_whole_page(struct inode *inode) 75462306a36Sopenharmony_ci{ 75562306a36Sopenharmony_ci return false; 75662306a36Sopenharmony_ci} 75762306a36Sopenharmony_ci 75862306a36Sopenharmony_cistatic inline int 75962306a36Sopenharmony_cipnfs_sync_inode(struct inode *inode, bool datasync) 76062306a36Sopenharmony_ci{ 76162306a36Sopenharmony_ci return 0; 76262306a36Sopenharmony_ci} 76362306a36Sopenharmony_ci 76462306a36Sopenharmony_cistatic inline bool 76562306a36Sopenharmony_cipnfs_layoutcommit_outstanding(struct inode *inode) 76662306a36Sopenharmony_ci{ 76762306a36Sopenharmony_ci return false; 76862306a36Sopenharmony_ci} 76962306a36Sopenharmony_ci 77062306a36Sopenharmony_ci 77162306a36Sopenharmony_cistatic inline bool 77262306a36Sopenharmony_cipnfs_roc(struct inode *ino, 77362306a36Sopenharmony_ci struct nfs4_layoutreturn_args *args, 77462306a36Sopenharmony_ci struct nfs4_layoutreturn_res *res, 77562306a36Sopenharmony_ci const struct cred *cred) 77662306a36Sopenharmony_ci{ 77762306a36Sopenharmony_ci return false; 77862306a36Sopenharmony_ci} 77962306a36Sopenharmony_ci 78062306a36Sopenharmony_cistatic inline int 78162306a36Sopenharmony_cipnfs_roc_done(struct rpc_task *task, 78262306a36Sopenharmony_ci struct nfs4_layoutreturn_args **argpp, 78362306a36Sopenharmony_ci struct nfs4_layoutreturn_res **respp, 78462306a36Sopenharmony_ci int *ret) 78562306a36Sopenharmony_ci{ 78662306a36Sopenharmony_ci return 0; 78762306a36Sopenharmony_ci} 78862306a36Sopenharmony_ci 78962306a36Sopenharmony_cistatic inline void 79062306a36Sopenharmony_cipnfs_roc_release(struct nfs4_layoutreturn_args *args, 79162306a36Sopenharmony_ci struct nfs4_layoutreturn_res *res, 79262306a36Sopenharmony_ci int ret) 79362306a36Sopenharmony_ci{ 79462306a36Sopenharmony_ci} 79562306a36Sopenharmony_ci 79662306a36Sopenharmony_cistatic inline bool 79762306a36Sopenharmony_cipnfs_wait_on_layoutreturn(struct inode *ino, struct rpc_task *task) 79862306a36Sopenharmony_ci{ 79962306a36Sopenharmony_ci return false; 80062306a36Sopenharmony_ci} 80162306a36Sopenharmony_ci 80262306a36Sopenharmony_cistatic inline void set_pnfs_layoutdriver(struct nfs_server *s, 80362306a36Sopenharmony_ci const struct nfs_fh *mntfh, 80462306a36Sopenharmony_ci struct nfs_fsinfo *fsinfo) 80562306a36Sopenharmony_ci{ 80662306a36Sopenharmony_ci} 80762306a36Sopenharmony_ci 80862306a36Sopenharmony_cistatic inline void unset_pnfs_layoutdriver(struct nfs_server *s) 80962306a36Sopenharmony_ci{ 81062306a36Sopenharmony_ci} 81162306a36Sopenharmony_ci 81262306a36Sopenharmony_cistatic inline int 81362306a36Sopenharmony_cipnfs_commit_list(struct inode *inode, struct list_head *mds_pages, int how, 81462306a36Sopenharmony_ci struct nfs_commit_info *cinfo) 81562306a36Sopenharmony_ci{ 81662306a36Sopenharmony_ci return PNFS_NOT_ATTEMPTED; 81762306a36Sopenharmony_ci} 81862306a36Sopenharmony_ci 81962306a36Sopenharmony_cistatic inline struct pnfs_ds_commit_info * 82062306a36Sopenharmony_cipnfs_get_ds_info(struct inode *inode) 82162306a36Sopenharmony_ci{ 82262306a36Sopenharmony_ci return NULL; 82362306a36Sopenharmony_ci} 82462306a36Sopenharmony_ci 82562306a36Sopenharmony_cistatic inline void 82662306a36Sopenharmony_cipnfs_init_ds_commit_info_ops(struct pnfs_ds_commit_info *fl_cinfo, struct inode *inode) 82762306a36Sopenharmony_ci{ 82862306a36Sopenharmony_ci} 82962306a36Sopenharmony_ci 83062306a36Sopenharmony_cistatic inline void 83162306a36Sopenharmony_cipnfs_init_ds_commit_info(struct pnfs_ds_commit_info *fl_cinfo) 83262306a36Sopenharmony_ci{ 83362306a36Sopenharmony_ci} 83462306a36Sopenharmony_ci 83562306a36Sopenharmony_cistatic inline void 83662306a36Sopenharmony_cipnfs_release_ds_info(struct pnfs_ds_commit_info *fl_cinfo, struct inode *inode) 83762306a36Sopenharmony_ci{ 83862306a36Sopenharmony_ci} 83962306a36Sopenharmony_ci 84062306a36Sopenharmony_cistatic inline bool 84162306a36Sopenharmony_cipnfs_mark_request_commit(struct nfs_page *req, struct pnfs_layout_segment *lseg, 84262306a36Sopenharmony_ci struct nfs_commit_info *cinfo, u32 ds_commit_idx) 84362306a36Sopenharmony_ci{ 84462306a36Sopenharmony_ci return false; 84562306a36Sopenharmony_ci} 84662306a36Sopenharmony_ci 84762306a36Sopenharmony_cistatic inline bool 84862306a36Sopenharmony_cipnfs_clear_request_commit(struct nfs_page *req, struct nfs_commit_info *cinfo) 84962306a36Sopenharmony_ci{ 85062306a36Sopenharmony_ci return false; 85162306a36Sopenharmony_ci} 85262306a36Sopenharmony_ci 85362306a36Sopenharmony_cistatic inline int 85462306a36Sopenharmony_cipnfs_scan_commit_lists(struct inode *inode, struct nfs_commit_info *cinfo, 85562306a36Sopenharmony_ci int max) 85662306a36Sopenharmony_ci{ 85762306a36Sopenharmony_ci return 0; 85862306a36Sopenharmony_ci} 85962306a36Sopenharmony_ci 86062306a36Sopenharmony_cistatic inline void 86162306a36Sopenharmony_cipnfs_recover_commit_reqs(struct list_head *head, struct nfs_commit_info *cinfo) 86262306a36Sopenharmony_ci{ 86362306a36Sopenharmony_ci} 86462306a36Sopenharmony_ci 86562306a36Sopenharmony_cistatic inline struct nfs_page * 86662306a36Sopenharmony_cipnfs_search_commit_reqs(struct inode *inode, struct nfs_commit_info *cinfo, 86762306a36Sopenharmony_ci struct folio *folio) 86862306a36Sopenharmony_ci{ 86962306a36Sopenharmony_ci return NULL; 87062306a36Sopenharmony_ci} 87162306a36Sopenharmony_ci 87262306a36Sopenharmony_cistatic inline int pnfs_layoutcommit_inode(struct inode *inode, bool sync) 87362306a36Sopenharmony_ci{ 87462306a36Sopenharmony_ci return 0; 87562306a36Sopenharmony_ci} 87662306a36Sopenharmony_ci 87762306a36Sopenharmony_cistatic inline bool 87862306a36Sopenharmony_cipnfs_use_threshold(struct nfs4_threshold **dst, struct nfs4_threshold *src, 87962306a36Sopenharmony_ci struct nfs_server *nfss) 88062306a36Sopenharmony_ci{ 88162306a36Sopenharmony_ci return false; 88262306a36Sopenharmony_ci} 88362306a36Sopenharmony_ci 88462306a36Sopenharmony_cistatic inline struct nfs4_threshold *pnfs_mdsthreshold_alloc(void) 88562306a36Sopenharmony_ci{ 88662306a36Sopenharmony_ci return NULL; 88762306a36Sopenharmony_ci} 88862306a36Sopenharmony_ci 88962306a36Sopenharmony_cistatic inline void nfs4_pnfs_v3_ds_connect_unload(void) 89062306a36Sopenharmony_ci{ 89162306a36Sopenharmony_ci} 89262306a36Sopenharmony_ci 89362306a36Sopenharmony_cistatic inline bool nfs4_layout_refresh_old_stateid(nfs4_stateid *dst, 89462306a36Sopenharmony_ci struct pnfs_layout_range *dst_range, 89562306a36Sopenharmony_ci struct inode *inode) 89662306a36Sopenharmony_ci{ 89762306a36Sopenharmony_ci return false; 89862306a36Sopenharmony_ci} 89962306a36Sopenharmony_ci 90062306a36Sopenharmony_cistatic inline void pnfs_lgopen_prepare(struct nfs4_opendata *data, 90162306a36Sopenharmony_ci struct nfs_open_context *ctx) 90262306a36Sopenharmony_ci{ 90362306a36Sopenharmony_ci} 90462306a36Sopenharmony_ci 90562306a36Sopenharmony_cistatic inline void pnfs_parse_lgopen(struct inode *ino, 90662306a36Sopenharmony_ci struct nfs4_layoutget *lgp, 90762306a36Sopenharmony_ci struct nfs_open_context *ctx) 90862306a36Sopenharmony_ci{ 90962306a36Sopenharmony_ci} 91062306a36Sopenharmony_ci 91162306a36Sopenharmony_cistatic inline void nfs4_lgopen_release(struct nfs4_layoutget *lgp) 91262306a36Sopenharmony_ci{ 91362306a36Sopenharmony_ci} 91462306a36Sopenharmony_ci 91562306a36Sopenharmony_cistatic inline bool pnfs_layout_is_valid(const struct pnfs_layout_hdr *lo) 91662306a36Sopenharmony_ci{ 91762306a36Sopenharmony_ci return false; 91862306a36Sopenharmony_ci} 91962306a36Sopenharmony_ci 92062306a36Sopenharmony_ci#endif /* CONFIG_NFS_V4_1 */ 92162306a36Sopenharmony_ci 92262306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_NFS_V4_2) 92362306a36Sopenharmony_ciint pnfs_report_layoutstat(struct inode *inode, gfp_t gfp_flags); 92462306a36Sopenharmony_ci#else 92562306a36Sopenharmony_cistatic inline int 92662306a36Sopenharmony_cipnfs_report_layoutstat(struct inode *inode, gfp_t gfp_flags) 92762306a36Sopenharmony_ci{ 92862306a36Sopenharmony_ci return 0; 92962306a36Sopenharmony_ci} 93062306a36Sopenharmony_ci#endif 93162306a36Sopenharmony_ci 93262306a36Sopenharmony_ci#endif /* FS_NFS_PNFS_H */ 933