]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - fs/nfs/pnfs.h
UBUNTU: Ubuntu-4.15.0-96.97
[mirror_ubuntu-bionic-kernel.git] / fs / nfs / pnfs.h
CommitLineData
85e174ba
RL
1/*
2 * pNFS client data structures.
3 *
4 * Copyright (c) 2002
5 * The Regents of the University of Michigan
6 * All Rights Reserved
7 *
8 * Dean Hildebrand <dhildebz@umich.edu>
9 *
10 * Permission is granted to use, copy, create derivative works, and
11 * redistribute this software and such derivative works for any purpose,
12 * so long as the name of the University of Michigan is not used in
13 * any advertising or publicity pertaining to the use or distribution
14 * of this software without specific, written prior authorization. If
15 * the above copyright notice or any other identification of the
16 * University of Michigan is included in any copy of any portion of
17 * this software, then the disclaimer below must also be included.
18 *
19 * This software is provided as is, without representation or warranty
20 * of any kind either express or implied, including without limitation
21 * the implied warranties of merchantability, fitness for a particular
22 * purpose, or noninfringement. The Regents of the University of
23 * Michigan shall not be liable for any damages, including special,
24 * indirect, incidental, or consequential damages, with respect to any
25 * claim arising out of or in connection with the use of the software,
26 * even if it has been or is hereafter advised of the possibility of
27 * such damages.
28 */
29
30#ifndef FS_NFS_PNFS_H
31#define FS_NFS_PNFS_H
32
a2a5dea7 33#include <linux/refcount.h>
45df3c8b 34#include <linux/nfs_fs.h>
94ad1c80 35#include <linux/nfs_page.h>
e6cf82d1 36#include <linux/workqueue.h>
94ad1c80 37
4541d16c
FI
38enum {
39 NFS_LSEG_VALID = 0, /* cleared when lseg is recalled/returned */
f7e8917a 40 NFS_LSEG_ROC, /* roc bit received from server */
a9bae566 41 NFS_LSEG_LAYOUTCOMMIT, /* layoutcommit bit set for layoutcommit */
016256df 42 NFS_LSEG_LAYOUTRETURN, /* layoutreturn bit set for layoutreturn */
4541d16c
FI
43};
44
875ae069
PT
45/* Individual ip address */
46struct nfs4_pnfs_ds_addr {
47 struct sockaddr_storage da_addr;
48 size_t da_addrlen;
49 struct list_head da_node; /* nfs4_pnfs_dev_hlist dev_dslist */
50 char *da_remotestr; /* human readable addr+port */
51};
52
53struct nfs4_pnfs_ds {
54 struct list_head ds_node; /* nfs4_pnfs_dev_hlist dev_dslist */
55 char *ds_remotestr; /* comma sep list of addrs */
56 struct list_head ds_addrs;
57 struct nfs_client *ds_clp;
a2a5dea7 58 refcount_t ds_count;
875ae069
PT
59 unsigned long ds_state;
60#define NFS4DS_CONNECTING 0 /* ds is establishing connection */
4541d16c
FI
61};
62
974cec8c 63struct pnfs_layout_segment {
566052c5 64 struct list_head pls_list;
a9bae566 65 struct list_head pls_lc_list;
566052c5 66 struct pnfs_layout_range pls_range;
eba6dd69 67 refcount_t pls_refcount;
66755283 68 u32 pls_seq;
4541d16c 69 unsigned long pls_flags;
566052c5 70 struct pnfs_layout_hdr *pls_layout;
974cec8c
AA
71};
72
64419a9b
AA
73enum pnfs_try_status {
74 PNFS_ATTEMPTED = 0,
75 PNFS_NOT_ATTEMPTED = 1,
ceb11e13 76 PNFS_TRY_AGAIN = 2,
64419a9b
AA
77};
78
85e174ba
RL
79#ifdef CONFIG_NFS_V4_1
80
81#define LAYOUT_NFSV4_1_MODULE_PREFIX "nfs-layouttype4"
82
39280a5a
PT
83/*
84 * Default data server connection timeout and retrans vaules.
85 * Set by module parameters dataserver_timeo and dataserver_retrans.
86 */
87#define NFS4_DEF_DS_TIMEO 600 /* in tenths of a second */
88#define NFS4_DEF_DS_RETRANS 5
89
90/* error codes for internal use */
91#define NFS4ERR_RESET_TO_MDS 12001
92#define NFS4ERR_RESET_TO_PNFS 12002
93
e5e94017
BH
94enum {
95 NFS_LAYOUT_RO_FAILED = 0, /* get ro layout failed stop trying */
96 NFS_LAYOUT_RW_FAILED, /* get rw layout failed stop trying */
43f1b3da 97 NFS_LAYOUT_BULK_RECALL, /* bulk recall affecting layout */
2370abda 98 NFS_LAYOUT_RETURN, /* layoutreturn in progress */
6604b203 99 NFS_LAYOUT_RETURN_LOCK, /* Serialise layoutreturn */
2370abda 100 NFS_LAYOUT_RETURN_REQUESTED, /* Return this layout ASAP */
47abadef 101 NFS_LAYOUT_INVALID_STID, /* layout stateid id is invalid */
9bf87482 102 NFS_LAYOUT_FIRST_LAYOUTGET, /* Serialize first layoutget */
1eb23da9 103 NFS_LAYOUT_INODE_FREEING, /* The inode is being freed */
e5e94017
BH
104};
105
8a1636c4 106enum layoutdriver_policy_flags {
88ac815c
PT
107 /* Should the pNFS client commit and return the layout upon truncate to
108 * a smaller size */
8a1636c4 109 PNFS_LAYOUTRET_ON_SETATTR = 1 << 0,
fe0fe835 110 PNFS_LAYOUTRET_ON_ERROR = 1 << 1,
612aa983 111 PNFS_READ_WHOLE_PAGE = 1 << 2,
8a1636c4
BH
112};
113
1775bc34
BH
114struct nfs4_deviceid_node;
115
85e174ba
RL
116/* Per-layout driver specific registration structure */
117struct pnfs_layoutdriver_type {
02c35fca
FI
118 struct list_head pnfs_tblid;
119 const u32 id;
120 const char *name;
121 struct module *owner;
8a1636c4 122 unsigned flags;
661373b1 123 unsigned max_deviceinfo_size;
636fb9c8 124
738fd0f3
BH
125 int (*set_layoutdriver) (struct nfs_server *, const struct nfs_fh *);
126 int (*clear_layoutdriver) (struct nfs_server *);
127
636fb9c8
BH
128 struct pnfs_layout_hdr * (*alloc_layout_hdr) (struct inode *inode, gfp_t gfp_flags);
129 void (*free_layout_hdr) (struct pnfs_layout_hdr *);
130
a75b9df9 131 struct pnfs_layout_segment * (*alloc_lseg) (struct pnfs_layout_hdr *layoutid, struct nfs4_layoutget_res *lgr, gfp_t gfp_flags);
b1f69b75 132 void (*free_lseg) (struct pnfs_layout_segment *lseg);
03772d2f
TM
133 void (*add_lseg) (struct pnfs_layout_hdr *layoutid,
134 struct pnfs_layout_segment *lseg,
135 struct list_head *free_me);
94ad1c80 136
c88953d8
CH
137 void (*return_range) (struct pnfs_layout_hdr *lo,
138 struct pnfs_layout_range *range);
139
94ad1c80 140 /* test for nfs page cache coalescing */
1751c363
TM
141 const struct nfs_pageio_ops *pg_read_ops;
142 const struct nfs_pageio_ops *pg_write_ops;
64419a9b 143
ea2cf228 144 struct pnfs_ds_commit_info *(*get_ds_info) (struct inode *inode);
8dd37758 145 void (*mark_request_commit) (struct nfs_page *req,
ea2cf228 146 struct pnfs_layout_segment *lseg,
b57ff130
WAA
147 struct nfs_commit_info *cinfo,
148 u32 ds_commit_idx);
ea2cf228
FI
149 void (*clear_request_commit) (struct nfs_page *req,
150 struct nfs_commit_info *cinfo);
151 int (*scan_commit_lists) (struct nfs_commit_info *cinfo,
152 int max);
1763da12
FI
153 void (*recover_commit_reqs) (struct list_head *list,
154 struct nfs_commit_info *cinfo);
02d1426c
WAA
155 struct nfs_page * (*search_commit_reqs)(struct nfs_commit_info *cinfo,
156 struct page *page);
ea2cf228
FI
157 int (*commit_pagelist)(struct inode *inode,
158 struct list_head *mds_pages,
159 int how,
160 struct nfs_commit_info *cinfo);
a861a1e1 161
5bb89b47
TM
162 int (*sync)(struct inode *inode, bool datasync);
163
64419a9b
AA
164 /*
165 * Return PNFS_ATTEMPTED to indicate the layout code has attempted
166 * I/O, else return PNFS_NOT_ATTEMPTED to fall back to normal NFS
167 */
d45f60c6
WAA
168 enum pnfs_try_status (*read_pagelist)(struct nfs_pgio_header *);
169 enum pnfs_try_status (*write_pagelist)(struct nfs_pgio_header *, int);
1775bc34
BH
170
171 void (*free_deviceid_node) (struct nfs4_deviceid_node *);
661373b1
CH
172 struct nfs4_deviceid_node * (*alloc_deviceid_node)
173 (struct nfs_server *server, struct pnfs_device *pdev,
174 gfp_t gfp_flags);
04a55549 175
287bd3e9 176 int (*prepare_layoutreturn) (struct nfs4_layoutreturn_args *);
ac7db726 177
db29c089 178 void (*cleanup_layoutcommit) (struct nfs4_layoutcommit_data *data);
5f919c9f 179 int (*prepare_layoutcommit) (struct nfs4_layoutcommit_args *args);
8733408d 180 int (*prepare_layoutstats) (struct nfs42_layoutstat_args *args);
85e174ba
RL
181};
182
e5e94017 183struct pnfs_layout_hdr {
2b28a7be 184 refcount_t plh_refcount;
82714bd1 185 atomic_t plh_outstanding; /* number of RPCs out */
b7edfaa1 186 struct list_head plh_layouts; /* other client layouts */
fd9a8d71 187 struct list_head plh_bulk_destroy;
b7edfaa1 188 struct list_head plh_segs; /* layout segments list */
68f74479 189 struct list_head plh_return_segs; /* invalid layout segments */
f7e8917a 190 unsigned long plh_block_lgets; /* block LAYOUTGET if >0 */
25c75333 191 unsigned long plh_retry_timestamp;
566052c5 192 unsigned long plh_flags;
82714bd1
TM
193 nfs4_stateid plh_stateid;
194 u32 plh_barrier; /* ignore lower seqids */
3982a6a2 195 u32 plh_return_seq;
016256df 196 enum pnfs_iomode plh_return_iomode;
acff5880 197 loff_t plh_lwb; /* last write byte for layoutcommit */
9fa40758 198 struct rpc_cred *plh_lc_cred; /* layoutcommit cred */
b7edfaa1 199 struct inode *plh_inode;
e5e94017
BH
200};
201
b1f69b75
AA
202struct pnfs_device {
203 struct nfs4_deviceid dev_id;
204 unsigned int layout_type;
205 unsigned int mincount;
f1c097be 206 unsigned int maxcount; /* gdia_maxcount */
b1f69b75 207 struct page **pages;
b1f69b75 208 unsigned int pgbase;
f1c097be 209 unsigned int pglen; /* reply buffer length */
df52699e 210 unsigned char nocache : 1;/* May not be cached */
b1f69b75
AA
211};
212
7f11d8d3
AA
213#define NFS4_PNFS_GETDEVLIST_MAXNUM 16
214
215struct pnfs_devicelist {
216 unsigned int eof;
217 unsigned int num_devs;
218 struct nfs4_deviceid dev_id[NFS4_PNFS_GETDEVLIST_MAXNUM];
219};
220
02c35fca
FI
221extern int pnfs_register_layoutdriver(struct pnfs_layoutdriver_type *);
222extern void pnfs_unregister_layoutdriver(struct pnfs_layoutdriver_type *);
223
b1f69b75
AA
224/* nfs4proc.c */
225extern int nfs4_proc_getdeviceinfo(struct nfs_server *server,
cd5875fe
TM
226 struct pnfs_device *dev,
227 struct rpc_cred *cred);
183d9e7b 228extern struct pnfs_layout_segment* nfs4_proc_layoutget(struct nfs4_layoutget *lgp, long *timeout, gfp_t gfp_flags);
6c16605d 229extern int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync);
b1f69b75
AA
230
231/* pnfs.c */
70c3bd2b 232void pnfs_get_layout_hdr(struct pnfs_layout_hdr *lo);
9369a431 233void pnfs_put_lseg(struct pnfs_layout_segment *lseg);
1751c363 234
ca440c38 235void set_pnfs_layoutdriver(struct nfs_server *, const struct nfs_fh *, struct nfs_fsinfo *);
85e174ba 236void unset_pnfs_layoutdriver(struct nfs_server *);
b3230e80 237void pnfs_generic_pg_check_layout(struct nfs_pageio_descriptor *pgio);
d8007d4d 238void pnfs_generic_pg_init_read(struct nfs_pageio_descriptor *, struct nfs_page *);
493292dd 239int pnfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc);
6296556f
PT
240void pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *pgio,
241 struct nfs_page *req, u64 wb_size);
180bb5ec 242void pnfs_generic_pg_cleanup(struct nfs_pageio_descriptor *);
dce81290 243int pnfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc);
b4fdac1a
WAA
244size_t pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio,
245 struct nfs_page *prev, struct nfs_page *req);
1b0ae068 246void pnfs_set_lo_fail(struct pnfs_layout_segment *lseg);
a0b0a6e3 247struct pnfs_layout_segment *pnfs_layout_process(struct nfs4_layoutget *lgp);
43f1b3da 248void pnfs_free_lseg_list(struct list_head *tmp_list);
e5e94017 249void pnfs_destroy_layout(struct nfs_inode *);
974cec8c 250void pnfs_destroy_all_layouts(struct nfs_client *);
fd9a8d71
TM
251int pnfs_destroy_layouts_byfsid(struct nfs_client *clp,
252 struct nfs_fsid *fsid,
253 bool is_recall);
254int pnfs_destroy_layouts_byclid(struct nfs_client *clp,
255 bool is_recall);
7380020e 256bool nfs4_refresh_layout_stateid(nfs4_stateid *dst, struct inode *inode);
70c3bd2b 257void pnfs_put_layout_hdr(struct pnfs_layout_hdr *lo);
43f1b3da
FI
258void pnfs_set_layout_stateid(struct pnfs_layout_hdr *lo,
259 const nfs4_stateid *new,
260 bool update_barrier);
49a85061 261int pnfs_mark_matching_lsegs_invalid(struct pnfs_layout_hdr *lo,
43f1b3da 262 struct list_head *tmp_list,
6d597e17
JL
263 const struct pnfs_layout_range *recall_range,
264 u32 seq);
10335556 265int pnfs_mark_matching_lsegs_return(struct pnfs_layout_hdr *lo,
fc7ff367 266 struct list_head *tmp_list,
6d597e17
JL
267 const struct pnfs_layout_range *recall_range,
268 u32 seq);
5f46be04
TM
269int pnfs_mark_layout_stateid_invalid(struct pnfs_layout_hdr *lo,
270 struct list_head *lseg_list);
1c5bd76d
TM
271bool pnfs_roc(struct inode *ino,
272 struct nfs4_layoutreturn_args *args,
273 struct nfs4_layoutreturn_res *res,
274 const struct rpc_cred *cred);
275void pnfs_roc_release(struct nfs4_layoutreturn_args *args,
276 struct nfs4_layoutreturn_res *res,
277 int ret);
500d701f 278bool pnfs_wait_on_layoutreturn(struct inode *ino, struct rpc_task *task);
67af7611 279void pnfs_set_layoutcommit(struct inode *, struct pnfs_layout_segment *, loff_t);
db29c089 280void pnfs_cleanup_layoutcommit(struct nfs4_layoutcommit_data *data);
ef311537 281int pnfs_layoutcommit_inode(struct inode *inode, bool sync);
5bb89b47
TM
282int pnfs_generic_sync(struct inode *inode, bool datasync);
283int pnfs_nfs_generic_sync(struct inode *inode, bool datasync);
cbe82603 284int _pnfs_return_layout(struct inode *);
24028672 285int pnfs_commit_and_return_layout(struct inode *);
d45f60c6
WAA
286void pnfs_ld_write_done(struct nfs_pgio_header *);
287void pnfs_ld_read_done(struct nfs_pgio_header *);
1b1bc66b 288void pnfs_read_resend_pnfs(struct nfs_pgio_header *);
7c24d948
AA
289struct pnfs_layout_segment *pnfs_update_layout(struct inode *ino,
290 struct nfs_open_context *ctx,
291 loff_t pos,
292 u64 count,
293 enum pnfs_iomode iomode,
c7d73af2 294 bool strict_iomode,
7c24d948 295 gfp_t gfp_flags);
68f74479 296void pnfs_layoutreturn_free_lsegs(struct pnfs_layout_hdr *lo,
2a974425 297 const nfs4_stateid *arg_stateid,
68f74479 298 const struct pnfs_layout_range *range,
68f74479 299 const nfs4_stateid *stateid);
e5e94017 300
03772d2f
TM
301void pnfs_generic_layout_insert_lseg(struct pnfs_layout_hdr *lo,
302 struct pnfs_layout_segment *lseg,
303 bool (*is_after)(const struct pnfs_layout_range *lseg_range,
304 const struct pnfs_layout_range *old),
305 bool (*do_merge)(struct pnfs_layout_segment *lseg,
306 struct pnfs_layout_segment *old),
307 struct list_head *free_me);
308
c47abcf8 309void nfs4_deviceid_mark_client_invalid(struct nfs_client *clp);
53113ad3
WAA
310int pnfs_read_done_resend_to_mds(struct nfs_pgio_header *);
311int pnfs_write_done_resend_to_mds(struct nfs_pgio_header *);
82be417a 312struct nfs4_threshold *pnfs_mdsthreshold_alloc(void);
016256df
PT
313void pnfs_error_mark_layout_for_return(struct inode *inode,
314 struct pnfs_layout_segment *lseg);
c47abcf8
AA
315/* nfs4_deviceid_flags */
316enum {
317 NFS_DEVICEID_INVALID = 0, /* set when MDS clientid recalled */
1dfed273 318 NFS_DEVICEID_UNAVAILABLE, /* device temporarily unavailable */
df52699e 319 NFS_DEVICEID_NOCACHE, /* device may not be cached */
c47abcf8
AA
320};
321
a1eaecbc
BH
322/* pnfs_dev.c */
323struct nfs4_deviceid_node {
324 struct hlist_node node;
9e3bd4e2 325 struct hlist_node tmpnode;
1775bc34 326 const struct pnfs_layoutdriver_type *ld;
a1eaecbc 327 const struct nfs_client *nfs_client;
c47abcf8 328 unsigned long flags;
1dfed273 329 unsigned long timestamp_unavailable;
a1eaecbc 330 struct nfs4_deviceid deviceid;
84a80f62 331 struct rcu_head rcu;
a1eaecbc
BH
332 atomic_t ref;
333};
334
661373b1
CH
335struct nfs4_deviceid_node *
336nfs4_find_get_deviceid(struct nfs_server *server,
337 const struct nfs4_deviceid *id, struct rpc_cred *cred,
338 gfp_t gfp_mask);
35c8bb54 339void nfs4_delete_deviceid(const struct pnfs_layoutdriver_type *, const struct nfs_client *, const struct nfs4_deviceid *);
661373b1 340void nfs4_init_deviceid_node(struct nfs4_deviceid_node *, struct nfs_server *,
a1eaecbc 341 const struct nfs4_deviceid *);
a1eaecbc 342bool nfs4_put_deviceid_node(struct nfs4_deviceid_node *);
1dfed273
TM
343void nfs4_mark_deviceid_unavailable(struct nfs4_deviceid_node *node);
344bool nfs4_test_deviceid_unavailable(struct nfs4_deviceid_node *node);
1775bc34 345void nfs4_deviceid_purge_client(const struct nfs_client *);
a1eaecbc 346
f54bcf2e
TH
347/* pnfs_nfs.c */
348void pnfs_generic_clear_request_commit(struct nfs_page *req,
349 struct nfs_commit_info *cinfo);
350void pnfs_generic_commit_release(void *calldata);
351void pnfs_generic_prepare_to_resend_writes(struct nfs_commit_data *data);
352void pnfs_generic_rw_release(void *data);
353void pnfs_generic_recover_commit_reqs(struct list_head *dst,
354 struct nfs_commit_info *cinfo);
355int pnfs_generic_commit_pagelist(struct inode *inode,
356 struct list_head *mds_pages,
357 int how,
358 struct nfs_commit_info *cinfo,
359 int (*initiate_commit)(struct nfs_commit_data *data,
360 int how));
361int pnfs_generic_scan_commit_lists(struct nfs_commit_info *cinfo, int max);
362void pnfs_generic_write_commit_done(struct rpc_task *task, void *data);
875ae069
PT
363void nfs4_pnfs_ds_put(struct nfs4_pnfs_ds *ds);
364struct nfs4_pnfs_ds *nfs4_pnfs_ds_add(struct list_head *dsaddrs,
365 gfp_t gfp_flags);
5f01d953 366void nfs4_pnfs_v3_ds_connect_unload(void);
a33e4b03 367int nfs4_pnfs_ds_connect(struct nfs_server *mds_srv, struct nfs4_pnfs_ds *ds,
7405f9e1 368 struct nfs4_deviceid_node *devid, unsigned int timeo,
7d38de3f 369 unsigned int retrans, u32 version, u32 minor_version);
6b7f3cf9
PT
370struct nfs4_pnfs_ds_addr *nfs4_decode_mp_ds_addr(struct net *net,
371 struct xdr_stream *xdr,
372 gfp_t gfp_flags);
338d00cf
TH
373void pnfs_layout_mark_request_commit(struct nfs_page *req,
374 struct pnfs_layout_segment *lseg,
375 struct nfs_commit_info *cinfo,
376 u32 ds_commit_idx);
f54bcf2e 377
40dd4b7a
TM
378static inline bool nfs_have_layout(struct inode *inode)
379{
380 return NFS_I(inode)->layout != NULL;
381}
382
45fcc7bc
TM
383static inline bool pnfs_layout_is_valid(const struct pnfs_layout_hdr *lo)
384{
385 return test_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags) == 0;
386}
387
30ff0603
CH
388static inline struct nfs4_deviceid_node *
389nfs4_get_deviceid(struct nfs4_deviceid_node *d)
390{
391 atomic_inc(&d->ref);
392 return d;
393}
394
d684d2ae 395static inline struct pnfs_layout_segment *
9369a431 396pnfs_get_lseg(struct pnfs_layout_segment *lseg)
d684d2ae
FI
397{
398 if (lseg) {
eba6dd69 399 refcount_inc(&lseg->pls_refcount);
4e857c58 400 smp_mb__after_atomic();
d684d2ae
FI
401 }
402 return lseg;
403}
404
b20135d0
TM
405static inline bool
406pnfs_is_valid_lseg(struct pnfs_layout_segment *lseg)
407{
408 return test_bit(NFS_LSEG_VALID, &lseg->pls_flags) != 0;
409}
410
e5e94017
BH
411/* Return true if a layout driver is being used for this mountpoint */
412static inline int pnfs_enabled_sb(struct nfs_server *nfss)
413{
414 return nfss->pnfs_curr_ld != NULL;
415}
85e174ba 416
a861a1e1 417static inline int
ea2cf228
FI
418pnfs_commit_list(struct inode *inode, struct list_head *mds_pages, int how,
419 struct nfs_commit_info *cinfo)
a861a1e1 420{
ea2cf228 421 if (cinfo->ds == NULL || cinfo->ds->ncommitting == 0)
a861a1e1 422 return PNFS_NOT_ATTEMPTED;
ea2cf228
FI
423 return NFS_SERVER(inode)->pnfs_curr_ld->commit_pagelist(inode, mds_pages, how, cinfo);
424}
425
426static inline struct pnfs_ds_commit_info *
427pnfs_get_ds_info(struct inode *inode)
428{
429 struct pnfs_layoutdriver_type *ld = NFS_SERVER(inode)->pnfs_curr_ld;
430
431 if (ld == NULL || ld->get_ds_info == NULL)
432 return NULL;
433 return ld->get_ds_info(inode);
a861a1e1
FI
434}
435
f54bcf2e
TH
436static inline void
437pnfs_generic_mark_devid_invalid(struct nfs4_deviceid_node *node)
438{
439 set_bit(NFS_DEVICEID_INVALID, &node->flags);
440}
441
8dd37758 442static inline bool
ea2cf228 443pnfs_mark_request_commit(struct nfs_page *req, struct pnfs_layout_segment *lseg,
b57ff130 444 struct nfs_commit_info *cinfo, u32 ds_commit_idx)
a861a1e1 445{
2b0143b5 446 struct inode *inode = d_inode(req->wb_context->dentry);
8dd37758 447 struct pnfs_layoutdriver_type *ld = NFS_SERVER(inode)->pnfs_curr_ld;
a861a1e1 448
8dd37758
TM
449 if (lseg == NULL || ld->mark_request_commit == NULL)
450 return false;
b57ff130 451 ld->mark_request_commit(req, lseg, cinfo, ds_commit_idx);
8dd37758 452 return true;
a861a1e1
FI
453}
454
8dd37758 455static inline bool
ea2cf228 456pnfs_clear_request_commit(struct nfs_page *req, struct nfs_commit_info *cinfo)
a861a1e1 457{
2b0143b5 458 struct inode *inode = d_inode(req->wb_context->dentry);
8dd37758 459 struct pnfs_layoutdriver_type *ld = NFS_SERVER(inode)->pnfs_curr_ld;
d6d6dc7c 460
8dd37758
TM
461 if (ld == NULL || ld->clear_request_commit == NULL)
462 return false;
ea2cf228 463 ld->clear_request_commit(req, cinfo);
8dd37758 464 return true;
d6d6dc7c
FI
465}
466
467static inline int
ea2cf228
FI
468pnfs_scan_commit_lists(struct inode *inode, struct nfs_commit_info *cinfo,
469 int max)
d6d6dc7c 470{
ea2cf228 471 if (cinfo->ds == NULL || cinfo->ds->nwritten == 0)
d6d6dc7c 472 return 0;
ea2cf228
FI
473 else
474 return NFS_SERVER(inode)->pnfs_curr_ld->scan_commit_lists(cinfo, max);
a861a1e1
FI
475}
476
02d1426c
WAA
477static inline struct nfs_page *
478pnfs_search_commit_reqs(struct inode *inode, struct nfs_commit_info *cinfo,
479 struct page *page)
480{
481 struct pnfs_layoutdriver_type *ld = NFS_SERVER(inode)->pnfs_curr_ld;
482
483 if (ld == NULL || ld->search_commit_reqs == NULL)
484 return NULL;
485 return ld->search_commit_reqs(cinfo, page);
486}
487
8a1636c4
BH
488/* Should the pNFS client commit and return the layout upon a setattr */
489static inline bool
490pnfs_ld_layoutret_on_setattr(struct inode *inode)
491{
492 if (!pnfs_enabled_sb(NFS_SERVER(inode)))
493 return false;
494 return NFS_SERVER(inode)->pnfs_curr_ld->flags &
495 PNFS_LAYOUTRET_ON_SETATTR;
496}
497
612aa983
CH
498static inline bool
499pnfs_ld_read_whole_page(struct inode *inode)
500{
501 if (!pnfs_enabled_sb(NFS_SERVER(inode)))
502 return false;
503 return NFS_SERVER(inode)->pnfs_curr_ld->flags & PNFS_READ_WHOLE_PAGE;
504}
505
5bb89b47
TM
506static inline int
507pnfs_sync_inode(struct inode *inode, bool datasync)
508{
509 if (!pnfs_enabled_sb(NFS_SERVER(inode)))
510 return 0;
511 return NFS_SERVER(inode)->pnfs_curr_ld->sync(inode, datasync);
512}
513
d8c951c3
TM
514static inline bool
515pnfs_layoutcommit_outstanding(struct inode *inode)
516{
517 struct nfs_inode *nfsi = NFS_I(inode);
518
519 return test_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->flags) != 0 ||
520 test_bit(NFS_INO_LAYOUTCOMMITTING, &nfsi->flags) != 0;
521}
522
cbe82603
BH
523static inline int pnfs_return_layout(struct inode *ino)
524{
525 struct nfs_inode *nfsi = NFS_I(ino);
526 struct nfs_server *nfss = NFS_SERVER(ino);
527
528 if (pnfs_enabled_sb(nfss) && nfsi->layout)
529 return _pnfs_return_layout(ino);
530
531 return 0;
532}
533
82be417a
AA
534static inline bool
535pnfs_use_threshold(struct nfs4_threshold **dst, struct nfs4_threshold *src,
536 struct nfs_server *nfss)
537{
fb47ddc9 538 return (dst && src && src->bm != 0 && nfss->pnfs_curr_ld &&
82be417a
AA
539 nfss->pnfs_curr_ld->id == src->l_type);
540}
541
0762ed2c
TM
542static inline u64
543pnfs_calc_offset_end(u64 offset, u64 len)
544{
545 if (len == NFS4_MAX_UINT64 || len >= NFS4_MAX_UINT64 - offset)
546 return NFS4_MAX_UINT64;
547 return offset + len - 1;
548}
549
550static inline u64
551pnfs_calc_offset_length(u64 offset, u64 end)
552{
553 if (end == NFS4_MAX_UINT64 || end <= offset)
554 return NFS4_MAX_UINT64;
555 return 1 + end - offset;
556}
557
e144e539
TM
558static inline void
559pnfs_copy_range(struct pnfs_layout_range *dst,
560 const struct pnfs_layout_range *src)
561{
562 memcpy(dst, src, sizeof(*dst));
563}
564
17822b20
TM
565static inline u64
566pnfs_end_offset(u64 start, u64 len)
567{
568 if (NFS4_MAX_UINT64 - start <= len)
569 return NFS4_MAX_UINT64;
570 return start + len;
571}
572
573/*
574 * Are 2 ranges intersecting?
575 * start1 end1
576 * [----------------------------------)
577 * start2 end2
578 * [----------------)
579 */
580static inline bool
581pnfs_is_range_intersecting(u64 start1, u64 end1, u64 start2, u64 end2)
582{
583 return (end1 == NFS4_MAX_UINT64 || start2 < end1) &&
584 (end2 == NFS4_MAX_UINT64 || start1 < end2);
585}
586
587static inline bool
588pnfs_lseg_range_intersecting(const struct pnfs_layout_range *l1,
589 const struct pnfs_layout_range *l2)
590{
591 u64 end1 = pnfs_end_offset(l1->offset, l1->length);
592 u64 end2 = pnfs_end_offset(l2->offset, l2->length);
593
594 return pnfs_is_range_intersecting(l1->offset, end1, l2->offset, end2);
595}
596
08cb5b0f
BC
597static inline bool
598pnfs_lseg_request_intersecting(struct pnfs_layout_segment *lseg, struct nfs_page *req)
599{
600 u64 seg_last = pnfs_end_offset(lseg->pls_range.offset, lseg->pls_range.length);
601 u64 req_last = req_offset(req) + req->wb_bytes;
602
603 return pnfs_is_range_intersecting(lseg->pls_range.offset, seg_last,
604 req_offset(req), req_last);
605}
606
bbf58bf3
TM
607extern unsigned int layoutstats_timer;
608
6f00866d
TM
609#ifdef NFS_DEBUG
610void nfs4_print_deviceid(const struct nfs4_deviceid *dev_id);
611#else
612static inline void nfs4_print_deviceid(const struct nfs4_deviceid *dev_id)
613{
614}
bbf58bf3 615
6f00866d 616#endif /* NFS_DEBUG */
85e174ba
RL
617#else /* CONFIG_NFS_V4_1 */
618
40dd4b7a
TM
619static inline bool nfs_have_layout(struct inode *inode)
620{
621 return false;
622}
623
974cec8c
AA
624static inline void pnfs_destroy_all_layouts(struct nfs_client *clp)
625{
626}
627
e5e94017
BH
628static inline void pnfs_destroy_layout(struct nfs_inode *nfsi)
629{
630}
631
d684d2ae 632static inline struct pnfs_layout_segment *
9369a431 633pnfs_get_lseg(struct pnfs_layout_segment *lseg)
d684d2ae
FI
634{
635 return NULL;
636}
637
9369a431 638static inline void pnfs_put_lseg(struct pnfs_layout_segment *lseg)
d684d2ae
FI
639{
640}
641
cbe82603
BH
642static inline int pnfs_return_layout(struct inode *ino)
643{
644 return 0;
645}
646
24028672
TM
647static inline int pnfs_commit_and_return_layout(struct inode *inode)
648{
649 return 0;
650}
651
8a1636c4
BH
652static inline bool
653pnfs_ld_layoutret_on_setattr(struct inode *inode)
654{
655 return false;
656}
657
612aa983
CH
658static inline bool
659pnfs_ld_read_whole_page(struct inode *inode)
660{
661 return false;
662}
663
5bb89b47
TM
664static inline int
665pnfs_sync_inode(struct inode *inode, bool datasync)
666{
667 return 0;
668}
669
10b7e9ad
TM
670static inline bool
671pnfs_layoutcommit_outstanding(struct inode *inode)
672{
673 return false;
674}
675
676
f7e8917a 677static inline bool
1c5bd76d
TM
678pnfs_roc(struct inode *ino,
679 struct nfs4_layoutreturn_args *args,
680 struct nfs4_layoutreturn_res *res,
681 const struct rpc_cred *cred)
f7e8917a
FI
682{
683 return false;
684}
685
686static inline void
1c5bd76d
TM
687pnfs_roc_release(struct nfs4_layoutreturn_args *args,
688 struct nfs4_layoutreturn_res *res,
689 int ret)
f7e8917a 690{
f7e8917a
FI
691}
692
500d701f
PT
693static inline bool
694pnfs_wait_on_layoutreturn(struct inode *ino, struct rpc_task *task)
695{
696 return false;
697}
698
738fd0f3 699static inline void set_pnfs_layoutdriver(struct nfs_server *s,
ca440c38
JL
700 const struct nfs_fh *mntfh,
701 struct nfs_fsinfo *fsinfo)
85e174ba
RL
702{
703}
704
705static inline void unset_pnfs_layoutdriver(struct nfs_server *s)
706{
707}
708
a861a1e1 709static inline int
ea2cf228
FI
710pnfs_commit_list(struct inode *inode, struct list_head *mds_pages, int how,
711 struct nfs_commit_info *cinfo)
a861a1e1
FI
712{
713 return PNFS_NOT_ATTEMPTED;
714}
715
ea2cf228
FI
716static inline struct pnfs_ds_commit_info *
717pnfs_get_ds_info(struct inode *inode)
718{
719 return NULL;
720}
721
8dd37758 722static inline bool
ea2cf228 723pnfs_mark_request_commit(struct nfs_page *req, struct pnfs_layout_segment *lseg,
b57ff130 724 struct nfs_commit_info *cinfo, u32 ds_commit_idx)
a861a1e1 725{
8dd37758 726 return false;
a861a1e1
FI
727}
728
8dd37758 729static inline bool
ea2cf228 730pnfs_clear_request_commit(struct nfs_page *req, struct nfs_commit_info *cinfo)
a861a1e1 731{
8dd37758 732 return false;
d6d6dc7c
FI
733}
734
735static inline int
ea2cf228
FI
736pnfs_scan_commit_lists(struct inode *inode, struct nfs_commit_info *cinfo,
737 int max)
d6d6dc7c
FI
738{
739 return 0;
a861a1e1
FI
740}
741
02d1426c
WAA
742static inline struct nfs_page *
743pnfs_search_commit_reqs(struct inode *inode, struct nfs_commit_info *cinfo,
744 struct page *page)
745{
746 return NULL;
747}
748
ef311537 749static inline int pnfs_layoutcommit_inode(struct inode *inode, bool sync)
863a3c6c
AA
750{
751 return 0;
752}
1775bc34 753
82be417a
AA
754static inline bool
755pnfs_use_threshold(struct nfs4_threshold **dst, struct nfs4_threshold *src,
756 struct nfs_server *nfss)
757{
758 return false;
759}
760
761static inline struct nfs4_threshold *pnfs_mdsthreshold_alloc(void)
762{
763 return NULL;
764}
765
5f01d953
PT
766static inline void nfs4_pnfs_v3_ds_connect_unload(void)
767{
768}
769
7380020e
TM
770static inline bool nfs4_refresh_layout_stateid(nfs4_stateid *dst,
771 struct inode *inode)
772{
773 return false;
774}
85e174ba
RL
775#endif /* CONFIG_NFS_V4_1 */
776
865a7ecb 777#if IS_ENABLED(CONFIG_NFS_V4_2)
c8ad8894 778int pnfs_report_layoutstat(struct inode *inode, gfp_t gfp_flags);
865a7ecb
PT
779#else
780static inline int
c8ad8894 781pnfs_report_layoutstat(struct inode *inode, gfp_t gfp_flags)
865a7ecb
PT
782{
783 return 0;
784}
785#endif
786
85e174ba 787#endif /* FS_NFS_PNFS_H */