Lines Matching refs:desc

73 nfs_pgio_get_mirror(struct nfs_pageio_descriptor *desc, u32 idx)
75 if (desc->pg_ops->pg_get_mirror)
76 return desc->pg_ops->pg_get_mirror(desc, idx);
77 return &desc->pg_mirrors[0];
81 nfs_pgio_current_mirror(struct nfs_pageio_descriptor *desc)
83 return nfs_pgio_get_mirror(desc, desc->pg_mirror_idx);
88 nfs_pgio_set_current_mirror(struct nfs_pageio_descriptor *desc, u32 idx)
90 if (desc->pg_ops->pg_set_mirror)
91 return desc->pg_ops->pg_set_mirror(desc, idx);
92 return desc->pg_mirror_idx;
95 void nfs_pgheader_init(struct nfs_pageio_descriptor *desc,
99 struct nfs_pgio_mirror *mirror = nfs_pgio_current_mirror(desc);
103 hdr->inode = desc->pg_inode;
107 hdr->io_completion = desc->pg_io_completion;
108 hdr->dreq = desc->pg_dreq;
109 nfs_netfs_set_pgio_header(hdr, desc);
111 hdr->completion_ops = desc->pg_completion_ops;
115 hdr->pgio_mirror_idx = desc->pg_mirror_idx;
718 * @desc: pointer to descriptor
719 * @prev: previous request in desc, or NULL
722 * Returns zero if @req cannot be coalesced into @desc, otherwise it returns
725 size_t nfs_generic_pg_test(struct nfs_pageio_descriptor *desc,
728 struct nfs_pgio_mirror *mirror = nfs_pgio_current_mirror(desc);
920 * @desc: pointer to descriptor
928 void nfs_pageio_init(struct nfs_pageio_descriptor *desc,
936 desc->pg_moreio = 0;
937 desc->pg_inode = inode;
938 desc->pg_ops = pg_ops;
939 desc->pg_completion_ops = compl_ops;
940 desc->pg_rw_ops = rw_ops;
941 desc->pg_ioflags = io_flags;
942 desc->pg_error = 0;
943 desc->pg_lseg = NULL;
944 desc->pg_io_completion = NULL;
945 desc->pg_dreq = NULL;
946 nfs_netfs_reset_pageio_descriptor(desc);
947 desc->pg_bsize = bsize;
949 desc->pg_mirror_count = 1;
950 desc->pg_mirror_idx = 0;
952 desc->pg_mirrors_dynamic = NULL;
953 desc->pg_mirrors = desc->pg_mirrors_static;
954 nfs_pageio_mirror_init(&desc->pg_mirrors[0], bsize);
955 desc->pg_maxretrans = 0;
984 int nfs_generic_pgio(struct nfs_pageio_descriptor *desc,
987 struct nfs_pgio_mirror *mirror = nfs_pgio_current_mirror(desc);
1009 desc->pg_error = -ENOMEM;
1010 return desc->pg_error;
1014 nfs_init_cinfo(&cinfo, desc->pg_inode, desc->pg_dreq);
1041 desc->pg_error = -EINVAL;
1042 return desc->pg_error;
1045 if ((desc->pg_ioflags & FLUSH_COND_STABLE) &&
1046 (desc->pg_moreio || nfs_reqs_to_commit(&cinfo)))
1047 desc->pg_ioflags &= ~FLUSH_COND_STABLE;
1050 nfs_pgio_rpcsetup(hdr, pg_base, mirror->pg_count, desc->pg_ioflags,
1052 desc->pg_rpc_callops = &nfs_pgio_common_ops;
1057 static int nfs_generic_pg_pgios(struct nfs_pageio_descriptor *desc)
1063 hdr = nfs_pgio_header_alloc(desc->pg_rw_ops);
1065 desc->pg_error = -ENOMEM;
1066 return desc->pg_error;
1068 nfs_pgheader_init(desc, hdr, nfs_pgio_header_free);
1069 ret = nfs_generic_pgio(desc, hdr);
1077 desc->pg_rpc_callops,
1078 desc->pg_ioflags,
1085 nfs_pageio_alloc_mirrors(struct nfs_pageio_descriptor *desc,
1091 kfree(desc->pg_mirrors_dynamic);
1092 desc->pg_mirrors_dynamic = NULL;
1094 return desc->pg_mirrors_static;
1098 nfs_pageio_mirror_init(&ret[i], desc->pg_bsize);
1099 desc->pg_mirrors_dynamic = ret;
1201 * @desc: destination io descriptor
1205 * of pages 'desc', it returns the size of req.
1208 nfs_pageio_do_add_request(struct nfs_pageio_descriptor *desc,
1211 struct nfs_pgio_mirror *mirror = nfs_pgio_current_mirror(desc);
1216 if (desc->pg_ops->pg_init)
1217 desc->pg_ops->pg_init(desc, req);
1218 if (desc->pg_error < 0)
1226 if (desc->pg_maxretrans && req->wb_nio > desc->pg_maxretrans) {
1227 if (NFS_SERVER(desc->pg_inode)->flags & NFS_MOUNT_SOFTERR)
1228 desc->pg_error = -ETIMEDOUT;
1230 desc->pg_error = -EIO;
1234 size = nfs_coalesce_size(prev, req, desc);
1245 static void nfs_pageio_doio(struct nfs_pageio_descriptor *desc)
1247 struct nfs_pgio_mirror *mirror = nfs_pgio_current_mirror(desc);
1250 int error = desc->pg_ops->pg_doio(desc);
1252 desc->pg_error = error;
1259 nfs_pageio_cleanup_request(struct nfs_pageio_descriptor *desc,
1265 desc->pg_completion_ops->error_cleanup(&head, desc->pg_error);
1270 * @desc: destination io descriptor
1278 * existing list of pages 'desc'.
1280 static int __nfs_pageio_add_request(struct nfs_pageio_descriptor *desc,
1283 struct nfs_pgio_mirror *mirror = nfs_pgio_current_mirror(desc);
1292 size = nfs_pageio_do_add_request(desc, subreq);
1306 nfs_pageio_cleanup_request(desc, subreq);
1314 desc->pg_moreio = 1;
1315 nfs_pageio_doio(desc);
1316 if (desc->pg_error < 0 || mirror->pg_recoalesce)
1332 desc->pg_error = PTR_ERR(subreq);
1337 static int nfs_do_recoalesce(struct nfs_pageio_descriptor *desc)
1339 struct nfs_pgio_mirror *mirror = nfs_pgio_current_mirror(desc);
1350 if (__nfs_pageio_add_request(desc, req))
1352 if (desc->pg_error < 0) {
1363 static int nfs_pageio_add_request_mirror(struct nfs_pageio_descriptor *desc,
1369 ret = __nfs_pageio_add_request(desc, req);
1372 if (desc->pg_error < 0)
1374 ret = nfs_do_recoalesce(desc);
1380 static void nfs_pageio_error_cleanup(struct nfs_pageio_descriptor *desc)
1385 if (!desc->pg_error)
1388 for (midx = 0; midx < desc->pg_mirror_count; midx++) {
1389 mirror = nfs_pgio_get_mirror(desc, midx);
1390 desc->pg_completion_ops->error_cleanup(&mirror->pg_list,
1391 desc->pg_error);
1395 int nfs_pageio_add_request(struct nfs_pageio_descriptor *desc,
1406 nfs_pageio_setup_mirroring(desc, req);
1407 if (desc->pg_error < 0)
1411 for (midx = 1; midx < desc->pg_mirror_count; midx++) {
1419 desc->pg_error = PTR_ERR(dupreq);
1423 nfs_pgio_set_current_mirror(desc, midx);
1424 if (!nfs_pageio_add_request_mirror(desc, dupreq))
1428 nfs_pgio_set_current_mirror(desc, 0);
1429 if (!nfs_pageio_add_request_mirror(desc, req))
1435 nfs_pageio_cleanup_request(desc, dupreq);
1437 nfs_pageio_error_cleanup(desc);
1444 * @desc: pointer to io descriptor
1447 static void nfs_pageio_complete_mirror(struct nfs_pageio_descriptor *desc,
1453 restore_idx = nfs_pgio_set_current_mirror(desc, mirror_idx);
1454 mirror = nfs_pgio_current_mirror(desc);
1457 nfs_pageio_doio(desc);
1458 if (desc->pg_error < 0 || !mirror->pg_recoalesce)
1460 if (!nfs_do_recoalesce(desc))
1463 nfs_pgio_set_current_mirror(desc, restore_idx);
1469 * @desc - the pageio descriptor to add requests to
1471 * Try to move each request (nfs_page) from @hdr to @desc then attempt
1476 int nfs_pageio_resend(struct nfs_pageio_descriptor *desc,
1481 desc->pg_io_completion = hdr->io_completion;
1482 desc->pg_dreq = hdr->dreq;
1483 nfs_netfs_set_pageio_descriptor(desc, hdr);
1488 if (!nfs_pageio_add_request(desc, req))
1491 nfs_pageio_complete(desc);
1493 int err = desc->pg_error < 0 ? desc->pg_error : -EIO;
1504 * @desc: pointer to io descriptor
1506 void nfs_pageio_complete(struct nfs_pageio_descriptor *desc)
1510 for (midx = 0; midx < desc->pg_mirror_count; midx++)
1511 nfs_pageio_complete_mirror(desc, midx);
1513 if (desc->pg_error < 0)
1514 nfs_pageio_error_cleanup(desc);
1515 if (desc->pg_ops->pg_cleanup)
1516 desc->pg_ops->pg_cleanup(desc);
1517 nfs_pageio_cleanup_mirroring(desc);
1522 * @desc: pointer to io descriptor
1529 * is not contiguous with the existing list of pages in 'desc'.
1531 void nfs_pageio_cond_complete(struct nfs_pageio_descriptor *desc, pgoff_t index)
1538 for (midx = 0; midx < desc->pg_mirror_count; midx++) {
1539 mirror = nfs_pgio_get_mirror(desc, midx);
1548 nfs_pageio_complete(desc);