Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
fork

Configure Feed

Select the types of activity you want to include in your feed.

NFSv4.1: unify pnfs_pageio_init functions

Use common code for pnfs_pageio_init_{read,write} and use
a common generic pg_test function.

Note that this function always assumes the the layout driver's
pg_test method is implemented.

[Fix BUG]
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
Signed-off-by: Benny Halevy <bhalevy@panasas.com>

authored by

Benny Halevy and committed by
Boaz Harrosh
dfed206b a0fe8bf4

+29 -56
+2
fs/nfs/pagelist.c
··· 229 229 desc->pg_ioflags = io_flags; 230 230 desc->pg_error = 0; 231 231 desc->pg_lseg = NULL; 232 + desc->pg_test = NULL; 233 + pnfs_pageio_init(desc, inode); 232 234 } 233 235 234 236 /**
+17 -42
fs/nfs/pnfs.c
··· 1043 1043 goto out; 1044 1044 } 1045 1045 1046 - static int pnfs_read_pg_test(struct nfs_pageio_descriptor *pgio, 1047 - struct nfs_page *prev, 1048 - struct nfs_page *req) 1046 + int 1047 + pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, 1048 + struct nfs_page *req) 1049 1049 { 1050 + enum pnfs_iomode access_type; 1051 + gfp_t gfp_flags; 1052 + 1053 + /* We assume that pg_ioflags == 0 iff we're reading a page */ 1054 + if (pgio->pg_ioflags == 0) { 1055 + access_type = IOMODE_READ; 1056 + gfp_flags = GFP_KERNEL; 1057 + } else { 1058 + access_type = IOMODE_RW; 1059 + gfp_flags = GFP_NOFS; 1060 + } 1061 + 1050 1062 if (pgio->pg_count == prev->wb_bytes) { 1051 1063 /* This is first coelesce call for a series of nfs_pages */ 1052 1064 pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode, 1053 1065 prev->wb_context, 1054 1066 req_offset(req), 1055 1067 pgio->pg_count, 1056 - IOMODE_READ, 1057 - GFP_KERNEL); 1068 + access_type, 1069 + gfp_flags); 1058 1070 } else if (pgio->pg_lseg && 1059 1071 req_offset(req) > end_offset(pgio->pg_lseg->pls_range.offset, 1060 1072 pgio->pg_lseg->pls_range.length)) 1061 1073 return 0; 1062 1074 return NFS_SERVER(pgio->pg_inode)->pnfs_curr_ld->pg_test(pgio, prev, req); 1063 - } 1064 - 1065 - void 1066 - pnfs_pageio_init_read(struct nfs_pageio_descriptor *pgio, struct inode *inode) 1067 - { 1068 - struct pnfs_layoutdriver_type *ld; 1069 - 1070 - ld = NFS_SERVER(inode)->pnfs_curr_ld; 1071 - pgio->pg_test = (ld && ld->pg_test) ? pnfs_read_pg_test : NULL; 1072 - } 1073 - 1074 - static int pnfs_write_pg_test(struct nfs_pageio_descriptor *pgio, 1075 - struct nfs_page *prev, 1076 - struct nfs_page *req) 1077 - { 1078 - if (pgio->pg_count == prev->wb_bytes) { 1079 - /* This is first coelesce call for a series of nfs_pages */ 1080 - pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode, 1081 - prev->wb_context, 1082 - req_offset(req), 1083 - pgio->pg_count, 1084 - IOMODE_RW, 1085 - GFP_NOFS); 1086 - } else if (pgio->pg_lseg && 1087 - req_offset(req) > end_offset(pgio->pg_lseg->pls_range.offset, 1088 - pgio->pg_lseg->pls_range.length)) 1089 - return 0; 1090 - return NFS_SERVER(pgio->pg_inode)->pnfs_curr_ld->pg_test(pgio, prev, req); 1091 - } 1092 - 1093 - void 1094 - pnfs_pageio_init_write(struct nfs_pageio_descriptor *pgio, struct inode *inode) 1095 - { 1096 - struct pnfs_layoutdriver_type *ld; 1097 - 1098 - ld = NFS_SERVER(inode)->pnfs_curr_ld; 1099 - pgio->pg_test = (ld && ld->pg_test) ? pnfs_write_pg_test : NULL; 1100 1075 } 1101 1076 1102 1077 /*
+10 -11
fs/nfs/pnfs.h
··· 158 158 const struct rpc_call_ops *, int); 159 159 enum pnfs_try_status pnfs_try_to_read_data(struct nfs_read_data *, 160 160 const struct rpc_call_ops *); 161 - void pnfs_pageio_init_read(struct nfs_pageio_descriptor *, struct inode *); 162 - void pnfs_pageio_init_write(struct nfs_pageio_descriptor *, struct inode *); 161 + int pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, struct nfs_page *req); 163 162 int pnfs_layout_process(struct nfs4_layoutget *lgp); 164 163 void pnfs_free_lseg_list(struct list_head *tmp_list); 165 164 void pnfs_destroy_layout(struct nfs_inode *); ··· 292 293 return 0; 293 294 } 294 295 296 + static inline void pnfs_pageio_init(struct nfs_pageio_descriptor *pgio, 297 + struct inode *inode) 298 + { 299 + if (NFS_SERVER(inode)->pnfs_curr_ld) 300 + pgio->pg_test = pnfs_generic_pg_test; 301 + } 302 + 295 303 #else /* CONFIG_NFS_V4_1 */ 296 304 297 305 static inline void pnfs_destroy_all_layouts(struct nfs_client *clp) ··· 382 376 { 383 377 } 384 378 385 - static inline void 386 - pnfs_pageio_init_read(struct nfs_pageio_descriptor *pgio, struct inode *ino) 379 + static inline void pnfs_pageio_init(struct nfs_pageio_descriptor *pgio, 380 + struct inode *inode) 387 381 { 388 - pgio->pg_test = NULL; 389 - } 390 - 391 - static inline void 392 - pnfs_pageio_init_write(struct nfs_pageio_descriptor *pgio, struct inode *ino) 393 - { 394 - pgio->pg_test = NULL; 395 382 } 396 383 397 384 static inline void
-1
fs/nfs/read.c
··· 664 664 if (ret == 0) 665 665 goto read_complete; /* all pages were read */ 666 666 667 - pnfs_pageio_init_read(&pgio, inode); 668 667 if (rsize < PAGE_CACHE_SIZE) 669 668 nfs_pageio_init(&pgio, inode, nfs_pagein_multi, rsize, 0); 670 669 else
-2
fs/nfs/write.c
··· 1036 1036 { 1037 1037 size_t wsize = NFS_SERVER(inode)->wsize; 1038 1038 1039 - pnfs_pageio_init_write(pgio, inode); 1040 - 1041 1039 if (wsize < PAGE_CACHE_SIZE) 1042 1040 nfs_pageio_init(pgio, inode, nfs_flush_multi, wsize, ioflags); 1043 1041 else