Lines Matching defs:krdc

151 rdc_idev_open(rdc_k_info_t *krdc, char *pathname, int *rc)
168 dp->id_cache_dev.bi_krdc = krdc;
177 dp->id_raw_dev.bi_krdc = krdc;
209 rdc_idev_close(rdc_k_info_t *krdc, rdc_info_dev_t *dp)
226 ASSERT((krdc->c_ref + krdc->r_ref + krdc->b_ref) == 0);
241 * have to wait for it to spot that the krdc is !IS_ENABLED()
246 while (IS_CRSRV(krdc) || IS_RRSRV(krdc)) {
251 rdc_u_info[krdc->index].primary.file);
257 rdc_u_info[krdc->index].primary.file, (void *)krdc);
285 * if successful will populate krdc->maxfbas and urdc->volume_size
289 rdc_get_details(rdc_k_info_t *krdc)
292 rdc_u_info_t *urdc = &rdc_u_info[krdc->index];
295 if (_rdc_rsrv_devs(krdc, RDC_RAW, RDC_INTERNAL) == 0) {
302 rc = nsc_partsize(RDC_U_FD(krdc), &vol_size);
312 rc = nsc_maxfbas(RDC_U_FD(krdc), 0, &maxfbas);
320 krdc->maxfbas = min(RDC_MAX_MAXFBAS, maxfbas);
322 _rdc_rlse_devs(krdc, RDC_RAW);
334 rdc_k_info_t *krdc;
347 krdc = &rdc_k_info[index];
349 if (!IS_CONFIGURED(krdc))
361 if (krdc->devices && (krdc->c_fd || krdc->r_fd)) {
371 krdc->devices = rdc_idev_open(krdc, pathname, &rc);
372 if (!krdc->devices) {
381 rdc_get_details(krdc);
394 rdc_dev_close(rdc_k_info_t *krdc)
396 rdc_u_info_t *urdc = &rdc_u_info[krdc->index];
400 if (krdc->devices)
401 mutex_enter(&krdc->devices->id_rlock);
404 if (!krdc->devices || !krdc->c_fd || !krdc->r_fd) {
406 "!rdc_dev_close(%p): c_fd %p r_fd %p", (void *)krdc,
407 (void *) (krdc->devices ? krdc->c_fd : 0),
408 (void *) (krdc->devices ? krdc->r_fd : 0));
412 if (krdc->devices) {
414 rdc_idev_close(krdc, krdc->devices);
415 krdc->devices = NULL;
436 * For a 1-to-many primary we register for each krdc and let nsctl sort
438 * krdc will receive the incoming io from nsctl, though we do know that
439 * at any one time only one krdc will be 'attached' and so get io from
442 * So the krdc->many_next pointer is maintained as a circular list. The
446 * using a single krdc.
449 * rdc_fd_t's so that they can only point to krdc's that are currently
453 rdc_intercept(rdc_k_info_t *krdc)
455 rdc_u_info_t *urdc = &rdc_u_info[krdc->index];
467 if (!krdc->b_tok)
468 krdc->b_tok = nsc_register_path(bitmap, NSC_CACHE | NSC_DEVICE,
471 if (!krdc->c_tok)
472 krdc->c_tok = nsc_register_path(pathname, NSC_CACHE,
475 if (!krdc->r_tok)
476 krdc->r_tok = nsc_register_path(pathname, NSC_DEVICE,
479 if (!krdc->c_tok || !krdc->r_tok) {
480 (void) rdc_unintercept(krdc);
489 wait_unregistering(rdc_k_info_t *krdc)
491 while (krdc->group->unregistering > 0)
492 (void) cv_wait_sig(&krdc->group->unregistercv, &rdc_conf_lock);
496 set_unregistering(rdc_k_info_t *krdc)
498 wait_unregistering(krdc);
500 krdc->group->unregistering++;
504 wakeup_unregistering(rdc_k_info_t *krdc)
506 if (krdc->group->unregistering <= 0)
509 krdc->group->unregistering--;
510 cv_broadcast(&krdc->group->unregistercv);
522 rdc_unintercept(rdc_k_info_t *krdc)
526 rdc_u_info_t *urdc = &rdc_u_info[krdc->index];
529 set_unregistering(krdc);
530 krdc->type_flag |= RDC_UNREGISTER;
533 if (krdc->r_tok) {
534 rc = nsc_unregister_path(krdc->r_tok, 0);
539 krdc->r_tok = NULL;
542 if (krdc->c_tok) {
543 rc = nsc_unregister_path(krdc->c_tok, 0);
549 krdc->c_tok = NULL;
552 if (krdc->b_tok) {
553 rc = nsc_unregister_path(krdc->b_tok, 0);
558 krdc->b_tok = NULL;
561 rdc_group_enter(krdc);
564 while ((krdc->c_ref + krdc->r_ref + krdc->b_ref) != 0) {
565 krdc->closing++;
566 cv_wait(&krdc->closingcv, &krdc->group->lock);
567 krdc->closing--;
571 rdc_group_exit(krdc);
582 rdc_group_enter(krdc);
583 if (krdc->aux_state & RDC_AUXWRITE) {
584 rdc_group_exit(krdc);
591 rdc_group_exit(krdc);
597 krdc->type_flag &= ~RDC_UNREGISTER;
598 wakeup_unregistering(krdc);
612 _rdc_rlse_d(rdc_k_info_t *krdc, int devs)
618 if (!krdc) {
619 cmn_err(CE_WARN, "!rdc: _rdc_rlse_devs null krdc");
625 cip = &krdc->devices->id_cache_dev;
626 rip = &krdc->devices->id_raw_dev;
652 nsc_set_owner(cip->bi_fd, krdc->iodev);
686 nsc_set_owner(rip->bi_fd, krdc->iodev);
696 cv_broadcast(&krdc->devices->id_rcv);
699 cmn_err(CE_WARN, "!rdc: _rdc_rlse_devs no reserve? krdc %p",
700 (void *) krdc);
714 _rdc_rlse_devs(rdc_k_info_t *krdc, int devs)
718 mutex_enter(&krdc->devices->id_rlock);
723 _rdc_rlse_d(krdc, devs);
727 if (krdc->bmaprsrv > 0 && --krdc->bmaprsrv == 0) {
728 nsc_release(krdc->bitmapfd);
732 mutex_exit(&krdc->devices->id_rlock);
746 rdc_k_info_t *krdc)
749 rdc_u_info_t *urdc = &rdc_u_info[krdc->index];
771 cmn_err(CE_PANIC, "_rdc_rsrv_d: negative counts (krdc %p)",
772 (void *) krdc);
783 krdc->devices->id_release++;
785 cv_wait(&krdc->devices->id_rcv,
786 &krdc->devices->id_rlock);
787 krdc->devices->id_release--;
814 nsc_set_owner(p->bi_fd, krdc->iodev);
848 nsc_set_owner(p->bi_fd, krdc->iodev);
865 rdc_many_enter(krdc);
870 rdc_many_exit(krdc);
886 if (krdc->maxfbas == 0) {
893 krdc->maxfbas = 128;
913 _rdc_rsrv_devs(rdc_k_info_t *krdc, int devs, int flag)
915 rdc_u_info_t *urdc = &rdc_u_info[krdc->index];
920 if (!krdc) {
926 mutex_enter(&krdc->devices->id_rlock);
930 &krdc->devices->id_raw_dev, &krdc->devices->id_cache_dev,
931 flag, krdc)) != 0) {
942 nsc_pathname(krdc->c_fd), rc);
950 if (krdc->bitmapfd == NULL)
952 else if ((krdc->bmaprsrv == 0) &&
953 (rc = nsc_reserve(krdc->bitmapfd, 0)) != 0) {
955 nsc_pathname(krdc->bitmapfd), rc);
957 krdc->bmaprsrv++;
963 _rdc_rlse_d(krdc, got);
967 mutex_exit(&krdc->devices->id_rlock);
983 _rdc_remote_read(rdc_k_info_t *krdc, nsc_buf_t *h, nsc_off_t pos,
986 rdc_u_info_t *urdc = &rdc_u_info[krdc->index];
987 rdc_k_info_t *this = krdc; /* krdc that was requested */
1001 * this is not the slave krdc/urdc, then search for the slave
1006 rdc_many_enter(krdc);
1007 for (krdc = krdc->many_next; krdc != this;
1008 krdc = krdc->many_next) {
1009 urdc = &rdc_u_info[krdc->index];
1015 rdc_many_exit(krdc);
1017 this = krdc;
1031 while (krdc->group->ra_queue.blocks != 0) {
1032 if (!krdc->group->rdc_writer)
1033 (void) rdc_writer(krdc->index);
1035 (void) rdc_drain_queue(krdc->index);
1039 if (krdc->io_kstats) {
1040 mutex_enter(krdc->io_kstats->ks_lock);
1041 kstat_runq_enter(KSTAT_IO_PTR(krdc->io_kstats));
1042 mutex_exit(krdc->io_kstats->ks_lock);
1045 rc = rdc_net_read(krdc->index, krdc->remote_index, h, pos, len);
1047 if (krdc->io_kstats) {
1048 mutex_enter(krdc->io_kstats->ks_lock);
1049 kstat_runq_exit(KSTAT_IO_PTR(krdc->io_kstats));
1050 mutex_exit(krdc->io_kstats->ks_lock);
1055 if (!RDC_SUCCESS(rc) && IS_MANY(krdc) &&
1057 rdc_many_enter(krdc);
1058 for (krdc = krdc->many_next; krdc != this;
1059 krdc = krdc->many_next) {
1060 urdc = &rdc_u_info[krdc->index];
1063 rdc_many_exit(krdc);
1066 rdc_many_exit(krdc);
1089 rdc_k_info_t *krdc = rfd->rdc_info;
1090 rdc_u_info_t *urdc = &rdc_u_info[krdc->index];
1174 _rdc_async_throttle(krdc, len); /* throttle incoming io */
1181 if ((rdc_get_vflags(urdc) & RDC_VOL_FAILED) || IS_RFAILED(krdc)) {
1184 rc = nsc_alloc_buf(RDC_U_FD(krdc), pos, len,
1187 rdc_many_enter(krdc);
1197 rdc_many_exit(krdc);
1213 rc = _rdc_remote_read(krdc, &h->rdc_bufh,
1264 rc = _rdc_remote_read(krdc, &h->rdc_bufh,
1361 rdc_k_info_t *krdc;
1402 krdc = &rdc_k_info[index];
1406 rdc_group_enter(krdc);
1411 krdc->b_ref++;
1413 krdc->r_ref++;
1415 krdc->c_ref++;
1418 rfd->rdc_info = krdc;
1426 rdc_group_exit(krdc);
1462 rdc_k_info_t *krdc = rfd->rdc_info;
1469 * we may not even have a valid krdc at this point
1473 rdc_group_enter(krdc);
1476 krdc->b_ref--;
1478 krdc->r_ref--;
1480 krdc->c_ref--;
1483 if (krdc->closing) {
1484 cv_broadcast(&krdc->closingcv);
1487 rdc_group_exit(krdc);
1569 rdc_k_info_t *krdc;
1576 krdc = rfd->rdc_info;
1577 if (krdc == NULL)
1580 mutex_enter(&krdc->devices->id_rlock);
1581 krdc->iodev = iodev;
1582 mutex_exit(&krdc->devices->id_rlock);
1584 rc = _rdc_rsrv_devs(krdc, (raw ? RDC_RAW : RDC_CACHE), RDC_EXTERNAL);
1602 rdc_k_info_t *krdc = rfd->rdc_info;
1609 if (IS_ASYNC(&rdc_u_info[krdc->index]) && !RDC_IS_DISKQ(krdc->group)) {
1612 while (krdc->group->ra_queue.blocks != 0 && tries--) {
1613 if (!krdc->group->rdc_writer)
1614 (void) rdc_writer(krdc->index);
1616 (void) rdc_drain_queue(krdc->index);
1620 if (rdc_drain_queue(krdc->index) != 0) {
1622 net_queue *qp = &krdc->group->ra_queue;
1625 mutex_enter(&krdc->group->ra_queue.net_qlock);
1626 krdc->group->asyncdis = 1;
1627 cv_broadcast(&krdc->group->asyncqcv);
1628 mutex_exit(&krdc->group->ra_queue.net_qlock);
1632 rdc_u_info[krdc->index].primary.file);
1641 } while (krdc->group->rdc_thrnum > 0);
1645 mutex_enter(&krdc->devices->id_rlock);
1646 if (krdc->iodev != iodev)
1648 (void *) krdc->iodev, (void *) iodev);
1650 krdc->iodev = NULL;
1651 mutex_exit(&krdc->devices->id_rlock);
1653 _rdc_rlse_devs(krdc, (raw ? RDC_RAW : RDC_CACHE));
1710 rdc_k_info_t *krdc = rfd->rdc_info;
1715 if (krdc == NULL)
1718 rc = _rdc_rsrv_devs(krdc, rtype, RDC_INTERNAL);
1720 rc = nsc_maxfbas(RDC_U_FD(krdc), flag, ptr);
1721 _rdc_rlse_devs(krdc, rtype);
1725 ASSERT(krdc->maxfbas != 0);
1726 *ptr = krdc->maxfbas - 1;
1750 rdc_k_info_t *krdc;
1755 krdc = dip->bi_krdc;
1756 urdc = &rdc_u_info[krdc->index];
1771 rdc_many_enter(krdc);
1778 rdc_many_exit(krdc);
1792 krdc->maxfbas = min(RDC_MAX_MAXFBAS, maxfbas);
1836 rdc_k_info_t *krdc = h->rdc_fd->rdc_info;
1837 rdc_u_info_t *urdc = &rdc_u_info[krdc->index];
1864 rc2 = _rdc_remote_read(krdc, &h->rdc_bufh, pos, len, flag);
1877 _rdc_remote_write(rdc_k_info_t *krdc, rdc_buf_t *h, nsc_buf_t *nsc_h,
1880 rdc_u_info_t *urdc = &rdc_u_info[krdc->index];
1900 krdc->group->synccount > 0 ||
1906 rc = rdc_net_write(krdc->index, krdc->remote_index,
1915 mutex_enter(&krdc->syncbitmutex);
1917 syncblockpos = LOG_TO_FBA_NUM(krdc->syncbitpos);
1920 nsc_off_t, krdc->syncbitpos,
1935 RDC_CLR_BITMAP(krdc, pos, plen, bitmask,
1938 mutex_exit(&krdc->syncbitmutex);
1940 RDC_CLR_BITMAP(krdc, pos, len, bitmask,
1944 rdc_group_enter(krdc);
1949 krdc->disk_status = 1;
1950 rdc_group_exit(krdc);
1955 ASSERT(krdc->group->synccount == 0);
1959 rc = _rdc_enqueue_write(krdc, pos, len, flag, NULL);
1962 anon = rdc_aio_buf_get(h, krdc->index);
1971 rc = _rdc_enqueue_write(krdc, pos, len, flag,
1980 rdc_aio_buf_del(h, krdc);
1993 anon = rdc_aio_buf_get(h, krdc->index);
1996 rdc_aio_buf_del(h, krdc);
2012 rdc_k_info_t *krdc)
2014 rdc_u_info_t *urdc = &rdc_u_info[krdc->index];
2015 rdc_k_info_t *this = krdc; /* krdc that was requested */
2030 if (RDC_SET_BITMAP(krdc, pos, len, &bitmask) < 0) {
2035 if (IS_MANY(krdc) && IS_STATE(urdc, RDC_PRIMARY)) {
2036 rdc_many_enter(krdc);
2037 for (krdc = krdc->many_next; krdc != this;
2038 krdc = krdc->many_next) {
2039 urdc = &rdc_u_info[krdc->index];
2044 rdc_many_exit(krdc);
2046 } while (krdc != this);
2048 urdc = &rdc_u_info[krdc->index];
2061 rc = _rdc_remote_write(krdc, NULL, h, pos, len, flag, bitmask);
2069 if (IS_MANY(krdc) && (rdc_get_vflags(urdc) && RDC_PRIMARY)) {
2070 rdc_many_enter(krdc);
2071 for (krdc = krdc->many_next; krdc != this;
2072 krdc = krdc->many_next) {
2073 urdc = &rdc_u_info[krdc->index];
2077 rdc_many_exit(krdc);
2081 rdc_many_exit(krdc);
2091 rdc_k_info_t *krdc = &rdc_k_info[p->index];
2095 rc2 = rdc_diskq_enqueue(krdc, p);
2121 rdc_k_info_t *krdc = &rdc_k_info[p->index];
2128 rdc_group_enter(krdc);
2129 krdc->aux_state |= RDC_AUXWRITE;
2131 urdc = &rdc_u_info[krdc->index];
2138 rdc_group_exit(krdc);
2140 rc2 = _rdc_remote_write(krdc, h, &h->rdc_bufh, p->pos, p->len,
2153 rdc_group_enter(krdc);
2154 krdc->aux_state &= ~RDC_AUXWRITE;
2155 rdc_group_exit(krdc);
2176 rdc_k_info_t *krdc = h->rdc_fd->rdc_info;
2177 rdc_u_info_t *urdc = &rdc_u_info[krdc->index];
2194 if (IS_MULTI(krdc) && !IS_PRIMARY(urdc)) {
2195 multi = krdc;
2196 krdc = krdc->multi_next;
2197 urdc = &rdc_u_info[krdc->index];
2200 krdc = h->rdc_fd->rdc_info;
2201 urdc = &rdc_u_info[krdc->index];
2205 this = krdc;
2211 * this is not the slave krdc/urdc, then search for the slave
2216 rdc_many_enter(krdc);
2217 for (krdc = krdc->many_next; krdc != this;
2218 krdc = krdc->many_next) {
2219 urdc = &rdc_u_info[krdc->index];
2225 rdc_many_exit(krdc);
2227 this = krdc;
2230 urdc = &rdc_u_info[krdc->index];
2248 if (RDC_SET_BITMAP(krdc, pos, len, &bitmask) < 0) {
2257 if (IS_MANY(krdc) && IS_STATE(urdc, RDC_PRIMARY)) {
2258 rdc_many_enter(krdc);
2259 for (krdc = krdc->many_next; krdc != this;
2260 krdc = krdc->many_next) {
2261 urdc = &rdc_u_info[krdc->index];
2266 rdc_many_exit(krdc);
2269 } while (krdc != this);
2271 urdc = &rdc_u_info[krdc->index];
2289 if ((krdc->type_flag & RDC_DISABLEPEND) ||
2307 p = rdc_aio_buf_add(krdc->index, h);
2348 rdc_aio_buf_del(h, krdc);
2349 rdc_group_enter(krdc);
2350 rdc_group_log(krdc, RDC_FLUSH|RDC_OTHERREMOTE,
2352 rdc_group_exit(krdc);
2362 if (RDC_IS_DISKQ(krdc->group)) {
2372 anon = rdc_aio_buf_get(h, krdc->index);
2385 flag, krdc->index, bitmask);
2420 rdc_aio_buf_del(h, krdc);
2443 if (IS_MULTI(krdc)) {
2447 ktmp = krdc->multi_next;
2461 flag, krdc->index, bitmask);
2487 rdc_many_enter(krdc);
2496 rdc_many_exit(krdc);
2512 (BUF_IS_ASYNC(h) && !RDC_IS_DISKQ(krdc->group))) {
2514 if (IS_MULTI(krdc)) {
2518 ktmp = krdc->multi_next;
2526 rc2 = _rdc_remote_write(krdc, h, &h->rdc_bufh,
2543 if (IS_MANY(krdc) && (IS_PRIMARY(urdc))) {
2544 rdc_many_enter(krdc);
2545 for (krdc = krdc->many_next; krdc != this;
2546 krdc = krdc->many_next) {
2547 urdc = &rdc_u_info[krdc->index];
2552 rdc_many_exit(krdc);
2555 rdc_many_exit(krdc);
2557 urdc = &rdc_u_info[krdc->index];
2591 rdc_many_enter(krdc);
2594 rdc_many_exit(krdc);
2683 rdc_k_info_t *krdc = h->rdc_fd->rdc_info;
2684 rdc_u_info_t *urdc = &rdc_u_info[krdc->index];
2694 if (IS_MULTI(krdc) && !(rdc_get_vflags(urdc) & RDC_PRIMARY)) {
2695 multi = krdc;
2696 krdc = krdc->multi_next;
2697 urdc = &rdc_u_info[krdc->index];
2700 krdc = h->rdc_fd->rdc_info;
2701 urdc = &rdc_u_info[krdc->index];
2705 this = krdc;
2712 * this is not the slave krdc/urdc, then search for the slave
2717 rdc_many_enter(krdc);
2718 for (krdc = krdc->many_next; krdc != this;
2719 krdc = krdc->many_next) {
2720 urdc = &rdc_u_info[krdc->index];
2726 rdc_many_exit(krdc);
2728 this = krdc;
2744 if (RDC_SET_BITMAP(krdc, pos, len, &bitmask) < 0) {
2756 if ((krdc->type_flag & RDC_DISABLEPEND) ||
2758 mutex_exit(&krdc->group->ra_queue.net_qlock);
2764 mutex_exit(&krdc->group->ra_queue.net_qlock);
2768 mutex_exit(&krdc->group->ra_queue.net_qlock);
2771 p = rdc_aio_buf_add(krdc->index, h);
2805 rdc_aio_buf_del(h, krdc);
2806 rdc_group_enter(krdc);
2807 rdc_group_log(krdc, RDC_FLUSH | RDC_OTHERREMOTE,
2809 rdc_group_exit(krdc);
2825 rdc_many_enter(krdc);
2830 rdc_many_exit(krdc);
2846 if (IS_MULTI(krdc)) {
2850 ktmp = krdc->multi_next;
2856 rc2 = _rdc_remote_write(krdc, h, &h->rdc_bufh,
2869 if (IS_MANY(krdc) && (rdc_get_vflags(urdc) && RDC_PRIMARY)) {
2870 rdc_many_enter(krdc);
2871 for (krdc = krdc->many_next; krdc != this;
2872 krdc = krdc->many_next) {
2873 urdc = &rdc_u_info[krdc->index];
2877 rdc_many_exit(krdc);
2880 rdc_many_exit(krdc);
2887 rdc_many_enter(krdc);
2890 rdc_many_exit(krdc);