/* * resync raid */ int meta_raid_resync( mdsetname_t *sp, mdname_t *raidnp, daddr_t size, md_error_t *ep ) { char *miscname; md_resync_ioctl_t ri; /* should have a set */ assert(sp != NULL); assert(sp->setno == MD_MIN2SET(meta_getminor(raidnp->dev))); /* make sure we have a raid */ if ((miscname = metagetmiscname(raidnp, ep)) == NULL) return (-1); if (strcmp(miscname, MD_RAID) != 0) { return (mdmderror(ep, MDE_NOT_RAID, meta_getminor(raidnp->dev), raidnp->cname)); } /* start resync */ (void) memset(&ri, 0, sizeof (ri)); MD_SETDRIVERNAME(&ri, MD_RAID, sp->setno); ri.ri_mnum = meta_getminor(raidnp->dev); ri.ri_copysize = size; if (metaioctl(MD_IOCSETSYNC, &ri, &ri.mde, raidnp->cname) != 0) return (mdstealerror(ep, &ri.mde)); /* return success */ return (0); }
int md_probe_ioctl(mdnamelist_t *nlp, int ndevs, char *drvname, boolean_e verbose) { mdnamelist_t *p; mdname_t *np; md_probedev_t probe_ioc, *iocp; int i, retval = 0; /* * Allocate space for all the metadevices and fill in * the minor numbers. */ memset(&probe_ioc, 0, sizeof (probe_ioc)); iocp = &probe_ioc; if ((iocp->mnum_list = (uintptr_t)calloc(ndevs, sizeof (minor_t))) == 0) { monitord_print(0, "md_probe_ioctl: calloc"); return (-1); } (void) strcpy(iocp->test_name, MD_PROBE_OPEN_T); MD_SETDRIVERNAME(&probe_ioc, drvname, sp->setno); if (verbose == True) { monitord_print(6, "\n\nmd_probe_ioctl: %s: %s\n", (strcmp(sp->setname, MD_LOCAL_NAME) == 0) ? gettext("local_set") : sp->setname, iocp->md_driver.md_drivername); } iocp->nmdevs = ndevs; if (verbose == True) monitord_print(6, "...ndevs 0x%x\n", ndevs); for (p = nlp, i = 0; p; p = p->next, i++) { np = p->namep; ((minor_t *)(uintptr_t)iocp->mnum_list)[i] = meta_getminor(np->dev); if (verbose == True) monitord_print(6, "...%s 0x%lx\n", np->cname, ((minor_t *)(uintptr_t)iocp->mnum_list)[i]); } if (issue_ioctl == True) { if (metaioctl(MD_IOCPROBE_DEV, iocp, &(iocp->mde), NULL) != 0) retval = -1; } return (retval); }
/* * grow generic device */ int meta_concat_generic( mdsetname_t *sp, mdname_t *namep, u_longlong_t big_or_little, md_error_t *ep ) { md_grow_params_t mgp; char *miscname; /* should have a set */ assert(sp != NULL); assert(sp->setno == MD_MIN2SET(meta_getminor(namep->dev))); /* get type */ if ((miscname = metagetmiscname(namep, ep)) == NULL) return (-1); /* grow device */ (void) memset(&mgp, 0, sizeof (mgp)); if (big_or_little & MD_64BIT_META_DEV) mgp.options = MD_CRO_64BIT; else mgp.options = MD_CRO_32BIT; mgp.mnum = meta_getminor(namep->dev); MD_SETDRIVERNAME(&mgp, miscname, sp->setno); if (metaioctl(MD_IOCGROW, &mgp, &mgp.mde, namep->cname) != 0) return (mdstealerror(ep, &mgp.mde)); /* clear cache */ meta_invalidate_name(namep); /* return success */ return (0); }