diff options
author | Fred Isaman <iisaman@netapp.com> | 2012-04-20 14:47:46 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-04-27 14:10:37 -0400 |
commit | 4db6e0b74c0f6dfc2f9c0690e8df512e3b635983 (patch) | |
tree | 19d8a2a7051bdab220b0bdcf3da1e350a53ce428 /include/linux/nfs_xdr.h | |
parent | 30dd374f6fc1b202db3a1b57b61afff1326bad92 (diff) |
NFS: merge _full and _partial read rpc_ops
Decouple nfs_pgio_header and nfs_read_data, and have (possibly
multiple) nfs_read_datas each take a refcount on nfs_pgio_header.
For the moment keeps nfs_read_header as a way to preallocate a single
nfs_read_data with the nfs_pgio_header. The code doesn't need this,
and would be prettier without, but given the amount of churn I am
already introducing I didn't want to play with tuning new mempools.
This also fixes bug in pnfs_ld_handle_read_error. In the case of
desc->pg_bsize < PAGE_CACHE_SIZE, the pages list was empty, causing
replay attempt to do nothing.
Signed-off-by: Fred Isaman <iisaman@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'include/linux/nfs_xdr.h')
-rw-r--r-- | include/linux/nfs_xdr.h | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index e34beaf86e9c..164862148ba0 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h | |||
@@ -1187,14 +1187,30 @@ struct nfs_read_data { | |||
1187 | struct nfs_client *ds_clp; /* pNFS data server */ | 1187 | struct nfs_client *ds_clp; /* pNFS data server */ |
1188 | }; | 1188 | }; |
1189 | 1189 | ||
1190 | /* used as flag bits in nfs_pgio_header */ | ||
1191 | enum { | ||
1192 | NFS_IOHDR_ERROR = 0, | ||
1193 | NFS_IOHDR_EOF, | ||
1194 | NFS_IOHDR_REDO, | ||
1195 | }; | ||
1196 | |||
1190 | struct nfs_pgio_header { | 1197 | struct nfs_pgio_header { |
1191 | struct inode *inode; | 1198 | struct inode *inode; |
1192 | struct rpc_cred *cred; | 1199 | struct rpc_cred *cred; |
1193 | struct list_head pages; | 1200 | struct list_head pages; |
1201 | struct list_head rpc_list; | ||
1202 | atomic_t refcnt; | ||
1194 | struct nfs_page *req; | 1203 | struct nfs_page *req; |
1195 | struct pnfs_layout_segment *lseg; | 1204 | struct pnfs_layout_segment *lseg; |
1205 | loff_t io_start; | ||
1196 | const struct rpc_call_ops *mds_ops; | 1206 | const struct rpc_call_ops *mds_ops; |
1207 | void (*release) (struct nfs_pgio_header *hdr); | ||
1208 | spinlock_t lock; | ||
1209 | /* fields protected by lock */ | ||
1197 | int pnfs_error; | 1210 | int pnfs_error; |
1211 | int error; /* merge with pnfs_error */ | ||
1212 | unsigned long good_bytes; /* boundary of good data */ | ||
1213 | unsigned long flags; | ||
1198 | }; | 1214 | }; |
1199 | 1215 | ||
1200 | struct nfs_read_header { | 1216 | struct nfs_read_header { |