diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-11 20:14:54 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-11 20:14:54 -0500 |
commit | 6f83e5bd3e96228ee0caff0b103addb5f4e95459 (patch) | |
tree | bf27fcc754ea8c5287088df2803edbfb3c70f716 /fs/nfs/flexfilelayout/flexfilelayout.h | |
parent | 73b4f63aebd6d57db4ca1d31fa6f8516651207b0 (diff) | |
parent | c627d31ba0696cbd829437af2be2f2dee3546b1e (diff) |
Merge tag 'nfs-for-3.20-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
Pull NFS client updates from Trond Myklebust:
"Highlights incluse:
Features:
- Removing the forced serialisation of open()/close() calls in
NFSv4.x (x>0) makes for a significant performance improvement in
metadata intensive workloads.
- Full support for the pNFS "flexible files" layout type
- Further RPC/RDMA client improvements from Chuck
Bugfixes:
- Stable fix: NFSv4.1 backchannel calls blocking operations with !TASK_RUNNING
- Stable fix: pnfs_generic_pg_init_read/write can be called with lseg == NULL
- Stable fix: Fix an Oopsable condition when nsm_mon_unmon is called
as part of the namespace cleanup,
- Stable fix: Ensure we reference the inode for return-on-close in
delegreturn
- Use SO_REUSEPORT to ensure that NFSv3 TCP connections can rebind to
the same source address/port combination during a disconnect/
reconnect event. This is a requirement imposed by most NFSv3
server duplicate reply cache implementations.
Optimisations:
- Ask for no NFSv4.1 delegations on OPEN if using O_DIRECT
Other:
- Add Anna Schumaker as co-maintainer for the NFS client"
* tag 'nfs-for-3.20-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs: (119 commits)
SUNRPC: Cleanup to remove xs_tcp_close()
pnfs: delete an unintended goto
pnfs/flexfiles: Do not dprintk after the free
SUNRPC: Fix stupid typo in xs_sock_set_reuseport
SUNRPC: Define xs_tcp_fin_timeout only if CONFIG_SUNRPC_DEBUG
SUNRPC: Handle connection reset more efficiently.
SUNRPC: Remove the redundant XPRT_CONNECTION_CLOSE flag
SUNRPC: Make xs_tcp_close() do a socket shutdown rather than a sock_release
SUNRPC: Ensure xs_tcp_shutdown() requests a full close of the connection
SUNRPC: Cleanup to remove remaining uses of XPRT_CONNECTION_ABORT
SUNRPC: Remove TCP socket linger code
SUNRPC: Remove TCP client connection reset hack
SUNRPC: TCP/UDP always close the old socket before reconnecting
SUNRPC: Add helpers to prevent socket create from racing
SUNRPC: Ensure xs_reset_transport() resets the close connection flags
SUNRPC: Do not clear the source port in xs_reset_transport
SUNRPC: Handle EADDRINUSE on connect
SUNRPC: Set SO_REUSEPORT socket option for TCP connections
NFSv4.1: Fix pnfs_put_lseg races
NFSv4.1: pnfs_send_layoutreturn should use GFP_NOFS
...
Diffstat (limited to 'fs/nfs/flexfilelayout/flexfilelayout.h')
-rw-r--r-- | fs/nfs/flexfilelayout/flexfilelayout.h | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/fs/nfs/flexfilelayout/flexfilelayout.h b/fs/nfs/flexfilelayout/flexfilelayout.h new file mode 100644 index 000000000000..070f20445b2d --- /dev/null +++ b/fs/nfs/flexfilelayout/flexfilelayout.h | |||
@@ -0,0 +1,155 @@ | |||
1 | /* | ||
2 | * NFSv4 flexfile layout driver data structures. | ||
3 | * | ||
4 | * Copyright (c) 2014, Primary Data, Inc. All rights reserved. | ||
5 | * | ||
6 | * Tao Peng <bergwolf@primarydata.com> | ||
7 | */ | ||
8 | |||
9 | #ifndef FS_NFS_NFS4FLEXFILELAYOUT_H | ||
10 | #define FS_NFS_NFS4FLEXFILELAYOUT_H | ||
11 | |||
12 | #include "../pnfs.h" | ||
13 | |||
14 | /* XXX: Let's filter out insanely large mirror count for now to avoid oom | ||
15 | * due to network error etc. */ | ||
16 | #define NFS4_FLEXFILE_LAYOUT_MAX_MIRROR_CNT 4096 | ||
17 | |||
18 | struct nfs4_ff_ds_version { | ||
19 | u32 version; | ||
20 | u32 minor_version; | ||
21 | u32 rsize; | ||
22 | u32 wsize; | ||
23 | bool tightly_coupled; | ||
24 | }; | ||
25 | |||
26 | /* chained in global deviceid hlist */ | ||
27 | struct nfs4_ff_layout_ds { | ||
28 | struct nfs4_deviceid_node id_node; | ||
29 | u32 ds_versions_cnt; | ||
30 | struct nfs4_ff_ds_version *ds_versions; | ||
31 | struct nfs4_pnfs_ds *ds; | ||
32 | }; | ||
33 | |||
34 | struct nfs4_ff_layout_ds_err { | ||
35 | struct list_head list; /* linked in mirror error_list */ | ||
36 | u64 offset; | ||
37 | u64 length; | ||
38 | int status; | ||
39 | enum nfs_opnum4 opnum; | ||
40 | nfs4_stateid stateid; | ||
41 | struct nfs4_deviceid deviceid; | ||
42 | }; | ||
43 | |||
44 | struct nfs4_ff_layout_mirror { | ||
45 | u32 ds_count; | ||
46 | u32 efficiency; | ||
47 | struct nfs4_ff_layout_ds *mirror_ds; | ||
48 | u32 fh_versions_cnt; | ||
49 | struct nfs_fh *fh_versions; | ||
50 | nfs4_stateid stateid; | ||
51 | struct nfs4_string user_name; | ||
52 | struct nfs4_string group_name; | ||
53 | u32 uid; | ||
54 | u32 gid; | ||
55 | struct rpc_cred *cred; | ||
56 | spinlock_t lock; | ||
57 | }; | ||
58 | |||
59 | struct nfs4_ff_layout_segment { | ||
60 | struct pnfs_layout_segment generic_hdr; | ||
61 | u64 stripe_unit; | ||
62 | u32 mirror_array_cnt; | ||
63 | struct nfs4_ff_layout_mirror **mirror_array; | ||
64 | }; | ||
65 | |||
66 | struct nfs4_flexfile_layout { | ||
67 | struct pnfs_layout_hdr generic_hdr; | ||
68 | struct pnfs_ds_commit_info commit_info; | ||
69 | struct list_head error_list; /* nfs4_ff_layout_ds_err */ | ||
70 | }; | ||
71 | |||
72 | static inline struct nfs4_flexfile_layout * | ||
73 | FF_LAYOUT_FROM_HDR(struct pnfs_layout_hdr *lo) | ||
74 | { | ||
75 | return container_of(lo, struct nfs4_flexfile_layout, generic_hdr); | ||
76 | } | ||
77 | |||
78 | static inline struct nfs4_ff_layout_segment * | ||
79 | FF_LAYOUT_LSEG(struct pnfs_layout_segment *lseg) | ||
80 | { | ||
81 | return container_of(lseg, | ||
82 | struct nfs4_ff_layout_segment, | ||
83 | generic_hdr); | ||
84 | } | ||
85 | |||
86 | static inline struct nfs4_deviceid_node * | ||
87 | FF_LAYOUT_DEVID_NODE(struct pnfs_layout_segment *lseg, u32 idx) | ||
88 | { | ||
89 | if (idx >= FF_LAYOUT_LSEG(lseg)->mirror_array_cnt || | ||
90 | FF_LAYOUT_LSEG(lseg)->mirror_array[idx] == NULL || | ||
91 | FF_LAYOUT_LSEG(lseg)->mirror_array[idx]->mirror_ds == NULL) | ||
92 | return NULL; | ||
93 | return &FF_LAYOUT_LSEG(lseg)->mirror_array[idx]->mirror_ds->id_node; | ||
94 | } | ||
95 | |||
96 | static inline struct nfs4_ff_layout_ds * | ||
97 | FF_LAYOUT_MIRROR_DS(struct nfs4_deviceid_node *node) | ||
98 | { | ||
99 | return container_of(node, struct nfs4_ff_layout_ds, id_node); | ||
100 | } | ||
101 | |||
102 | static inline struct nfs4_ff_layout_mirror * | ||
103 | FF_LAYOUT_COMP(struct pnfs_layout_segment *lseg, u32 idx) | ||
104 | { | ||
105 | if (idx >= FF_LAYOUT_LSEG(lseg)->mirror_array_cnt) | ||
106 | return NULL; | ||
107 | return FF_LAYOUT_LSEG(lseg)->mirror_array[idx]; | ||
108 | } | ||
109 | |||
110 | static inline u32 | ||
111 | FF_LAYOUT_MIRROR_COUNT(struct pnfs_layout_segment *lseg) | ||
112 | { | ||
113 | return FF_LAYOUT_LSEG(lseg)->mirror_array_cnt; | ||
114 | } | ||
115 | |||
116 | static inline bool | ||
117 | ff_layout_test_devid_unavailable(struct nfs4_deviceid_node *node) | ||
118 | { | ||
119 | return nfs4_test_deviceid_unavailable(node); | ||
120 | } | ||
121 | |||
122 | static inline int | ||
123 | nfs4_ff_layout_ds_version(struct pnfs_layout_segment *lseg, u32 ds_idx) | ||
124 | { | ||
125 | return FF_LAYOUT_COMP(lseg, ds_idx)->mirror_ds->ds_versions[0].version; | ||
126 | } | ||
127 | |||
128 | struct nfs4_ff_layout_ds * | ||
129 | nfs4_ff_alloc_deviceid_node(struct nfs_server *server, struct pnfs_device *pdev, | ||
130 | gfp_t gfp_flags); | ||
131 | void nfs4_ff_layout_put_deviceid(struct nfs4_ff_layout_ds *mirror_ds); | ||
132 | void nfs4_ff_layout_free_deviceid(struct nfs4_ff_layout_ds *mirror_ds); | ||
133 | int ff_layout_track_ds_error(struct nfs4_flexfile_layout *flo, | ||
134 | struct nfs4_ff_layout_mirror *mirror, u64 offset, | ||
135 | u64 length, int status, enum nfs_opnum4 opnum, | ||
136 | gfp_t gfp_flags); | ||
137 | int ff_layout_encode_ds_ioerr(struct nfs4_flexfile_layout *flo, | ||
138 | struct xdr_stream *xdr, int *count, | ||
139 | const struct pnfs_layout_range *range); | ||
140 | struct nfs_fh * | ||
141 | nfs4_ff_layout_select_ds_fh(struct pnfs_layout_segment *lseg, u32 mirror_idx); | ||
142 | |||
143 | struct nfs4_pnfs_ds * | ||
144 | nfs4_ff_layout_prepare_ds(struct pnfs_layout_segment *lseg, u32 ds_idx, | ||
145 | bool fail_return); | ||
146 | |||
147 | struct rpc_clnt * | ||
148 | nfs4_ff_find_or_create_ds_client(struct pnfs_layout_segment *lseg, | ||
149 | u32 ds_idx, | ||
150 | struct nfs_client *ds_clp, | ||
151 | struct inode *inode); | ||
152 | struct rpc_cred *ff_layout_get_ds_cred(struct pnfs_layout_segment *lseg, | ||
153 | u32 ds_idx, struct rpc_cred *mdscred); | ||
154 | bool ff_layout_has_available_ds(struct pnfs_layout_segment *lseg); | ||
155 | #endif /* FS_NFS_NFS4FLEXFILELAYOUT_H */ | ||