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()
191 end = max_t(u64, pnfs_end_offset(err->offset, err->length), in extend_ds_error()
193 err->offset = min_t(u64, err->offset, offset); in extend_ds_error()
194 err->length = end - err->offset; in extend_ds_error()
203 if (e1->opnum != e2->opnum) in ff_ds_error_match()
204 return e1->opnum < e2->opnum ? -1 : 1; in ff_ds_error_match()
205 if (e1->status != e2->status) in ff_ds_error_match()
206 return e1->status < e2->status ? -1 : 1; in ff_ds_error_match()
207 ret = memcmp(e1->stateid.data, e2->stateid.data, in ff_ds_error_match()
208 sizeof(e1->stateid.data)); in ff_ds_error_match()
211 ret = memcmp(&e1->deviceid, &e2->deviceid, sizeof(e1->deviceid)); in ff_ds_error_match()
214 if (pnfs_end_offset(e1->offset, e1->length) < e2->offset) in ff_ds_error_match()
215 return -1; in ff_ds_error_match()
216 if (e1->offset > pnfs_end_offset(e2->offset, e2->length)) in ff_ds_error_match()
227 struct list_head *head = &flo->error_list; in ff_layout_add_ds_error_locked()
231 list_for_each_entry_safe(err, tmp, &flo->error_list, list) { in ff_layout_add_ds_error_locked()
237 head = &err->list; in ff_layout_add_ds_error_locked()
241 extend_ds_error(dserr, err->offset, err->length); in ff_layout_add_ds_error_locked()
242 list_replace(&err->list, &dserr->list); in ff_layout_add_ds_error_locked()
247 list_add_tail(&dserr->list, head); in ff_layout_add_ds_error_locked()
251 struct nfs4_ff_layout_mirror *mirror, u64 offset, in ff_layout_track_ds_error() argument
260 if (IS_ERR_OR_NULL(mirror->mirror_ds)) in ff_layout_track_ds_error()
261 return -EINVAL; in ff_layout_track_ds_error()
265 return -ENOMEM; in ff_layout_track_ds_error()
267 INIT_LIST_HEAD(&dserr->list); in ff_layout_track_ds_error()
268 dserr->offset = offset; in ff_layout_track_ds_error()
269 dserr->length = length; in ff_layout_track_ds_error()
270 dserr->status = status; in ff_layout_track_ds_error()
271 dserr->opnum = opnum; in ff_layout_track_ds_error()
272 nfs4_stateid_copy(&dserr->stateid, &mirror->stateid); in ff_layout_track_ds_error()
273 memcpy(&dserr->deviceid, &mirror->mirror_ds->id_node.deviceid, in ff_layout_track_ds_error()
276 spin_lock(&flo->generic_hdr.plh_inode->i_lock); in ff_layout_track_ds_error()
278 spin_unlock(&flo->generic_hdr.plh_inode->i_lock); in ff_layout_track_ds_error()
283 ff_layout_get_mirror_cred(struct nfs4_ff_layout_mirror *mirror, u32 iomode) in ff_layout_get_mirror_cred() argument
288 pcred = &mirror->ro_cred; in ff_layout_get_mirror_cred()
290 pcred = &mirror->rw_cred; in ff_layout_get_mirror_cred()
305 nfs4_ff_layout_select_ds_fh(struct nfs4_ff_layout_mirror *mirror) in nfs4_ff_layout_select_ds_fh() argument
308 return &mirror->fh_versions[0]; in nfs4_ff_layout_select_ds_fh()
312 nfs4_ff_layout_select_ds_stateid(const struct nfs4_ff_layout_mirror *mirror, in nfs4_ff_layout_select_ds_stateid() argument
315 if (nfs4_ff_layout_ds_version(mirror) == 4) in nfs4_ff_layout_select_ds_stateid()
316 nfs4_stateid_copy(stateid, &mirror->stateid); in nfs4_ff_layout_select_ds_stateid()
321 struct nfs4_ff_layout_mirror *mirror) in ff_layout_init_mirror_ds() argument
323 if (mirror == NULL) in ff_layout_init_mirror_ds()
325 if (mirror->mirror_ds == NULL) { in ff_layout_init_mirror_ds()
327 struct nfs4_ff_layout_ds *mirror_ds = ERR_PTR(-ENODEV); in ff_layout_init_mirror_ds()
329 node = nfs4_find_get_deviceid(NFS_SERVER(lo->plh_inode), in ff_layout_init_mirror_ds()
330 &mirror->devid, lo->plh_lc_cred, in ff_layout_init_mirror_ds()
336 if (cmpxchg(&mirror->mirror_ds, NULL, mirror_ds) && in ff_layout_init_mirror_ds()
337 mirror_ds != ERR_PTR(-ENODEV)) in ff_layout_init_mirror_ds()
341 if (IS_ERR(mirror->mirror_ds)) in ff_layout_init_mirror_ds()
350 * nfs4_ff_layout_prepare_ds - prepare a DS connection for an RPC call
352 * @mirror: layout mirror describing the DS to use
356 * selecting a mirror to use and connecting the client to it if it's not
359 * Since we only need a single functioning mirror to satisfy a read, we don't
361 * mirror should result in a LAYOUTRETURN. @fail_return is how we distinguish
368 struct nfs4_ff_layout_mirror *mirror, in nfs4_ff_layout_prepare_ds() argument
372 struct inode *ino = lseg->pls_layout->plh_inode; in nfs4_ff_layout_prepare_ds()
377 if (!ff_layout_init_mirror_ds(lseg->pls_layout, mirror)) in nfs4_ff_layout_prepare_ds()
380 ds = mirror->mirror_ds->ds; in nfs4_ff_layout_prepare_ds()
383 if (ds->ds_clp) in nfs4_ff_layout_prepare_ds()
389 status = nfs4_pnfs_ds_connect(s, ds, &mirror->mirror_ds->id_node, in nfs4_ff_layout_prepare_ds()
391 mirror->mirror_ds->ds_versions[0].version, in nfs4_ff_layout_prepare_ds()
392 mirror->mirror_ds->ds_versions[0].minor_version); in nfs4_ff_layout_prepare_ds()
397 nfs_block_size(rpc_max_payload(ds->ds_clp->cl_rpcclient), in nfs4_ff_layout_prepare_ds()
399 if (mirror->mirror_ds->ds_versions[0].rsize > max_payload) in nfs4_ff_layout_prepare_ds()
400 mirror->mirror_ds->ds_versions[0].rsize = max_payload; in nfs4_ff_layout_prepare_ds()
401 if (mirror->mirror_ds->ds_versions[0].wsize > max_payload) in nfs4_ff_layout_prepare_ds()
402 mirror->mirror_ds->ds_versions[0].wsize = max_payload; in nfs4_ff_layout_prepare_ds()
406 ff_layout_track_ds_error(FF_LAYOUT_FROM_HDR(lseg->pls_layout), in nfs4_ff_layout_prepare_ds()
407 mirror, lseg->pls_range.offset, in nfs4_ff_layout_prepare_ds()
408 lseg->pls_range.length, NFS4ERR_NXIO, in nfs4_ff_layout_prepare_ds()
419 ff_layout_get_ds_cred(struct nfs4_ff_layout_mirror *mirror, in ff_layout_get_ds_cred() argument
425 if (mirror && !mirror->mirror_ds->ds_versions[0].tightly_coupled) { in ff_layout_get_ds_cred()
426 cred = ff_layout_get_mirror_cred(mirror, range->iomode); in ff_layout_get_ds_cred()
436 * nfs4_ff_find_or_create_ds_client - Find or create a DS rpc client
437 * @mirror: pointer to the mirror
445 nfs4_ff_find_or_create_ds_client(struct nfs4_ff_layout_mirror *mirror, in nfs4_ff_find_or_create_ds_client() argument
448 switch (mirror->mirror_ds->ds_versions[0].version) { in nfs4_ff_find_or_create_ds_client()
451 return ds_clp->cl_rpcclient; in nfs4_ff_find_or_create_ds_client()
467 list_del(&err->list); in ff_layout_free_ds_ioerr()
486 return -ENOBUFS; in ff_layout_encode_ds_ioerr()
487 p = xdr_encode_hyper(p, err->offset); in ff_layout_encode_ds_ioerr()
488 p = xdr_encode_hyper(p, err->length); in ff_layout_encode_ds_ioerr()
489 p = xdr_encode_opaque_fixed(p, &err->stateid, in ff_layout_encode_ds_ioerr()
493 p = xdr_encode_opaque_fixed(p, &err->deviceid, in ff_layout_encode_ds_ioerr()
495 *p++ = cpu_to_be32(err->status); in ff_layout_encode_ds_ioerr()
496 *p++ = cpu_to_be32(err->opnum); in ff_layout_encode_ds_ioerr()
498 __func__, err->offset, err->length, err->status, in ff_layout_encode_ds_ioerr()
499 err->opnum); in ff_layout_encode_ds_ioerr()
512 struct inode *inode = lo->plh_inode; in do_layout_fetch_ds_ioerr()
516 spin_lock(&inode->i_lock); in do_layout_fetch_ds_ioerr()
517 list_for_each_entry_safe(err, n, &flo->error_list, list) { in do_layout_fetch_ds_ioerr()
518 if (!pnfs_is_range_intersecting(err->offset, in do_layout_fetch_ds_ioerr()
519 pnfs_end_offset(err->offset, err->length), in do_layout_fetch_ds_ioerr()
520 range->offset, in do_layout_fetch_ds_ioerr()
521 pnfs_end_offset(range->offset, range->length))) in do_layout_fetch_ds_ioerr()
525 list_move(&err->list, head); in do_layout_fetch_ds_ioerr()
526 maxnum--; in do_layout_fetch_ds_ioerr()
529 spin_unlock(&inode->i_lock); in do_layout_fetch_ds_ioerr()
544 do_layout_fetch_ds_ioerr(lo, range, &discard, -1); in ff_layout_fetch_ds_ioerr()
552 struct nfs4_ff_layout_mirror *mirror; in ff_read_layout_has_available_ds() local
557 mirror = FF_LAYOUT_COMP(lseg, idx); in ff_read_layout_has_available_ds()
558 if (mirror) { in ff_read_layout_has_available_ds()
559 if (!mirror->mirror_ds) in ff_read_layout_has_available_ds()
561 if (IS_ERR(mirror->mirror_ds)) in ff_read_layout_has_available_ds()
563 devid = &mirror->mirror_ds->id_node; in ff_read_layout_has_available_ds()
574 struct nfs4_ff_layout_mirror *mirror; in ff_rw_layout_has_available_ds() local
579 mirror = FF_LAYOUT_COMP(lseg, idx); in ff_rw_layout_has_available_ds()
580 if (!mirror || IS_ERR(mirror->mirror_ds)) in ff_rw_layout_has_available_ds()
582 if (!mirror->mirror_ds) in ff_rw_layout_has_available_ds()
584 devid = &mirror->mirror_ds->id_node; in ff_rw_layout_has_available_ds()
594 if (lseg->pls_range.iomode == IOMODE_READ) in ff_layout_has_available_ds()
608 return lseg->pls_range.iomode == IOMODE_RW && in ff_layout_avoid_read_on_rw()
619 " data server before it retries an NFS request.");