^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * pNFS client data structures.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (c) 2002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * The Regents of the University of Michigan
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * All Rights Reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Dean Hildebrand <dhildebz@umich.edu>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Permission is granted to use, copy, create derivative works, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * redistribute this software and such derivative works for any purpose,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * so long as the name of the University of Michigan is not used in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * any advertising or publicity pertaining to the use or distribution
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * of this software without specific, written prior authorization. If
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * the above copyright notice or any other identification of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * University of Michigan is included in any copy of any portion of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * this software, then the disclaimer below must also be included.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * This software is provided as is, without representation or warranty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * of any kind either express or implied, including without limitation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * the implied warranties of merchantability, fitness for a particular
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * purpose, or noninfringement. The Regents of the University of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * Michigan shall not be liable for any damages, including special,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * indirect, incidental, or consequential damages, with respect to any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * claim arising out of or in connection with the use of the software,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * even if it has been or is hereafter advised of the possibility of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * such damages.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #ifndef FS_NFS_PNFS_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define FS_NFS_PNFS_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include <linux/refcount.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <linux/nfs_fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include <linux/nfs_page.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include <linux/workqueue.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) struct nfs4_opendata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) NFS_LSEG_VALID = 0, /* cleared when lseg is recalled/returned */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) NFS_LSEG_ROC, /* roc bit received from server */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) NFS_LSEG_LAYOUTCOMMIT, /* layoutcommit bit set for layoutcommit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) NFS_LSEG_LAYOUTRETURN, /* layoutreturn bit set for layoutreturn */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) NFS_LSEG_UNAVAILABLE, /* unavailable bit set for temporary problem */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) /* Individual ip address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) struct nfs4_pnfs_ds_addr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) struct sockaddr_storage da_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) size_t da_addrlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) struct list_head da_node; /* nfs4_pnfs_dev_hlist dev_dslist */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) char *da_remotestr; /* human readable addr+port */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) struct nfs4_pnfs_ds {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) struct list_head ds_node; /* nfs4_pnfs_dev_hlist dev_dslist */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) char *ds_remotestr; /* comma sep list of addrs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) struct list_head ds_addrs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) struct nfs_client *ds_clp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) refcount_t ds_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) unsigned long ds_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define NFS4DS_CONNECTING 0 /* ds is establishing connection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) struct pnfs_layout_segment {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) struct list_head pls_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) struct list_head pls_lc_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) struct list_head pls_commits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) struct pnfs_layout_range pls_range;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) refcount_t pls_refcount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) u32 pls_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) unsigned long pls_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) struct pnfs_layout_hdr *pls_layout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) enum pnfs_try_status {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) PNFS_ATTEMPTED = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) PNFS_NOT_ATTEMPTED = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) PNFS_TRY_AGAIN = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) /* error codes for internal use */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #define NFS4ERR_RESET_TO_MDS 12001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define NFS4ERR_RESET_TO_PNFS 12002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #ifdef CONFIG_NFS_V4_1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #define LAYOUT_NFSV4_1_MODULE_PREFIX "nfs-layouttype4"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) * Default data server connection timeout and retrans vaules.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) * Set by module parameters dataserver_timeo and dataserver_retrans.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #define NFS4_DEF_DS_TIMEO 600 /* in tenths of a second */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define NFS4_DEF_DS_RETRANS 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #define PNFS_DEVICE_RETRY_TIMEOUT (120*HZ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) NFS_LAYOUT_RO_FAILED = 0, /* get ro layout failed stop trying */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) NFS_LAYOUT_RW_FAILED, /* get rw layout failed stop trying */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) NFS_LAYOUT_BULK_RECALL, /* bulk recall affecting layout */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) NFS_LAYOUT_RETURN, /* layoutreturn in progress */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) NFS_LAYOUT_RETURN_LOCK, /* Serialise layoutreturn */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) NFS_LAYOUT_RETURN_REQUESTED, /* Return this layout ASAP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) NFS_LAYOUT_INVALID_STID, /* layout stateid id is invalid */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) NFS_LAYOUT_FIRST_LAYOUTGET, /* Serialize first layoutget */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) NFS_LAYOUT_INODE_FREEING, /* The inode is being freed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) NFS_LAYOUT_HASHED, /* The layout visible */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) enum layoutdriver_policy_flags {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) /* Should the pNFS client commit and return the layout upon truncate to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) * a smaller size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) PNFS_LAYOUTRET_ON_SETATTR = 1 << 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) PNFS_LAYOUTRET_ON_ERROR = 1 << 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) PNFS_READ_WHOLE_PAGE = 1 << 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) PNFS_LAYOUTGET_ON_OPEN = 1 << 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) struct nfs4_deviceid_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) /* Per-layout driver specific registration structure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) struct pnfs_layoutdriver_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) struct list_head pnfs_tblid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) const u32 id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) const char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) struct module *owner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) unsigned flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) unsigned max_deviceinfo_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) unsigned max_layoutget_response;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) int (*set_layoutdriver) (struct nfs_server *, const struct nfs_fh *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) int (*clear_layoutdriver) (struct nfs_server *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) struct pnfs_layout_hdr * (*alloc_layout_hdr) (struct inode *inode, gfp_t gfp_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) void (*free_layout_hdr) (struct pnfs_layout_hdr *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) struct pnfs_layout_segment * (*alloc_lseg) (struct pnfs_layout_hdr *layoutid, struct nfs4_layoutget_res *lgr, gfp_t gfp_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) void (*free_lseg) (struct pnfs_layout_segment *lseg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) void (*add_lseg) (struct pnfs_layout_hdr *layoutid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) struct pnfs_layout_segment *lseg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) struct list_head *free_me);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) void (*return_range) (struct pnfs_layout_hdr *lo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) struct pnfs_layout_range *range);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) /* test for nfs page cache coalescing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) const struct nfs_pageio_ops *pg_read_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) const struct nfs_pageio_ops *pg_write_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) struct pnfs_ds_commit_info *(*get_ds_info) (struct inode *inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) int (*sync)(struct inode *inode, bool datasync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) * Return PNFS_ATTEMPTED to indicate the layout code has attempted
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) * I/O, else return PNFS_NOT_ATTEMPTED to fall back to normal NFS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) enum pnfs_try_status (*read_pagelist)(struct nfs_pgio_header *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) enum pnfs_try_status (*write_pagelist)(struct nfs_pgio_header *, int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) void (*free_deviceid_node) (struct nfs4_deviceid_node *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) struct nfs4_deviceid_node * (*alloc_deviceid_node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) (struct nfs_server *server, struct pnfs_device *pdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) gfp_t gfp_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) int (*prepare_layoutreturn) (struct nfs4_layoutreturn_args *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) void (*cleanup_layoutcommit) (struct nfs4_layoutcommit_data *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) int (*prepare_layoutcommit) (struct nfs4_layoutcommit_args *args);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) int (*prepare_layoutstats) (struct nfs42_layoutstat_args *args);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) struct pnfs_commit_ops {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) void (*setup_ds_info)(struct pnfs_ds_commit_info *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) struct pnfs_layout_segment *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) void (*release_ds_info)(struct pnfs_ds_commit_info *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) struct inode *inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) int (*commit_pagelist)(struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) struct list_head *mds_pages,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) int how,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) struct nfs_commit_info *cinfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) void (*mark_request_commit) (struct nfs_page *req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) struct pnfs_layout_segment *lseg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) struct nfs_commit_info *cinfo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) u32 ds_commit_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) void (*clear_request_commit) (struct nfs_page *req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) struct nfs_commit_info *cinfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) int (*scan_commit_lists) (struct nfs_commit_info *cinfo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) int max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) void (*recover_commit_reqs) (struct list_head *list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) struct nfs_commit_info *cinfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) struct nfs_page * (*search_commit_reqs)(struct nfs_commit_info *cinfo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) struct page *page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) struct pnfs_layout_hdr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) refcount_t plh_refcount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) atomic_t plh_outstanding; /* number of RPCs out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) struct list_head plh_layouts; /* other client layouts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) struct list_head plh_bulk_destroy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) struct list_head plh_segs; /* layout segments list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) struct list_head plh_return_segs; /* invalid layout segments */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) unsigned long plh_block_lgets; /* block LAYOUTGET if >0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) unsigned long plh_retry_timestamp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) unsigned long plh_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) nfs4_stateid plh_stateid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) u32 plh_barrier; /* ignore lower seqids */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) u32 plh_return_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) enum pnfs_iomode plh_return_iomode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) loff_t plh_lwb; /* last write byte for layoutcommit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) const struct cred *plh_lc_cred; /* layoutcommit cred */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) struct inode *plh_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) struct rcu_head plh_rcu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) struct pnfs_device {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) struct nfs4_deviceid dev_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) unsigned int layout_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) unsigned int mincount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) unsigned int maxcount; /* gdia_maxcount */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) struct page **pages;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) unsigned int pgbase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) unsigned int pglen; /* reply buffer length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) unsigned char nocache : 1;/* May not be cached */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) #define NFS4_PNFS_GETDEVLIST_MAXNUM 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) struct pnfs_devicelist {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) unsigned int eof;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) unsigned int num_devs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) struct nfs4_deviceid dev_id[NFS4_PNFS_GETDEVLIST_MAXNUM];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) extern int pnfs_register_layoutdriver(struct pnfs_layoutdriver_type *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) extern void pnfs_unregister_layoutdriver(struct pnfs_layoutdriver_type *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) extern const struct pnfs_layoutdriver_type *pnfs_find_layoutdriver(u32 id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) extern void pnfs_put_layoutdriver(const struct pnfs_layoutdriver_type *ld);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) /* nfs4proc.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) extern size_t max_response_pages(struct nfs_server *server);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) extern int nfs4_proc_getdeviceinfo(struct nfs_server *server,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) struct pnfs_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) const struct cred *cred);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) extern struct pnfs_layout_segment* nfs4_proc_layoutget(struct nfs4_layoutget *lgp, long *timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) extern int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) /* pnfs.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) void pnfs_get_layout_hdr(struct pnfs_layout_hdr *lo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) void pnfs_put_lseg(struct pnfs_layout_segment *lseg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) void set_pnfs_layoutdriver(struct nfs_server *, const struct nfs_fh *, struct nfs_fsinfo *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) void unset_pnfs_layoutdriver(struct nfs_server *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) void pnfs_generic_pg_check_layout(struct nfs_pageio_descriptor *pgio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) void pnfs_generic_pg_check_range(struct nfs_pageio_descriptor *pgio, struct nfs_page *req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) void pnfs_generic_pg_init_read(struct nfs_pageio_descriptor *, struct nfs_page *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) int pnfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) void pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *pgio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) struct nfs_page *req, u64 wb_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) void pnfs_generic_pg_cleanup(struct nfs_pageio_descriptor *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) int pnfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) size_t pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) struct nfs_page *prev, struct nfs_page *req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) void pnfs_set_lo_fail(struct pnfs_layout_segment *lseg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) struct pnfs_layout_segment *pnfs_layout_process(struct nfs4_layoutget *lgp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) void pnfs_layoutget_free(struct nfs4_layoutget *lgp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) void pnfs_free_lseg_list(struct list_head *tmp_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) void pnfs_destroy_layout(struct nfs_inode *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) void pnfs_destroy_layout_final(struct nfs_inode *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) void pnfs_destroy_all_layouts(struct nfs_client *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) int pnfs_destroy_layouts_byfsid(struct nfs_client *clp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) struct nfs_fsid *fsid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) bool is_recall);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) int pnfs_destroy_layouts_byclid(struct nfs_client *clp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) bool is_recall);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) bool nfs4_layout_refresh_old_stateid(nfs4_stateid *dst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) struct pnfs_layout_range *dst_range,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) struct inode *inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) void pnfs_put_layout_hdr(struct pnfs_layout_hdr *lo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) void pnfs_set_layout_stateid(struct pnfs_layout_hdr *lo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) const nfs4_stateid *new,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) const struct cred *cred,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) bool update_barrier);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) int pnfs_mark_matching_lsegs_invalid(struct pnfs_layout_hdr *lo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) struct list_head *tmp_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) const struct pnfs_layout_range *recall_range,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) u32 seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) int pnfs_mark_matching_lsegs_return(struct pnfs_layout_hdr *lo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) struct list_head *tmp_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) const struct pnfs_layout_range *recall_range,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) u32 seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) int pnfs_mark_layout_stateid_invalid(struct pnfs_layout_hdr *lo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) struct list_head *lseg_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) bool pnfs_roc(struct inode *ino,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) struct nfs4_layoutreturn_args *args,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) struct nfs4_layoutreturn_res *res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) const struct cred *cred);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) int pnfs_roc_done(struct rpc_task *task, struct nfs4_layoutreturn_args **argpp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) struct nfs4_layoutreturn_res **respp, int *ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) void pnfs_roc_release(struct nfs4_layoutreturn_args *args,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) struct nfs4_layoutreturn_res *res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) int ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) bool pnfs_wait_on_layoutreturn(struct inode *ino, struct rpc_task *task);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) void pnfs_set_layoutcommit(struct inode *, struct pnfs_layout_segment *, loff_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) void pnfs_cleanup_layoutcommit(struct nfs4_layoutcommit_data *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) int pnfs_layoutcommit_inode(struct inode *inode, bool sync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) int pnfs_generic_sync(struct inode *inode, bool datasync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) int pnfs_nfs_generic_sync(struct inode *inode, bool datasync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) int _pnfs_return_layout(struct inode *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) int pnfs_commit_and_return_layout(struct inode *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) void pnfs_ld_write_done(struct nfs_pgio_header *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) void pnfs_ld_read_done(struct nfs_pgio_header *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) void pnfs_read_resend_pnfs(struct nfs_pgio_header *, unsigned int mirror_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) struct pnfs_layout_segment *pnfs_update_layout(struct inode *ino,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) struct nfs_open_context *ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) loff_t pos,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) u64 count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) enum pnfs_iomode iomode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) bool strict_iomode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) gfp_t gfp_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) void pnfs_layoutreturn_free_lsegs(struct pnfs_layout_hdr *lo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) const nfs4_stateid *arg_stateid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) const struct pnfs_layout_range *range,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) const nfs4_stateid *stateid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) void pnfs_generic_layout_insert_lseg(struct pnfs_layout_hdr *lo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) struct pnfs_layout_segment *lseg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) bool (*is_after)(const struct pnfs_layout_range *lseg_range,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) const struct pnfs_layout_range *old),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) bool (*do_merge)(struct pnfs_layout_segment *lseg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) struct pnfs_layout_segment *old),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) struct list_head *free_me);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) void nfs4_deviceid_mark_client_invalid(struct nfs_client *clp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) int pnfs_read_done_resend_to_mds(struct nfs_pgio_header *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) int pnfs_write_done_resend_to_mds(struct nfs_pgio_header *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) struct nfs4_threshold *pnfs_mdsthreshold_alloc(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) void pnfs_error_mark_layout_for_return(struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) struct pnfs_layout_segment *lseg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) void pnfs_layout_return_unused_byclid(struct nfs_client *clp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) enum pnfs_iomode iomode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) /* nfs4_deviceid_flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) NFS_DEVICEID_INVALID = 0, /* set when MDS clientid recalled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) NFS_DEVICEID_UNAVAILABLE, /* device temporarily unavailable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) NFS_DEVICEID_NOCACHE, /* device may not be cached */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) /* pnfs_dev.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) struct nfs4_deviceid_node {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) struct hlist_node node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) struct hlist_node tmpnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) const struct pnfs_layoutdriver_type *ld;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) const struct nfs_client *nfs_client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) unsigned long timestamp_unavailable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) struct nfs4_deviceid deviceid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) struct rcu_head rcu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) atomic_t ref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) struct nfs4_deviceid_node *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) nfs4_find_get_deviceid(struct nfs_server *server,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) const struct nfs4_deviceid *id, const struct cred *cred,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) gfp_t gfp_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) void nfs4_delete_deviceid(const struct pnfs_layoutdriver_type *, const struct nfs_client *, const struct nfs4_deviceid *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) void nfs4_init_deviceid_node(struct nfs4_deviceid_node *, struct nfs_server *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) const struct nfs4_deviceid *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) bool nfs4_put_deviceid_node(struct nfs4_deviceid_node *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) void nfs4_mark_deviceid_available(struct nfs4_deviceid_node *node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) void nfs4_mark_deviceid_unavailable(struct nfs4_deviceid_node *node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) bool nfs4_test_deviceid_unavailable(struct nfs4_deviceid_node *node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) void nfs4_deviceid_purge_client(const struct nfs_client *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) /* pnfs_nfs.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) struct pnfs_commit_array *pnfs_alloc_commit_array(size_t n, gfp_t gfp_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) void pnfs_free_commit_array(struct pnfs_commit_array *p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) struct pnfs_commit_array *pnfs_add_commit_array(struct pnfs_ds_commit_info *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) struct pnfs_commit_array *,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) struct pnfs_layout_segment *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) void pnfs_generic_ds_cinfo_release_lseg(struct pnfs_ds_commit_info *fl_cinfo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) struct pnfs_layout_segment *lseg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) void pnfs_generic_ds_cinfo_destroy(struct pnfs_ds_commit_info *fl_cinfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) void pnfs_generic_clear_request_commit(struct nfs_page *req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) struct nfs_commit_info *cinfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) void pnfs_generic_commit_release(void *calldata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) void pnfs_generic_prepare_to_resend_writes(struct nfs_commit_data *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) void pnfs_generic_rw_release(void *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) void pnfs_generic_recover_commit_reqs(struct list_head *dst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) struct nfs_commit_info *cinfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) struct nfs_page *pnfs_generic_search_commit_reqs(struct nfs_commit_info *cinfo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) struct page *page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) int pnfs_generic_commit_pagelist(struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) struct list_head *mds_pages,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) int how,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) struct nfs_commit_info *cinfo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) int (*initiate_commit)(struct nfs_commit_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) int how));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) int pnfs_generic_scan_commit_lists(struct nfs_commit_info *cinfo, int max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) void pnfs_generic_write_commit_done(struct rpc_task *task, void *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) void nfs4_pnfs_ds_put(struct nfs4_pnfs_ds *ds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) struct nfs4_pnfs_ds *nfs4_pnfs_ds_add(struct list_head *dsaddrs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) gfp_t gfp_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) void nfs4_pnfs_v3_ds_connect_unload(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) int nfs4_pnfs_ds_connect(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) struct nfs4_deviceid_node *devid, unsigned int timeo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) unsigned int retrans, u32 version, u32 minor_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) struct nfs4_pnfs_ds_addr *nfs4_decode_mp_ds_addr(struct net *net,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) struct xdr_stream *xdr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) gfp_t gfp_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) void pnfs_layout_mark_request_commit(struct nfs_page *req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) struct pnfs_layout_segment *lseg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) struct nfs_commit_info *cinfo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) u32 ds_commit_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) void pnfs_lgopen_prepare(struct nfs4_opendata *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) struct nfs_open_context *ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) void pnfs_parse_lgopen(struct inode *ino, struct nfs4_layoutget *lgp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) struct nfs_open_context *ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) void nfs4_lgopen_release(struct nfs4_layoutget *lgp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) static inline bool nfs_have_layout(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) return NFS_I(inode)->layout != NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) static inline bool pnfs_layout_is_valid(const struct pnfs_layout_hdr *lo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) return test_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags) == 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) static inline struct nfs4_deviceid_node *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) nfs4_get_deviceid(struct nfs4_deviceid_node *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) atomic_inc(&d->ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) return d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) static inline struct pnfs_layout_segment *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) pnfs_get_lseg(struct pnfs_layout_segment *lseg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) if (lseg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) refcount_inc(&lseg->pls_refcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) smp_mb__after_atomic();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) return lseg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) static inline bool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) pnfs_is_valid_lseg(struct pnfs_layout_segment *lseg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) return test_bit(NFS_LSEG_VALID, &lseg->pls_flags) != 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) /* Return true if a layout driver is being used for this mountpoint */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) static inline int pnfs_enabled_sb(struct nfs_server *nfss)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) return nfss->pnfs_curr_ld != NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) static inline int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) pnfs_commit_list(struct inode *inode, struct list_head *mds_pages, int how,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) struct nfs_commit_info *cinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) struct pnfs_ds_commit_info *fl_cinfo = cinfo->ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) if (fl_cinfo == NULL || fl_cinfo->ncommitting == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) return PNFS_NOT_ATTEMPTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) return fl_cinfo->ops->commit_pagelist(inode, mds_pages, how, cinfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) static inline struct pnfs_ds_commit_info *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) pnfs_get_ds_info(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) struct pnfs_layoutdriver_type *ld = NFS_SERVER(inode)->pnfs_curr_ld;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) if (ld == NULL || ld->get_ds_info == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) return ld->get_ds_info(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) pnfs_init_ds_commit_info_ops(struct pnfs_ds_commit_info *fl_cinfo, struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) struct pnfs_ds_commit_info *inode_cinfo = pnfs_get_ds_info(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) if (inode_cinfo != NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) fl_cinfo->ops = inode_cinfo->ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) pnfs_init_ds_commit_info(struct pnfs_ds_commit_info *fl_cinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) INIT_LIST_HEAD(&fl_cinfo->commits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) fl_cinfo->ops = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) pnfs_release_ds_info(struct pnfs_ds_commit_info *fl_cinfo, struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) if (fl_cinfo->ops != NULL && fl_cinfo->ops->release_ds_info != NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) fl_cinfo->ops->release_ds_info(fl_cinfo, inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) pnfs_generic_mark_devid_invalid(struct nfs4_deviceid_node *node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) set_bit(NFS_DEVICEID_INVALID, &node->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) static inline bool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) pnfs_mark_request_commit(struct nfs_page *req, struct pnfs_layout_segment *lseg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) struct nfs_commit_info *cinfo, u32 ds_commit_idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) struct pnfs_ds_commit_info *fl_cinfo = cinfo->ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) if (!lseg || !fl_cinfo->ops || !fl_cinfo->ops->mark_request_commit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) fl_cinfo->ops->mark_request_commit(req, lseg, cinfo, ds_commit_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) static inline bool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) pnfs_clear_request_commit(struct nfs_page *req, struct nfs_commit_info *cinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) struct pnfs_ds_commit_info *fl_cinfo = cinfo->ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) if (!fl_cinfo || !fl_cinfo->ops || !fl_cinfo->ops->clear_request_commit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) fl_cinfo->ops->clear_request_commit(req, cinfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) static inline int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) pnfs_scan_commit_lists(struct inode *inode, struct nfs_commit_info *cinfo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) int max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) struct pnfs_ds_commit_info *fl_cinfo = cinfo->ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) if (!fl_cinfo || fl_cinfo->nwritten == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) return fl_cinfo->ops->scan_commit_lists(cinfo, max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) pnfs_recover_commit_reqs(struct list_head *head, struct nfs_commit_info *cinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) struct pnfs_ds_commit_info *fl_cinfo = cinfo->ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) if (fl_cinfo && fl_cinfo->nwritten != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) fl_cinfo->ops->recover_commit_reqs(head, cinfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) static inline struct nfs_page *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) pnfs_search_commit_reqs(struct inode *inode, struct nfs_commit_info *cinfo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) struct page *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) struct pnfs_ds_commit_info *fl_cinfo = cinfo->ds;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) if (!fl_cinfo->ops || !fl_cinfo->ops->search_commit_reqs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) return fl_cinfo->ops->search_commit_reqs(cinfo, page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) /* Should the pNFS client commit and return the layout upon a setattr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) static inline bool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) pnfs_ld_layoutret_on_setattr(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) if (!pnfs_enabled_sb(NFS_SERVER(inode)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) return NFS_SERVER(inode)->pnfs_curr_ld->flags &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) PNFS_LAYOUTRET_ON_SETATTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) static inline bool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) pnfs_ld_read_whole_page(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) if (!pnfs_enabled_sb(NFS_SERVER(inode)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) return NFS_SERVER(inode)->pnfs_curr_ld->flags & PNFS_READ_WHOLE_PAGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) static inline int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) pnfs_sync_inode(struct inode *inode, bool datasync)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) if (!pnfs_enabled_sb(NFS_SERVER(inode)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) return NFS_SERVER(inode)->pnfs_curr_ld->sync(inode, datasync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) static inline bool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) pnfs_layoutcommit_outstanding(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) struct nfs_inode *nfsi = NFS_I(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) return test_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->flags) != 0 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) test_bit(NFS_INO_LAYOUTCOMMITTING, &nfsi->flags) != 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) static inline int pnfs_return_layout(struct inode *ino)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) struct nfs_inode *nfsi = NFS_I(ino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) struct nfs_server *nfss = NFS_SERVER(ino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) if (pnfs_enabled_sb(nfss) && nfsi->layout) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) set_bit(NFS_LAYOUT_RETURN_REQUESTED, &nfsi->layout->plh_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) return _pnfs_return_layout(ino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) static inline bool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) pnfs_use_threshold(struct nfs4_threshold **dst, struct nfs4_threshold *src,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) struct nfs_server *nfss)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) return (dst && src && src->bm != 0 && nfss->pnfs_curr_ld &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) nfss->pnfs_curr_ld->id == src->l_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) static inline u64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) pnfs_calc_offset_end(u64 offset, u64 len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) if (len == NFS4_MAX_UINT64 || len >= NFS4_MAX_UINT64 - offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) return NFS4_MAX_UINT64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) return offset + len - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) static inline u64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) pnfs_calc_offset_length(u64 offset, u64 end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) if (end == NFS4_MAX_UINT64 || end <= offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) return NFS4_MAX_UINT64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) return 1 + end - offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) pnfs_copy_range(struct pnfs_layout_range *dst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) const struct pnfs_layout_range *src)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) memcpy(dst, src, sizeof(*dst));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) static inline u64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) pnfs_end_offset(u64 start, u64 len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) if (NFS4_MAX_UINT64 - start <= len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) return NFS4_MAX_UINT64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) return start + len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) * Are 2 ranges intersecting?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) * start1 end1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) * [----------------------------------)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) * start2 end2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) * [----------------)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) static inline bool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) pnfs_is_range_intersecting(u64 start1, u64 end1, u64 start2, u64 end2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) return (end1 == NFS4_MAX_UINT64 || start2 < end1) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) (end2 == NFS4_MAX_UINT64 || start1 < end2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) static inline bool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) pnfs_lseg_range_intersecting(const struct pnfs_layout_range *l1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) const struct pnfs_layout_range *l2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) u64 end1 = pnfs_end_offset(l1->offset, l1->length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) u64 end2 = pnfs_end_offset(l2->offset, l2->length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) return pnfs_is_range_intersecting(l1->offset, end1, l2->offset, end2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) static inline bool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) pnfs_lseg_request_intersecting(struct pnfs_layout_segment *lseg, struct nfs_page *req)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) u64 seg_last = pnfs_end_offset(lseg->pls_range.offset, lseg->pls_range.length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) u64 req_last = req_offset(req) + req->wb_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) return pnfs_is_range_intersecting(lseg->pls_range.offset, seg_last,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) req_offset(req), req_last);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) extern unsigned int layoutstats_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) #ifdef NFS_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) void nfs4_print_deviceid(const struct nfs4_deviceid *dev_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) static inline void nfs4_print_deviceid(const struct nfs4_deviceid *dev_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) #endif /* NFS_DEBUG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) #else /* CONFIG_NFS_V4_1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) static inline bool nfs_have_layout(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) static inline void pnfs_destroy_all_layouts(struct nfs_client *clp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) static inline void pnfs_destroy_layout(struct nfs_inode *nfsi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) static inline void pnfs_destroy_layout_final(struct nfs_inode *nfsi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) static inline struct pnfs_layout_segment *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) pnfs_get_lseg(struct pnfs_layout_segment *lseg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) static inline void pnfs_put_lseg(struct pnfs_layout_segment *lseg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) static inline int pnfs_return_layout(struct inode *ino)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) static inline int pnfs_commit_and_return_layout(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) static inline bool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) pnfs_ld_layoutret_on_setattr(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) static inline bool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) pnfs_ld_read_whole_page(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) static inline int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) pnfs_sync_inode(struct inode *inode, bool datasync)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) static inline bool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) pnfs_layoutcommit_outstanding(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) static inline bool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) pnfs_roc(struct inode *ino,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) struct nfs4_layoutreturn_args *args,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) struct nfs4_layoutreturn_res *res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) const struct cred *cred)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) static inline int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) pnfs_roc_done(struct rpc_task *task,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) struct nfs4_layoutreturn_args **argpp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) struct nfs4_layoutreturn_res **respp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) int *ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) pnfs_roc_release(struct nfs4_layoutreturn_args *args,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) struct nfs4_layoutreturn_res *res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) int ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) static inline bool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) pnfs_wait_on_layoutreturn(struct inode *ino, struct rpc_task *task)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) static inline void set_pnfs_layoutdriver(struct nfs_server *s,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) const struct nfs_fh *mntfh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) struct nfs_fsinfo *fsinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) static inline void unset_pnfs_layoutdriver(struct nfs_server *s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) static inline int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) pnfs_commit_list(struct inode *inode, struct list_head *mds_pages, int how,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) struct nfs_commit_info *cinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) return PNFS_NOT_ATTEMPTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) static inline struct pnfs_ds_commit_info *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) pnfs_get_ds_info(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) pnfs_init_ds_commit_info_ops(struct pnfs_ds_commit_info *fl_cinfo, struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) pnfs_init_ds_commit_info(struct pnfs_ds_commit_info *fl_cinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) pnfs_release_ds_info(struct pnfs_ds_commit_info *fl_cinfo, struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) static inline bool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) pnfs_mark_request_commit(struct nfs_page *req, struct pnfs_layout_segment *lseg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) struct nfs_commit_info *cinfo, u32 ds_commit_idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) static inline bool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) pnfs_clear_request_commit(struct nfs_page *req, struct nfs_commit_info *cinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) static inline int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) pnfs_scan_commit_lists(struct inode *inode, struct nfs_commit_info *cinfo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) int max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) pnfs_recover_commit_reqs(struct list_head *head, struct nfs_commit_info *cinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) static inline struct nfs_page *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) pnfs_search_commit_reqs(struct inode *inode, struct nfs_commit_info *cinfo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) struct page *page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) static inline int pnfs_layoutcommit_inode(struct inode *inode, bool sync)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) static inline bool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) pnfs_use_threshold(struct nfs4_threshold **dst, struct nfs4_threshold *src,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) struct nfs_server *nfss)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) static inline struct nfs4_threshold *pnfs_mdsthreshold_alloc(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) static inline void nfs4_pnfs_v3_ds_connect_unload(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) static inline bool nfs4_layout_refresh_old_stateid(nfs4_stateid *dst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) struct pnfs_layout_range *dst_range,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) static inline void pnfs_lgopen_prepare(struct nfs4_opendata *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) struct nfs_open_context *ctx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) static inline void pnfs_parse_lgopen(struct inode *ino,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) struct nfs4_layoutget *lgp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) struct nfs_open_context *ctx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) static inline void nfs4_lgopen_release(struct nfs4_layoutget *lgp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) static inline bool pnfs_layout_is_valid(const struct pnfs_layout_hdr *lo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) #endif /* CONFIG_NFS_V4_1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) #if IS_ENABLED(CONFIG_NFS_V4_2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) int pnfs_report_layoutstat(struct inode *inode, gfp_t gfp_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) static inline int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) pnfs_report_layoutstat(struct inode *inode, gfp_t gfp_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) #endif /* FS_NFS_PNFS_H */