aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-02-12 13:39:41 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2015-02-12 13:39:41 -0500
commit61845143febe6b88349acad4732adc54894009a3 (patch)
treebed6a23efe05b9867b8b4d1f4d251fc1c562e7e4 /include/linux
parenta26be149facb22d30cd92cadb26f651d6fe802c9 (diff)
parentc23ae6017835b5bc9b9ec9d5d9c2b1523053f503 (diff)
Merge branch 'for-3.20' of git://linux-nfs.org/~bfields/linux
Pull nfsd updates from Bruce Fields: "The main change is the pNFS block server support from Christoph, which allows an NFS client connected to shared disk to do block IO to the shared disk in place of NFS reads and writes. This also requires xfs patches, which should arrive soon through the xfs tree, barring unexpected problems. Support for other filesystems is also possible if there's interest. Thanks also to Chuck Lever for continuing work to get NFS/RDMA into shape" * 'for-3.20' of git://linux-nfs.org/~bfields/linux: (32 commits) nfsd: default NFSv4.2 to on nfsd: pNFS block layout driver exportfs: add methods for block layout exports nfsd: add trace events nfsd: update documentation for pNFS support nfsd: implement pNFS layout recalls nfsd: implement pNFS operations nfsd: make find_any_file available outside nfs4state.c nfsd: make find/get/put file available outside nfs4state.c nfsd: make lookup/alloc/unhash_stid available outside nfs4state.c nfsd: add fh_fsid_match helper nfsd: move nfsd_fh_match to nfsfh.h fs: add FL_LAYOUT lease type fs: track fl_owner for leases nfs: add LAYOUT_TYPE_MAX enum value nfsd: factor out a helper to decode nfstime4 values sunrpc/lockd: fix references to the BKL nfsd: fix year-2038 nfs4 state problem svcrdma: Handle additional inline content svcrdma: Move read list XDR round-up logic ...
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/exportfs.h23
-rw-r--r--include/linux/fs.h16
-rw-r--r--include/linux/nfs4.h2
-rw-r--r--include/linux/sunrpc/svc.h2
-rw-r--r--include/linux/sunrpc/svc_rdma.h13
5 files changed, 53 insertions, 3 deletions
diff --git a/include/linux/exportfs.h b/include/linux/exportfs.h
index 41b223a59a63..fa05e04c5531 100644
--- a/include/linux/exportfs.h
+++ b/include/linux/exportfs.h
@@ -4,6 +4,7 @@
4#include <linux/types.h> 4#include <linux/types.h>
5 5
6struct dentry; 6struct dentry;
7struct iattr;
7struct inode; 8struct inode;
8struct super_block; 9struct super_block;
9struct vfsmount; 10struct vfsmount;
@@ -180,6 +181,21 @@ struct fid {
180 * get_name is not (which is possibly inconsistent) 181 * get_name is not (which is possibly inconsistent)
181 */ 182 */
182 183
184/* types of block ranges for multipage write mappings. */
185#define IOMAP_HOLE 0x01 /* no blocks allocated, need allocation */
186#define IOMAP_DELALLOC 0x02 /* delayed allocation blocks */
187#define IOMAP_MAPPED 0x03 /* blocks allocated @blkno */
188#define IOMAP_UNWRITTEN 0x04 /* blocks allocated @blkno in unwritten state */
189
190#define IOMAP_NULL_BLOCK -1LL /* blkno is not valid */
191
192struct iomap {
193 sector_t blkno; /* first sector of mapping */
194 loff_t offset; /* file offset of mapping, bytes */
195 u64 length; /* length of mapping, bytes */
196 int type; /* type of mapping */
197};
198
183struct export_operations { 199struct export_operations {
184 int (*encode_fh)(struct inode *inode, __u32 *fh, int *max_len, 200 int (*encode_fh)(struct inode *inode, __u32 *fh, int *max_len,
185 struct inode *parent); 201 struct inode *parent);
@@ -191,6 +207,13 @@ struct export_operations {
191 struct dentry *child); 207 struct dentry *child);
192 struct dentry * (*get_parent)(struct dentry *child); 208 struct dentry * (*get_parent)(struct dentry *child);
193 int (*commit_metadata)(struct inode *inode); 209 int (*commit_metadata)(struct inode *inode);
210
211 int (*get_uuid)(struct super_block *sb, u8 *buf, u32 *len, u64 *offset);
212 int (*map_blocks)(struct inode *inode, loff_t offset,
213 u64 len, struct iomap *iomap,
214 bool write, u32 *device_generation);
215 int (*commit_blocks)(struct inode *inode, struct iomap *iomaps,
216 int nr_iomaps, struct iattr *iattr);
194}; 217};
195 218
196extern int exportfs_encode_inode_fh(struct inode *inode, struct fid *fid, 219extern int exportfs_encode_inode_fh(struct inode *inode, struct fid *fid,
diff --git a/include/linux/fs.h b/include/linux/fs.h
index f125b88443bd..cdcb1e9d9613 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -873,6 +873,7 @@ static inline struct file *get_file(struct file *f)
873#define FL_DOWNGRADE_PENDING 256 /* Lease is being downgraded */ 873#define FL_DOWNGRADE_PENDING 256 /* Lease is being downgraded */
874#define FL_UNLOCK_PENDING 512 /* Lease is being broken */ 874#define FL_UNLOCK_PENDING 512 /* Lease is being broken */
875#define FL_OFDLCK 1024 /* lock is "owned" by struct file */ 875#define FL_OFDLCK 1024 /* lock is "owned" by struct file */
876#define FL_LAYOUT 2048 /* outstanding pNFS layout */
876 877
877/* 878/*
878 * Special return value from posix_lock_file() and vfs_lock_file() for 879 * Special return value from posix_lock_file() and vfs_lock_file() for
@@ -2035,6 +2036,16 @@ static inline int break_deleg_wait(struct inode **delegated_inode)
2035 return ret; 2036 return ret;
2036} 2037}
2037 2038
2039static inline int break_layout(struct inode *inode, bool wait)
2040{
2041 smp_mb();
2042 if (inode->i_flctx && !list_empty_careful(&inode->i_flctx->flc_lease))
2043 return __break_lease(inode,
2044 wait ? O_WRONLY : O_WRONLY | O_NONBLOCK,
2045 FL_LAYOUT);
2046 return 0;
2047}
2048
2038#else /* !CONFIG_FILE_LOCKING */ 2049#else /* !CONFIG_FILE_LOCKING */
2039static inline int locks_mandatory_locked(struct file *file) 2050static inline int locks_mandatory_locked(struct file *file)
2040{ 2051{
@@ -2090,6 +2101,11 @@ static inline int break_deleg_wait(struct inode **delegated_inode)
2090 return 0; 2101 return 0;
2091} 2102}
2092 2103
2104static inline int break_layout(struct inode *inode, bool wait)
2105{
2106 return 0;
2107}
2108
2093#endif /* CONFIG_FILE_LOCKING */ 2109#endif /* CONFIG_FILE_LOCKING */
2094 2110
2095/* fs/open.c */ 2111/* fs/open.c */
diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h
index de7c91ca427e..ed43cb74b11d 100644
--- a/include/linux/nfs4.h
+++ b/include/linux/nfs4.h
@@ -411,6 +411,7 @@ enum lock_type4 {
411#define FATTR4_WORD1_TIME_MODIFY_SET (1UL << 22) 411#define FATTR4_WORD1_TIME_MODIFY_SET (1UL << 22)
412#define FATTR4_WORD1_MOUNTED_ON_FILEID (1UL << 23) 412#define FATTR4_WORD1_MOUNTED_ON_FILEID (1UL << 23)
413#define FATTR4_WORD1_FS_LAYOUT_TYPES (1UL << 30) 413#define FATTR4_WORD1_FS_LAYOUT_TYPES (1UL << 30)
414#define FATTR4_WORD2_LAYOUT_TYPES (1UL << 0)
414#define FATTR4_WORD2_LAYOUT_BLKSIZE (1UL << 1) 415#define FATTR4_WORD2_LAYOUT_BLKSIZE (1UL << 1)
415#define FATTR4_WORD2_MDSTHRESHOLD (1UL << 4) 416#define FATTR4_WORD2_MDSTHRESHOLD (1UL << 4)
416#define FATTR4_WORD2_SECURITY_LABEL (1UL << 16) 417#define FATTR4_WORD2_SECURITY_LABEL (1UL << 16)
@@ -517,6 +518,7 @@ enum pnfs_layouttype {
517 LAYOUT_OSD2_OBJECTS = 2, 518 LAYOUT_OSD2_OBJECTS = 2,
518 LAYOUT_BLOCK_VOLUME = 3, 519 LAYOUT_BLOCK_VOLUME = 3,
519 LAYOUT_FLEX_FILES = 4, 520 LAYOUT_FLEX_FILES = 4,
521 LAYOUT_TYPE_MAX
520}; 522};
521 523
522/* used for both layout return and recall */ 524/* used for both layout return and recall */
diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h
index 6f22cfeef5e3..fae6fb947fc8 100644
--- a/include/linux/sunrpc/svc.h
+++ b/include/linux/sunrpc/svc.h
@@ -110,7 +110,7 @@ struct svc_serv {
110 * We use sv_nrthreads as a reference count. svc_destroy() drops 110 * We use sv_nrthreads as a reference count. svc_destroy() drops
111 * this refcount, so we need to bump it up around operations that 111 * this refcount, so we need to bump it up around operations that
112 * change the number of threads. Horrible, but there it is. 112 * change the number of threads. Horrible, but there it is.
113 * Should be called with the BKL held. 113 * Should be called with the "service mutex" held.
114 */ 114 */
115static inline void svc_get(struct svc_serv *serv) 115static inline void svc_get(struct svc_serv *serv)
116{ 116{
diff --git a/include/linux/sunrpc/svc_rdma.h b/include/linux/sunrpc/svc_rdma.h
index ddfe88f52219..df8edf8ec914 100644
--- a/include/linux/sunrpc/svc_rdma.h
+++ b/include/linux/sunrpc/svc_rdma.h
@@ -77,6 +77,7 @@ struct svc_rdma_op_ctxt {
77 enum ib_wr_opcode wr_op; 77 enum ib_wr_opcode wr_op;
78 enum ib_wc_status wc_status; 78 enum ib_wc_status wc_status;
79 u32 byte_len; 79 u32 byte_len;
80 u32 position;
80 struct svcxprt_rdma *xprt; 81 struct svcxprt_rdma *xprt;
81 unsigned long flags; 82 unsigned long flags;
82 enum dma_data_direction direction; 83 enum dma_data_direction direction;
@@ -148,6 +149,10 @@ struct svcxprt_rdma {
148 struct ib_cq *sc_rq_cq; 149 struct ib_cq *sc_rq_cq;
149 struct ib_cq *sc_sq_cq; 150 struct ib_cq *sc_sq_cq;
150 struct ib_mr *sc_phys_mr; /* MR for server memory */ 151 struct ib_mr *sc_phys_mr; /* MR for server memory */
152 int (*sc_reader)(struct svcxprt_rdma *,
153 struct svc_rqst *,
154 struct svc_rdma_op_ctxt *,
155 int *, u32 *, u32, u32, u64, bool);
151 u32 sc_dev_caps; /* distilled device caps */ 156 u32 sc_dev_caps; /* distilled device caps */
152 u32 sc_dma_lkey; /* local dma key */ 157 u32 sc_dma_lkey; /* local dma key */
153 unsigned int sc_frmr_pg_list_len; 158 unsigned int sc_frmr_pg_list_len;
@@ -176,8 +181,6 @@ struct svcxprt_rdma {
176#define RPCRDMA_MAX_REQ_SIZE 4096 181#define RPCRDMA_MAX_REQ_SIZE 4096
177 182
178/* svc_rdma_marshal.c */ 183/* svc_rdma_marshal.c */
179extern void svc_rdma_rcl_chunk_counts(struct rpcrdma_read_chunk *,
180 int *, int *);
181extern int svc_rdma_xdr_decode_req(struct rpcrdma_msg **, struct svc_rqst *); 184extern int svc_rdma_xdr_decode_req(struct rpcrdma_msg **, struct svc_rqst *);
182extern int svc_rdma_xdr_decode_deferred_req(struct svc_rqst *); 185extern int svc_rdma_xdr_decode_deferred_req(struct svc_rqst *);
183extern int svc_rdma_xdr_encode_error(struct svcxprt_rdma *, 186extern int svc_rdma_xdr_encode_error(struct svcxprt_rdma *,
@@ -195,6 +198,12 @@ extern int svc_rdma_xdr_get_reply_hdr_len(struct rpcrdma_msg *);
195 198
196/* svc_rdma_recvfrom.c */ 199/* svc_rdma_recvfrom.c */
197extern int svc_rdma_recvfrom(struct svc_rqst *); 200extern int svc_rdma_recvfrom(struct svc_rqst *);
201extern int rdma_read_chunk_lcl(struct svcxprt_rdma *, struct svc_rqst *,
202 struct svc_rdma_op_ctxt *, int *, u32 *,
203 u32, u32, u64, bool);
204extern int rdma_read_chunk_frmr(struct svcxprt_rdma *, struct svc_rqst *,
205 struct svc_rdma_op_ctxt *, int *, u32 *,
206 u32, u32, u64, bool);
198 207
199/* svc_rdma_sendto.c */ 208/* svc_rdma_sendto.c */
200extern int svc_rdma_sendto(struct svc_rqst *); 209extern int svc_rdma_sendto(struct svc_rqst *);