• Home
  • Raw
  • Download

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 */
55 int i, ret = -ENOMEM; in nfs4_ff_alloc_deviceid_node()
66 nfs4_init_deviceid_node(&new_ds->id_node, in nfs4_ff_alloc_deviceid_node()
68 &pdev->dev_id); in nfs4_ff_alloc_deviceid_node()
71 xdr_init_decode_pages(&stream, &buf, pdev->pages, pdev->pglen); in nfs4_ff_alloc_deviceid_node()
83 da = nfs4_decode_mp_ds_addr(server->nfs_client->cl_net, 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()
132 dprintk("%s: [%d] unsupported ds version %d-%d\n", __func__, in nfs4_ff_alloc_deviceid_node()
135 ret = -EPROTONOSUPPORT; in nfs4_ff_alloc_deviceid_node()
147 new_ds->ds_versions = ds_versions; in nfs4_ff_alloc_deviceid_node()
148 new_ds->ds_versions_cnt = version_count; in nfs4_ff_alloc_deviceid_node()
150 new_ds->ds = nfs4_pnfs_ds_add(&dsaddrs, gfp_flags); in nfs4_ff_alloc_deviceid_node()
151 if (!new_ds->ds) in nfs4_ff_alloc_deviceid_node()
159 list_del_init(&da->da_node); in nfs4_ff_alloc_deviceid_node()
160 kfree(da->da_remotestr); in nfs4_ff_alloc_deviceid_node()
171 list_del_init(&da->da_node); in nfs4_ff_alloc_deviceid_node()
172 kfree(da->da_remotestr); in nfs4_ff_alloc_deviceid_node()
189 nfs4_delete_deviceid(devid->ld, devid->nfs_client, &devid->deviceid); in ff_layout_mark_devid_invalid()
191 pnfs_error_mark_layout_for_return(lseg->pls_layout->plh_inode, in ff_layout_mark_devid_invalid()
196 struct nfs4_ff_layout_mirror *mirror, in ff_layout_mirror_valid() argument
199 if (mirror == NULL || IS_ERR(mirror->mirror_ds)) in ff_layout_mirror_valid()
201 if (mirror->mirror_ds == NULL) { in ff_layout_mirror_valid()
204 struct pnfs_layout_hdr *lh = lseg->pls_layout; in ff_layout_mirror_valid()
205 struct nfs4_ff_layout_ds *mirror_ds = ERR_PTR(-ENODEV); in ff_layout_mirror_valid()
207 node = nfs4_find_get_deviceid(NFS_SERVER(lh->plh_inode), in ff_layout_mirror_valid()
208 &mirror->devid, lh->plh_lc_cred, in ff_layout_mirror_valid()
214 if (cmpxchg(&mirror->mirror_ds, NULL, mirror_ds) && in ff_layout_mirror_valid()
215 mirror_ds != ERR_PTR(-ENODEV)) in ff_layout_mirror_valid()
221 if (IS_ERR(mirror->mirror_ds)) in ff_layout_mirror_valid()
224 if (mirror->mirror_ds->ds == NULL) { in ff_layout_mirror_valid()
226 devid = &mirror->mirror_ds->id_node; in ff_layout_mirror_valid()
232 pnfs_error_mark_layout_for_return(lseg->pls_layout->plh_inode, lseg); in ff_layout_mirror_valid()
241 end = max_t(u64, pnfs_end_offset(err->offset, err->length), in extend_ds_error()
243 err->offset = min_t(u64, err->offset, offset); in extend_ds_error()
244 err->length = end - err->offset; in extend_ds_error()
253 if (e1->opnum != e2->opnum) in ff_ds_error_match()
254 return e1->opnum < e2->opnum ? -1 : 1; in ff_ds_error_match()
255 if (e1->status != e2->status) in ff_ds_error_match()
256 return e1->status < e2->status ? -1 : 1; in ff_ds_error_match()
257 ret = memcmp(e1->stateid.data, e2->stateid.data, in ff_ds_error_match()
258 sizeof(e1->stateid.data)); in ff_ds_error_match()
261 ret = memcmp(&e1->deviceid, &e2->deviceid, sizeof(e1->deviceid)); in ff_ds_error_match()
264 if (pnfs_end_offset(e1->offset, e1->length) < e2->offset) in ff_ds_error_match()
265 return -1; in ff_ds_error_match()
266 if (e1->offset > pnfs_end_offset(e2->offset, e2->length)) in ff_ds_error_match()
277 struct list_head *head = &flo->error_list; in ff_layout_add_ds_error_locked()
281 list_for_each_entry_safe(err, tmp, &flo->error_list, list) { in ff_layout_add_ds_error_locked()
287 head = &err->list; in ff_layout_add_ds_error_locked()
291 extend_ds_error(dserr, err->offset, err->length); in ff_layout_add_ds_error_locked()
292 list_replace(&err->list, &dserr->list); in ff_layout_add_ds_error_locked()
297 list_add_tail(&dserr->list, head); in ff_layout_add_ds_error_locked()
301 struct nfs4_ff_layout_mirror *mirror, u64 offset, in ff_layout_track_ds_error() argument
310 if (IS_ERR_OR_NULL(mirror->mirror_ds)) in ff_layout_track_ds_error()
311 return -EINVAL; in ff_layout_track_ds_error()
315 return -ENOMEM; in ff_layout_track_ds_error()
317 INIT_LIST_HEAD(&dserr->list); in ff_layout_track_ds_error()
318 dserr->offset = offset; in ff_layout_track_ds_error()
319 dserr->length = length; in ff_layout_track_ds_error()
320 dserr->status = status; in ff_layout_track_ds_error()
321 dserr->opnum = opnum; in ff_layout_track_ds_error()
322 nfs4_stateid_copy(&dserr->stateid, &mirror->stateid); in ff_layout_track_ds_error()
323 memcpy(&dserr->deviceid, &mirror->mirror_ds->id_node.deviceid, in ff_layout_track_ds_error()
326 spin_lock(&flo->generic_hdr.plh_inode->i_lock); in ff_layout_track_ds_error()
328 spin_unlock(&flo->generic_hdr.plh_inode->i_lock); in ff_layout_track_ds_error()
334 ff_layout_get_mirror_cred(struct nfs4_ff_layout_mirror *mirror, u32 iomode) in ff_layout_get_mirror_cred() argument
339 pcred = &mirror->ro_cred; in ff_layout_get_mirror_cred()
341 pcred = &mirror->rw_cred; in ff_layout_get_mirror_cred()
358 struct nfs4_ff_layout_mirror *mirror = FF_LAYOUT_COMP(lseg, mirror_idx); in nfs4_ff_layout_select_ds_fh() local
361 if (!ff_layout_mirror_valid(lseg, mirror, false)) { in nfs4_ff_layout_select_ds_fh()
362 pr_err_ratelimited("NFS: %s: No data server for mirror offset index %d\n", in nfs4_ff_layout_select_ds_fh()
368 fh = &mirror->fh_versions[0]; in nfs4_ff_layout_select_ds_fh()
378 struct nfs4_ff_layout_mirror *mirror = FF_LAYOUT_COMP(lseg, mirror_idx); in nfs4_ff_layout_select_ds_stateid() local
380 if (!ff_layout_mirror_valid(lseg, mirror, false)) { in nfs4_ff_layout_select_ds_stateid()
381 pr_err_ratelimited("NFS: %s: No data server for mirror offset index %d\n", in nfs4_ff_layout_select_ds_stateid()
386 nfs4_stateid_copy(stateid, &mirror->stateid); in nfs4_ff_layout_select_ds_stateid()
393 * nfs4_ff_layout_prepare_ds - prepare a DS connection for an RPC call
399 * selecting a mirror to use and connecting the client to it if it's not
402 * Since we only need a single functioning mirror to satisfy a read, we don't
404 * mirror should result in a LAYOUTRETURN. @fail_return is how we distinguish
413 struct nfs4_ff_layout_mirror *mirror = FF_LAYOUT_COMP(lseg, ds_idx); in nfs4_ff_layout_prepare_ds() local
416 struct inode *ino = lseg->pls_layout->plh_inode; in nfs4_ff_layout_prepare_ds()
421 if (!ff_layout_mirror_valid(lseg, mirror, true)) { in nfs4_ff_layout_prepare_ds()
422 pr_err_ratelimited("NFS: %s: No data server for offset index %d\n", in nfs4_ff_layout_prepare_ds()
427 devid = &mirror->mirror_ds->id_node; in nfs4_ff_layout_prepare_ds()
431 ds = mirror->mirror_ds->ds; in nfs4_ff_layout_prepare_ds()
434 if (ds->ds_clp) in nfs4_ff_layout_prepare_ds()
442 mirror->mirror_ds->ds_versions[0].version, in nfs4_ff_layout_prepare_ds()
443 mirror->mirror_ds->ds_versions[0].minor_version); in nfs4_ff_layout_prepare_ds()
448 nfs_block_size(rpc_max_payload(ds->ds_clp->cl_rpcclient), in nfs4_ff_layout_prepare_ds()
450 if (mirror->mirror_ds->ds_versions[0].rsize > max_payload) in nfs4_ff_layout_prepare_ds()
451 mirror->mirror_ds->ds_versions[0].rsize = max_payload; in nfs4_ff_layout_prepare_ds()
452 if (mirror->mirror_ds->ds_versions[0].wsize > max_payload) in nfs4_ff_layout_prepare_ds()
453 mirror->mirror_ds->ds_versions[0].wsize = max_payload; in nfs4_ff_layout_prepare_ds()
457 ff_layout_track_ds_error(FF_LAYOUT_FROM_HDR(lseg->pls_layout), in nfs4_ff_layout_prepare_ds()
458 mirror, lseg->pls_range.offset, in nfs4_ff_layout_prepare_ds()
459 lseg->pls_range.length, NFS4ERR_NXIO, in nfs4_ff_layout_prepare_ds()
472 struct nfs4_ff_layout_mirror *mirror = FF_LAYOUT_COMP(lseg, ds_idx); in ff_layout_get_ds_cred() local
475 if (mirror) { in ff_layout_get_ds_cred()
476 cred = ff_layout_get_mirror_cred(mirror, lseg->pls_range.iomode); in ff_layout_get_ds_cred()
493 struct nfs4_ff_layout_mirror *mirror = FF_LAYOUT_COMP(lseg, ds_idx); in nfs4_ff_find_or_create_ds_client() local
495 switch (mirror->mirror_ds->ds_versions[0].version) { in nfs4_ff_find_or_create_ds_client()
498 return ds_clp->cl_rpcclient; in nfs4_ff_find_or_create_ds_client()
514 list_del(&err->list); in ff_layout_free_ds_ioerr()
533 return -ENOBUFS; in ff_layout_encode_ds_ioerr()
534 p = xdr_encode_hyper(p, err->offset); in ff_layout_encode_ds_ioerr()
535 p = xdr_encode_hyper(p, err->length); in ff_layout_encode_ds_ioerr()
536 p = xdr_encode_opaque_fixed(p, &err->stateid, in ff_layout_encode_ds_ioerr()
540 p = xdr_encode_opaque_fixed(p, &err->deviceid, in ff_layout_encode_ds_ioerr()
542 *p++ = cpu_to_be32(err->status); in ff_layout_encode_ds_ioerr()
543 *p++ = cpu_to_be32(err->opnum); in ff_layout_encode_ds_ioerr()
545 __func__, err->offset, err->length, err->status, in ff_layout_encode_ds_ioerr()
546 err->opnum); in ff_layout_encode_ds_ioerr()
559 struct inode *inode = lo->plh_inode; in do_layout_fetch_ds_ioerr()
563 spin_lock(&inode->i_lock); in do_layout_fetch_ds_ioerr()
564 list_for_each_entry_safe(err, n, &flo->error_list, list) { in do_layout_fetch_ds_ioerr()
565 if (!pnfs_is_range_intersecting(err->offset, in do_layout_fetch_ds_ioerr()
566 pnfs_end_offset(err->offset, err->length), in do_layout_fetch_ds_ioerr()
567 range->offset, in do_layout_fetch_ds_ioerr()
568 pnfs_end_offset(range->offset, range->length))) in do_layout_fetch_ds_ioerr()
572 list_move(&err->list, head); in do_layout_fetch_ds_ioerr()
573 maxnum--; in do_layout_fetch_ds_ioerr()
576 spin_unlock(&inode->i_lock); in do_layout_fetch_ds_ioerr()
591 do_layout_fetch_ds_ioerr(lo, range, &discard, -1); in ff_layout_fetch_ds_ioerr()
599 struct nfs4_ff_layout_mirror *mirror; in ff_read_layout_has_available_ds() local
604 mirror = FF_LAYOUT_COMP(lseg, idx); in ff_read_layout_has_available_ds()
605 if (mirror) { in ff_read_layout_has_available_ds()
606 if (!mirror->mirror_ds) in ff_read_layout_has_available_ds()
608 if (IS_ERR(mirror->mirror_ds)) in ff_read_layout_has_available_ds()
610 devid = &mirror->mirror_ds->id_node; in ff_read_layout_has_available_ds()
621 struct nfs4_ff_layout_mirror *mirror; in ff_rw_layout_has_available_ds() local
626 mirror = FF_LAYOUT_COMP(lseg, idx); in ff_rw_layout_has_available_ds()
627 if (!mirror || IS_ERR(mirror->mirror_ds)) in ff_rw_layout_has_available_ds()
629 if (!mirror->mirror_ds) in ff_rw_layout_has_available_ds()
631 devid = &mirror->mirror_ds->id_node; in ff_rw_layout_has_available_ds()
641 if (lseg->pls_range.iomode == IOMODE_READ) in ff_layout_has_available_ds()
655 return lseg->pls_range.iomode == IOMODE_RW && in ff_layout_avoid_read_on_rw()
666 " data server before it retries an NFS request.");