Lines Matching +full:data +full:- +full:mirror
1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (c) 2014, Primary Data, Inc. All rights reserved.
29 nfs4_put_deviceid_node(&mirror_ds->id_node); in nfs4_ff_layout_put_deviceid()
34 nfs4_print_deviceid(&mirror_ds->id_node.deviceid); in nfs4_ff_layout_free_deviceid()
35 nfs4_pnfs_ds_put(mirror_ds->ds); in nfs4_ff_layout_free_deviceid()
36 kfree(mirror_ds->ds_versions); in nfs4_ff_layout_free_deviceid()
40 /* Decode opaque device data and construct new_ds using it */
52 struct net *net = server->nfs_client->cl_net; in nfs4_ff_alloc_deviceid_node()
56 int i, ret = -ENOMEM; in nfs4_ff_alloc_deviceid_node()
67 nfs4_init_deviceid_node(&new_ds->id_node, in nfs4_ff_alloc_deviceid_node()
69 &pdev->dev_id); in nfs4_ff_alloc_deviceid_node()
72 xdr_init_decode_pages(&stream, &buf, pdev->pages, pdev->pglen); in nfs4_ff_alloc_deviceid_node()
86 list_add_tail(&da->da_node, &dsaddrs); in nfs4_ff_alloc_deviceid_node()
91 ret = -ENOMEDIUM; in nfs4_ff_alloc_deviceid_node()
117 server->nfs_client->cl_proto); in nfs4_ff_alloc_deviceid_node()
119 server->nfs_client->cl_proto); in nfs4_ff_alloc_deviceid_node()
134 dprintk("%s: [%d] unsupported ds version %d-%d\n", __func__, in nfs4_ff_alloc_deviceid_node()
137 ret = -EPROTONOSUPPORT; in nfs4_ff_alloc_deviceid_node()
149 new_ds->ds_versions = ds_versions; in nfs4_ff_alloc_deviceid_node()
150 new_ds->ds_versions_cnt = version_count; in nfs4_ff_alloc_deviceid_node()
152 new_ds->ds = nfs4_pnfs_ds_add(net, &dsaddrs, gfp_flags); in nfs4_ff_alloc_deviceid_node()
153 if (!new_ds->ds) in nfs4_ff_alloc_deviceid_node()
161 list_del_init(&da->da_node); in nfs4_ff_alloc_deviceid_node()
162 kfree(da->da_remotestr); in nfs4_ff_alloc_deviceid_node()
173 list_del_init(&da->da_node); in nfs4_ff_alloc_deviceid_node()
174 kfree(da->da_remotestr); in nfs4_ff_alloc_deviceid_node()
193 end = max_t(u64, pnfs_end_offset(err->offset, err->length), in extend_ds_error()
195 err->offset = min_t(u64, err->offset, offset); in extend_ds_error()
196 err->length = end - err->offset; in extend_ds_error()
205 if (e1->opnum != e2->opnum) in ff_ds_error_match()
206 return e1->opnum < e2->opnum ? -1 : 1; in ff_ds_error_match()
207 if (e1->status != e2->status) in ff_ds_error_match()
208 return e1->status < e2->status ? -1 : 1; in ff_ds_error_match()
209 ret = memcmp(e1->stateid.data, e2->stateid.data, in ff_ds_error_match()
210 sizeof(e1->stateid.data)); in ff_ds_error_match()
213 ret = memcmp(&e1->deviceid, &e2->deviceid, sizeof(e1->deviceid)); in ff_ds_error_match()
216 if (pnfs_end_offset(e1->offset, e1->length) < e2->offset) in ff_ds_error_match()
217 return -1; in ff_ds_error_match()
218 if (e1->offset > pnfs_end_offset(e2->offset, e2->length)) in ff_ds_error_match()
229 struct list_head *head = &flo->error_list; in ff_layout_add_ds_error_locked()
233 list_for_each_entry_safe(err, tmp, &flo->error_list, list) { in ff_layout_add_ds_error_locked()
239 head = &err->list; in ff_layout_add_ds_error_locked()
243 extend_ds_error(dserr, err->offset, err->length); in ff_layout_add_ds_error_locked()
244 list_replace(&err->list, &dserr->list); in ff_layout_add_ds_error_locked()
249 list_add_tail(&dserr->list, head); in ff_layout_add_ds_error_locked()
253 struct nfs4_ff_layout_mirror *mirror, in ff_layout_track_ds_error() argument
262 if (IS_ERR_OR_NULL(mirror->dss[dss_id].mirror_ds)) in ff_layout_track_ds_error()
263 return -EINVAL; in ff_layout_track_ds_error()
267 return -ENOMEM; in ff_layout_track_ds_error()
269 INIT_LIST_HEAD(&dserr->list); in ff_layout_track_ds_error()
270 dserr->offset = offset; in ff_layout_track_ds_error()
271 dserr->length = length; in ff_layout_track_ds_error()
272 dserr->status = status; in ff_layout_track_ds_error()
273 dserr->opnum = opnum; in ff_layout_track_ds_error()
274 nfs4_stateid_copy(&dserr->stateid, &mirror->dss[dss_id].stateid); in ff_layout_track_ds_error()
275 memcpy(&dserr->deviceid, &mirror->dss[dss_id].mirror_ds->id_node.deviceid, in ff_layout_track_ds_error()
278 spin_lock(&flo->generic_hdr.plh_inode->i_lock); in ff_layout_track_ds_error()
280 spin_unlock(&flo->generic_hdr.plh_inode->i_lock); in ff_layout_track_ds_error()
285 ff_layout_get_mirror_cred(struct nfs4_ff_layout_mirror *mirror, u32 iomode, u32 dss_id) in ff_layout_get_mirror_cred() argument
290 pcred = &mirror->dss[dss_id].ro_cred; in ff_layout_get_mirror_cred()
292 pcred = &mirror->dss[dss_id].rw_cred; in ff_layout_get_mirror_cred()
307 nfs4_ff_layout_select_ds_fh(struct nfs4_ff_layout_mirror *mirror, u32 dss_id) in nfs4_ff_layout_select_ds_fh() argument
310 return &mirror->dss[dss_id].fh_versions[0]; in nfs4_ff_layout_select_ds_fh()
314 nfs4_ff_layout_select_ds_stateid(const struct nfs4_ff_layout_mirror *mirror, in nfs4_ff_layout_select_ds_stateid() argument
318 if (nfs4_ff_layout_ds_version(mirror, dss_id) == 4) in nfs4_ff_layout_select_ds_stateid()
319 nfs4_stateid_copy(stateid, &mirror->dss[dss_id].stateid); in nfs4_ff_layout_select_ds_stateid()
324 struct nfs4_ff_layout_mirror *mirror, in ff_layout_init_mirror_ds() argument
327 if (mirror == NULL) in ff_layout_init_mirror_ds()
329 if (mirror->dss[dss_id].mirror_ds == NULL) { in ff_layout_init_mirror_ds()
331 struct nfs4_ff_layout_ds *mirror_ds = ERR_PTR(-ENODEV); in ff_layout_init_mirror_ds()
333 node = nfs4_find_get_deviceid(NFS_SERVER(lo->plh_inode), in ff_layout_init_mirror_ds()
334 &mirror->dss[dss_id].devid, lo->plh_lc_cred, in ff_layout_init_mirror_ds()
340 if (cmpxchg(&mirror->dss[dss_id].mirror_ds, NULL, mirror_ds) && in ff_layout_init_mirror_ds()
341 mirror_ds != ERR_PTR(-ENODEV)) in ff_layout_init_mirror_ds()
345 if (IS_ERR(mirror->dss[dss_id].mirror_ds)) in ff_layout_init_mirror_ds()
354 * nfs4_ff_layout_prepare_ds - prepare a DS connection for an RPC call
356 * @mirror: layout mirror describing the DS to use
361 * selecting a mirror to use and connecting the client to it if it's not
364 * Since we only need a single functioning mirror to satisfy a read, we don't
366 * mirror should result in a LAYOUTRETURN. @fail_return is how we distinguish
373 struct nfs4_ff_layout_mirror *mirror, in nfs4_ff_layout_prepare_ds() argument
378 struct inode *ino = lseg->pls_layout->plh_inode; in nfs4_ff_layout_prepare_ds()
381 int status = -EAGAIN; in nfs4_ff_layout_prepare_ds()
383 if (!ff_layout_init_mirror_ds(lseg->pls_layout, mirror, dss_id)) in nfs4_ff_layout_prepare_ds()
386 ds = mirror->dss[dss_id].mirror_ds->ds; in nfs4_ff_layout_prepare_ds()
387 if (READ_ONCE(ds->ds_clp)) in nfs4_ff_layout_prepare_ds()
395 status = nfs4_pnfs_ds_connect(s, ds, &mirror->dss[dss_id].mirror_ds->id_node, in nfs4_ff_layout_prepare_ds()
397 mirror->dss[dss_id].mirror_ds->ds_versions[0].version, in nfs4_ff_layout_prepare_ds()
398 mirror->dss[dss_id].mirror_ds->ds_versions[0].minor_version); in nfs4_ff_layout_prepare_ds()
407 nfs_local_probe_async(ds->ds_clp); in nfs4_ff_layout_prepare_ds()
409 nfs_block_size(rpc_max_payload(ds->ds_clp->cl_rpcclient), in nfs4_ff_layout_prepare_ds()
411 if (mirror->dss[dss_id].mirror_ds->ds_versions[0].rsize > max_payload) in nfs4_ff_layout_prepare_ds()
412 mirror->dss[dss_id].mirror_ds->ds_versions[0].rsize = max_payload; in nfs4_ff_layout_prepare_ds()
413 if (mirror->dss[dss_id].mirror_ds->ds_versions[0].wsize > max_payload) in nfs4_ff_layout_prepare_ds()
414 mirror->dss[dss_id].mirror_ds->ds_versions[0].wsize = max_payload; in nfs4_ff_layout_prepare_ds()
418 ff_layout_track_ds_error(FF_LAYOUT_FROM_HDR(lseg->pls_layout), in nfs4_ff_layout_prepare_ds()
419 mirror, dss_id, lseg->pls_range.offset, in nfs4_ff_layout_prepare_ds()
420 lseg->pls_range.length, NFS4ERR_NXIO, in nfs4_ff_layout_prepare_ds()
431 ff_layout_get_ds_cred(struct nfs4_ff_layout_mirror *mirror, in ff_layout_get_ds_cred() argument
438 if (mirror && !mirror->dss[dss_id].mirror_ds->ds_versions[0].tightly_coupled) { in ff_layout_get_ds_cred()
439 cred = ff_layout_get_mirror_cred(mirror, range->iomode, dss_id); in ff_layout_get_ds_cred()
449 * nfs4_ff_find_or_create_ds_client - Find or create a DS rpc client
450 * @mirror: pointer to the mirror
459 nfs4_ff_find_or_create_ds_client(struct nfs4_ff_layout_mirror *mirror, in nfs4_ff_find_or_create_ds_client() argument
463 switch (mirror->dss[dss_id].mirror_ds->ds_versions[0].version) { in nfs4_ff_find_or_create_ds_client()
466 return ds_clp->cl_rpcclient; in nfs4_ff_find_or_create_ds_client()
482 list_del(&err->list); in ff_layout_free_ds_ioerr()
501 return -ENOBUFS; in ff_layout_encode_ds_ioerr()
502 p = xdr_encode_hyper(p, err->offset); in ff_layout_encode_ds_ioerr()
503 p = xdr_encode_hyper(p, err->length); in ff_layout_encode_ds_ioerr()
504 p = xdr_encode_opaque_fixed(p, &err->stateid, in ff_layout_encode_ds_ioerr()
508 p = xdr_encode_opaque_fixed(p, &err->deviceid, in ff_layout_encode_ds_ioerr()
510 *p++ = cpu_to_be32(err->status); in ff_layout_encode_ds_ioerr()
511 *p++ = cpu_to_be32(err->opnum); in ff_layout_encode_ds_ioerr()
513 __func__, err->offset, err->length, err->status, in ff_layout_encode_ds_ioerr()
514 err->opnum); in ff_layout_encode_ds_ioerr()
527 struct inode *inode = lo->plh_inode; in do_layout_fetch_ds_ioerr()
531 spin_lock(&inode->i_lock); in do_layout_fetch_ds_ioerr()
532 list_for_each_entry_safe(err, n, &flo->error_list, list) { in do_layout_fetch_ds_ioerr()
533 if (!pnfs_is_range_intersecting(err->offset, in do_layout_fetch_ds_ioerr()
534 pnfs_end_offset(err->offset, err->length), in do_layout_fetch_ds_ioerr()
535 range->offset, in do_layout_fetch_ds_ioerr()
536 pnfs_end_offset(range->offset, range->length))) in do_layout_fetch_ds_ioerr()
540 list_move(&err->list, head); in do_layout_fetch_ds_ioerr()
541 maxnum--; in do_layout_fetch_ds_ioerr()
544 spin_unlock(&inode->i_lock); in do_layout_fetch_ds_ioerr()
559 do_layout_fetch_ds_ioerr(lo, range, &discard, -1); in ff_layout_fetch_ds_ioerr()
567 struct nfs4_ff_layout_mirror *mirror; in ff_read_layout_has_available_ds() local
572 mirror = FF_LAYOUT_COMP(lseg, idx); in ff_read_layout_has_available_ds()
573 if (!mirror) in ff_read_layout_has_available_ds()
575 for (dss_id = 0; dss_id < mirror->dss_count; dss_id++) { in ff_read_layout_has_available_ds()
576 if (!mirror->dss[dss_id].mirror_ds) in ff_read_layout_has_available_ds()
578 if (IS_ERR(mirror->dss[dss_id].mirror_ds)) in ff_read_layout_has_available_ds()
580 devid = &mirror->dss[dss_id].mirror_ds->id_node; in ff_read_layout_has_available_ds()
591 struct nfs4_ff_layout_mirror *mirror; in ff_rw_layout_has_available_ds() local
596 mirror = FF_LAYOUT_COMP(lseg, idx); in ff_rw_layout_has_available_ds()
597 if (!mirror) in ff_rw_layout_has_available_ds()
599 for (dss_id = 0; dss_id < mirror->dss_count; dss_id++) { in ff_rw_layout_has_available_ds()
600 if (IS_ERR(mirror->dss[dss_id].mirror_ds)) in ff_rw_layout_has_available_ds()
602 if (!mirror->dss[dss_id].mirror_ds) in ff_rw_layout_has_available_ds()
604 devid = &mirror->dss[dss_id].mirror_ds->id_node; in ff_rw_layout_has_available_ds()
615 if (lseg->pls_range.iomode == IOMODE_READ) in ff_layout_has_available_ds()
629 return lseg->pls_range.iomode == IOMODE_RW && in ff_layout_avoid_read_on_rw()
640 " data server before it retries an NFS request.");