30
30
#ifndef FS_NFS_PNFS_H
31
31
#define FS_NFS_PNFS_H
33
#include <linux/nfs_fs.h>
33
34
#include <linux/nfs_page.h>
36
37
NFS_LSEG_VALID = 0, /* cleared when lseg is recalled/returned */
37
38
NFS_LSEG_ROC, /* roc bit received from server */
39
NFS_LSEG_LAYOUTCOMMIT, /* layoutcommit bit set for layoutcommit */
40
42
struct pnfs_layout_segment {
41
43
struct list_head pls_list;
44
struct list_head pls_lc_list;
42
45
struct pnfs_layout_range pls_range;
43
46
atomic_t pls_refcount;
44
47
unsigned long pls_flags;
45
48
struct pnfs_layout_hdr *pls_layout;
46
struct rpc_cred *pls_lc_cred; /* LAYOUTCOMMIT credential */
47
loff_t pls_end_pos; /* LAYOUTCOMMIT write end */
50
51
enum pnfs_try_status {
64
65
NFS_LAYOUT_DESTROYED, /* no new use of layout allowed */
68
enum layoutdriver_policy_flags {
69
/* Should the pNFS client commit and return the layout upon a setattr */
70
PNFS_LAYOUTRET_ON_SETATTR = 1 << 0,
73
struct nfs4_deviceid_node;
67
75
/* Per-layout driver specific registration structure */
68
76
struct pnfs_layoutdriver_type {
69
77
struct list_head pnfs_tblid;
72
80
struct module *owner;
83
struct pnfs_layout_hdr * (*alloc_layout_hdr) (struct inode *inode, gfp_t gfp_flags);
84
void (*free_layout_hdr) (struct pnfs_layout_hdr *);
73
86
struct pnfs_layout_segment * (*alloc_lseg) (struct pnfs_layout_hdr *layoutid, struct nfs4_layoutget_res *lgr, gfp_t gfp_flags);
74
87
void (*free_lseg) (struct pnfs_layout_segment *lseg);
76
89
/* test for nfs page cache coalescing */
77
int (*pg_test)(struct nfs_pageio_descriptor *, struct nfs_page *, struct nfs_page *);
90
bool (*pg_test)(struct nfs_pageio_descriptor *, struct nfs_page *, struct nfs_page *);
79
92
/* Returns true if layoutdriver wants to divert this request to
80
93
* driver's commit routine.
90
103
enum pnfs_try_status (*read_pagelist) (struct nfs_read_data *nfs_data);
91
104
enum pnfs_try_status (*write_pagelist) (struct nfs_write_data *nfs_data, int how);
106
void (*free_deviceid_node) (struct nfs4_deviceid_node *);
108
void (*encode_layoutreturn) (struct pnfs_layout_hdr *layoutid,
109
struct xdr_stream *xdr,
110
const struct nfs4_layoutreturn_args *args);
112
void (*encode_layoutcommit) (struct pnfs_layout_hdr *layoutid,
113
struct xdr_stream *xdr,
114
const struct nfs4_layoutcommit_args *args);
94
117
struct pnfs_layout_hdr {
101
124
unsigned long plh_block_lgets; /* block LAYOUTGET if >0 */
102
125
u32 plh_barrier; /* ignore lower seqids */
103
126
unsigned long plh_flags;
127
loff_t plh_lwb; /* last write byte for layoutcommit */
128
struct rpc_cred *plh_lc_cred; /* layoutcommit cred */
104
129
struct inode *plh_inode;
120
145
extern int nfs4_proc_getdeviceinfo(struct nfs_server *server,
121
146
struct pnfs_device *dev);
122
147
extern int nfs4_proc_layoutget(struct nfs4_layoutget *lgp);
148
extern int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp);
125
151
void get_layout_hdr(struct pnfs_layout_hdr *lo);
126
152
void put_lseg(struct pnfs_layout_segment *lseg);
127
153
struct pnfs_layout_segment *
128
154
pnfs_update_layout(struct inode *ino, struct nfs_open_context *ctx,
129
enum pnfs_iomode access_type, gfp_t gfp_flags);
155
loff_t pos, u64 count, enum pnfs_iomode access_type,
130
157
void set_pnfs_layoutdriver(struct nfs_server *, u32 id);
131
158
void unset_pnfs_layoutdriver(struct nfs_server *);
132
159
enum pnfs_try_status pnfs_try_to_write_data(struct nfs_write_data *,
133
160
const struct rpc_call_ops *, int);
134
161
enum pnfs_try_status pnfs_try_to_read_data(struct nfs_read_data *,
135
162
const struct rpc_call_ops *);
136
void pnfs_pageio_init_read(struct nfs_pageio_descriptor *, struct inode *);
137
void pnfs_pageio_init_write(struct nfs_pageio_descriptor *, struct inode *);
163
bool pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, struct nfs_page *req);
138
164
int pnfs_layout_process(struct nfs4_layoutget *lgp);
139
165
void pnfs_free_lseg_list(struct list_head *tmp_list);
140
166
void pnfs_destroy_layout(struct nfs_inode *);
148
174
struct nfs4_state *open_state);
149
175
int mark_matching_lsegs_invalid(struct pnfs_layout_hdr *lo,
150
176
struct list_head *tmp_list,
177
struct pnfs_layout_range *recall_range);
152
178
bool pnfs_roc(struct inode *ino);
153
179
void pnfs_roc_release(struct inode *ino);
154
180
void pnfs_roc_set_barrier(struct inode *ino, u32 barrier);
155
181
bool pnfs_roc_drain(struct inode *ino, u32 *barrier);
156
182
void pnfs_set_layoutcommit(struct nfs_write_data *wdata);
157
183
int pnfs_layoutcommit_inode(struct inode *inode, bool sync);
184
int _pnfs_return_layout(struct inode *);
185
int pnfs_ld_write_done(struct nfs_write_data *);
186
int pnfs_ld_read_done(struct nfs_read_data *);
189
struct nfs4_deviceid_node {
190
struct hlist_node node;
191
struct hlist_node tmpnode;
192
const struct pnfs_layoutdriver_type *ld;
193
const struct nfs_client *nfs_client;
194
struct nfs4_deviceid deviceid;
198
void nfs4_print_deviceid(const struct nfs4_deviceid *dev_id);
199
struct nfs4_deviceid_node *nfs4_find_get_deviceid(const struct pnfs_layoutdriver_type *, const struct nfs_client *, const struct nfs4_deviceid *);
200
struct nfs4_deviceid_node *nfs4_unhash_put_deviceid(const struct pnfs_layoutdriver_type *, const struct nfs_client *, const struct nfs4_deviceid *);
201
void nfs4_delete_deviceid(const struct pnfs_layoutdriver_type *, const struct nfs_client *, const struct nfs4_deviceid *);
202
void nfs4_init_deviceid_node(struct nfs4_deviceid_node *,
203
const struct pnfs_layoutdriver_type *,
204
const struct nfs_client *,
205
const struct nfs4_deviceid *);
206
struct nfs4_deviceid_node *nfs4_insert_deviceid_node(struct nfs4_deviceid_node *);
207
bool nfs4_put_deviceid_node(struct nfs4_deviceid_node *);
208
void nfs4_deviceid_purge_client(const struct nfs_client *);
159
210
static inline int lo_fail_bit(u32 iomode)
223
274
put_lseg(req->wb_commit_lseg);
277
/* Should the pNFS client commit and return the layout upon a setattr */
279
pnfs_ld_layoutret_on_setattr(struct inode *inode)
281
if (!pnfs_enabled_sb(NFS_SERVER(inode)))
283
return NFS_SERVER(inode)->pnfs_curr_ld->flags &
284
PNFS_LAYOUTRET_ON_SETATTR;
287
static inline int pnfs_return_layout(struct inode *ino)
289
struct nfs_inode *nfsi = NFS_I(ino);
290
struct nfs_server *nfss = NFS_SERVER(ino);
292
if (pnfs_enabled_sb(nfss) && nfsi->layout)
293
return _pnfs_return_layout(ino);
298
static inline void pnfs_pageio_init(struct nfs_pageio_descriptor *pgio,
301
struct pnfs_layoutdriver_type *ld = NFS_SERVER(inode)->pnfs_curr_ld;
304
pgio->pg_test = ld->pg_test;
226
307
#else /* CONFIG_NFS_V4_1 */
228
309
static inline void pnfs_destroy_all_layouts(struct nfs_client *clp)
246
327
static inline struct pnfs_layout_segment *
247
328
pnfs_update_layout(struct inode *ino, struct nfs_open_context *ctx,
248
enum pnfs_iomode access_type, gfp_t gfp_flags)
329
loff_t pos, u64 count, enum pnfs_iomode access_type,
298
pnfs_pageio_init_read(struct nfs_pageio_descriptor *pgio, struct inode *ino)
300
pgio->pg_test = NULL;
304
pnfs_pageio_init_write(struct nfs_pageio_descriptor *pgio, struct inode *ino)
306
pgio->pg_test = NULL;
390
static inline void pnfs_pageio_init(struct nfs_pageio_descriptor *pgio,
309
395
static inline void