diff options
-rw-r--r-- | usr/src/cmd/lvm/rpc.mdcommd/mdcomm.xml | 1 | ||||
-rw-r--r-- | usr/src/cmd/lvm/rpc.mdcommd/mdmn_commd_server.c | 15 | ||||
-rw-r--r-- | usr/src/lib/lvm/libmeta/common/meta_check.c | 80 | ||||
-rw-r--r-- | usr/src/lib/lvm/libmeta/common/meta_name.c | 317 | ||||
-rw-r--r-- | usr/src/uts/common/io/lvm/mirror/mirror_ioctl.c | 60 | ||||
-rw-r--r-- | usr/src/uts/common/io/lvm/raid/raid_ioctl.c | 56 | ||||
-rw-r--r-- | usr/src/uts/common/io/lvm/softpart/sp_ioctl.c | 54 | ||||
-rw-r--r-- | usr/src/uts/common/io/lvm/stripe/stripe_ioctl.c | 56 | ||||
-rw-r--r-- | usr/src/uts/common/io/lvm/trans/trans_ioctl.c | 55 |
9 files changed, 394 insertions, 300 deletions
diff --git a/usr/src/cmd/lvm/rpc.mdcommd/mdcomm.xml b/usr/src/cmd/lvm/rpc.mdcommd/mdcomm.xml index 49750cf02f..1062e4674b 100644 --- a/usr/src/cmd/lvm/rpc.mdcommd/mdcomm.xml +++ b/usr/src/cmd/lvm/rpc.mdcommd/mdcomm.xml @@ -83,6 +83,7 @@ <propval name='rpc_low_version' type='integer' value='2' /> <propval name='rpc_high_version' type='integer' value='2' /> <propval name='proto' type='astring' value='tcp' /> + <propval name='connection_backlog' type='integer' value='32' /> </property_group> <property_group name='firewall_config' type='com.sun,fw_configuration'> diff --git a/usr/src/cmd/lvm/rpc.mdcommd/mdmn_commd_server.c b/usr/src/cmd/lvm/rpc.mdcommd/mdmn_commd_server.c index 9fda15beec..54c530dc67 100644 --- a/usr/src/cmd/lvm/rpc.mdcommd/mdmn_commd_server.c +++ b/usr/src/cmd/lvm/rpc.mdcommd/mdmn_commd_server.c @@ -20,7 +20,7 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -3099,12 +3099,23 @@ mdmn_comm_reinit_set_svc_2(set_t *setnop, struct svc_req *rqstp) /* destroy all rpc clients from this set */ for (node = set_descriptor[setno]->sd_nodelist; node; node = node->nd_next) { + /* + * Since the CLIENT for ourself will be recreated + * shortly, and this node is guaranteed to be + * there after a reconfig, there's no reason to go + * through destroying it. It also avoids an issue + * with calling clnt_create() later from within the + * server thread, which can effectively deadlock + * itself due to RPC design limitations. + */ + if (node == set_descriptor[setno]->sd_mn_mynode) + continue; mdmn_clnt_destroy(client[setno][node->nd_nodeid]); if (client[setno][node->nd_nodeid] != (CLIENT *)NULL) { client[setno][node->nd_nodeid] = (CLIENT *)NULL; } } - md_mn_set_inited[setno] &= ~MDMN_SET_NODES; + md_mn_set_inited[setno] &= ~MDMN_SET_NODES; } commd_debug(MD_MMV_MISC, "reinit: done init_set(%d)\n", setno); diff --git a/usr/src/lib/lvm/libmeta/common/meta_check.c b/usr/src/lib/lvm/libmeta/common/meta_check.c index 45a7d39b33..8b32ed4c8e 100644 --- a/usr/src/lib/lvm/libmeta/common/meta_check.c +++ b/usr/src/lib/lvm/libmeta/common/meta_check.c @@ -18,13 +18,12 @@ * * CDDL HEADER END */ + /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - /* * Just in case we're not in a build environment, make sure that * TEXT_DOMAIN gets set to something. @@ -42,8 +41,6 @@ #include <sys/mnttab.h> #include <sys/swap.h> - -#include "meta_lib_prv.h" #include <devid.h> #include <sys/dumpadm.h> @@ -64,6 +61,24 @@ typedef struct dev_list { static dev_list_t *devnamelist = NULL; +static char *skip_these_mntents[] = { + "nfs", + "autofs", + "proc", + "tmpfs", + "cachefs", + "rfs", + "fd", + "mntfs", + "lofs", + "devfs", + "dev", + "ctfs", + "objfs", + "sharefs", + NULL +}; + /* * free swap info */ @@ -163,7 +178,7 @@ meta_check_swapped( snp, 0, -1, ep); if (rval != 0) { (void) mdoverlaperror(ep, MDE_OVERLAP_SWAP, - np->cname, NULL, snp->cname); + np->cname, NULL, snp->cname); } } } @@ -251,7 +266,7 @@ meta_check_dump( dump_np, 0, -1, ep); if (rval != 0) { (void) mdoverlaperror(ep, MDE_OVERLAP_DUMP, - np->cname, NULL, dump_np->cname); + np->cname, NULL, dump_np->cname); } } } @@ -282,6 +297,8 @@ meta_check_mounted( if ((mfp = open_mnttab()) == NULL) return (mdsyserror(ep, errno, MNTTAB)); while ((getmntent(mfp, &m) == 0) && (rval == 0)) { + char **fstype = skip_these_mntents; + int skipit = 0; mdname_t *mnp; if ((m.mnt_special == NULL) || (m.mnt_mountp == NULL)) @@ -290,16 +307,13 @@ meta_check_mounted( if (m.mnt_mountp[0] != '/') continue; - if ((strcmp(m.mnt_fstype, "nfs") == 0) || - (strcmp(m.mnt_fstype, "autofs") == 0) || - (strcmp(m.mnt_fstype, "proc") == 0) || - (strcmp(m.mnt_fstype, "tmpfs") == 0) || - (strcmp(m.mnt_fstype, "cachefs") == 0) || - (strcmp(m.mnt_fstype, "lofs") == 0) || - (strcmp(m.mnt_fstype, "rfs") == 0) || - (strcmp(m.mnt_fstype, "fd") == 0) || - (strcmp(m.mnt_fstype, "mntfs") == 0) || - (strcmp(m.mnt_fstype, "devfs") == 0)) + while (*fstype != NULL) + if (strcmp(m.mnt_fstype, *fstype++) == 0) { + skipit++; + break; + } + + if (skipit == 1) continue; (void) strcpy(mountp, m.mnt_mountp); @@ -318,7 +332,7 @@ meta_check_mounted( mnp, 0, -1, ep); if (rval != 0) { (void) mdoverlaperror(ep, MDE_OVERLAP_MOUNTED, - np->cname, mountp, mnp->cname); + np->cname, mountp, mnp->cname); } } } @@ -351,6 +365,8 @@ meta_check_drivemounted( if ((mfp = open_mnttab()) == NULL) return (mdsyserror(ep, errno, MNTTAB)); while ((getmntent(mfp, &m) == 0) && (rval == 0)) { + char **fstype = skip_these_mntents; + int skipit = 0; mdname_t *mnp; if ((m.mnt_special == NULL) || (m.mnt_mountp == NULL)) @@ -359,14 +375,13 @@ meta_check_drivemounted( if (m.mnt_mountp[0] != '/') continue; - if ((strcmp(m.mnt_fstype, "nfs") == 0) || - (strcmp(m.mnt_fstype, "autofs") == 0) || - (strcmp(m.mnt_fstype, "proc") == 0) || - (strcmp(m.mnt_fstype, "tmpfs") == 0) || - (strcmp(m.mnt_fstype, "cachefs") == 0) || - (strcmp(m.mnt_fstype, "lofs") == 0) || - (strcmp(m.mnt_fstype, "rfs") == 0) || - (strcmp(m.mnt_fstype, "fd") == 0)) + while (*fstype != NULL) + if (strcmp(m.mnt_fstype, *fstype++) == 0) { + skipit++; + break; + } + + if (skipit == 1) continue; (void) strcpy(mountp, m.mnt_mountp); @@ -586,9 +601,8 @@ meta_check_samedrive( * involve 2 opens, closes, and devid gets for each existing soft * partition */ - for (dnlp = devnamelist; - (dnlp != NULL) && !(devid1_found && devid2_found); - dnlp = dnlp->dev_nxt) { + for (dnlp = devnamelist; (dnlp != NULL) && + !(devid1_found && devid2_found); dnlp = dnlp->dev_nxt) { if (!devid1_found && (strcmp(dnlp->dev_name, name1) == 0)) { devid1_found = 1; devid1 = dnlp->devid; @@ -761,11 +775,11 @@ meta_check_overlap( uname, np1->cname)); } if (ret == IDENTICAL_NAME_DEVT) - return (mduseerror(ep, /* slice overlaps */ - MDE_OVERLAP, np1->dev, uname, np1->cname)); + return (mduseerror(ep, /* slice overlaps */ + MDE_OVERLAP, np1->dev, uname, np1->cname)); else - return (mduseerror(ep, /* same devid */ - MDE_SAME_DEVID, np1->dev, uname, np2->cname)); + return (mduseerror(ep, /* same devid */ + MDE_SAME_DEVID, np1->dev, uname, np2->cname)); } /* return success */ diff --git a/usr/src/lib/lvm/libmeta/common/meta_name.c b/usr/src/lib/lvm/libmeta/common/meta_name.c index 0b5e7639e8..99211f2fd3 100644 --- a/usr/src/lib/lvm/libmeta/common/meta_name.c +++ b/usr/src/lib/lvm/libmeta/common/meta_name.c @@ -18,13 +18,12 @@ * * CDDL HEADER END */ + /* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include <meta.h> #include <metad.h> @@ -50,7 +49,6 @@ #define VAL2STR(x) QUOTE(x) extern char *getfullblkname(); -extern char *getfullrawname(); /* * caches @@ -66,48 +64,81 @@ static mdhspnamelist_t *hsplistp = NULL; static int chksetname(mdsetname_t **spp, char *sname, md_error_t *ep); /* - * leak proof name conversion + * FUNCTION: meta_dsk_to_rdsk() + * INPUT: str - Fully qualified pathname of a block or character device + * RETURNS: char * - The pathname of the raw device + * PURPOSE: Allocation of a new string representing the character device + * associated with the input string. Note that no checking is + * done to verify the existence of this device file. */ static char * -rawname( - char *uname -) +meta_dsk_to_rdsk(char *str) { - char *p; - struct stat sbuf1, sbuf2; + char *dp = NULL; + char *rdskp = NULL; + + assert(*str == '/'); + + if ((dp = strstr(str, "/rdsk/")) != NULL) + return (Strdup(str)); + + /* + * If this is a malformed string, (i.e. containing neither + * "/rdsk/" nor "/dsk/") then check to see if the caller + * is passing old school device names like "/dev/[r]sd" or + * exotic hardware presenting "/dev/[r]dc" names. + */ + if ((dp = strstr(str, "/dsk/")) == NULL) { + if (strncmp(str, "/dev/r", 6) == 0) { + return (Strdup(str)); + } else if (strncmp(str, "/dev/", 5) == 0) { + dp = str + 4; + } else { + return (NULL); + } + } - if ((p = getfullrawname(uname)) == NULL) { + dp++; + if (*dp == '\0') return (NULL); - } else if (*p == '\0') { - Free(p); + + rdskp = Zalloc(strlen(str) + 2); + (void) strncpy(rdskp, str, dp - str); + rdskp[dp - str] = 'r'; + (void) strcpy(rdskp + (dp - str) + 1, dp); + + return (rdskp); +} + +/* + * FUNCTION: rawname() + * INPUT: uname - Fully qualified pathname of a block or character device + * RETURNS: char * - The fully qualified character device pathname + * PURPOSE: Return the fully qualified pathname of the character device + * corresponding to the block or character device passed in. + */ +static char * +rawname(char *uname) +{ + char *new_path = NULL; + int ret = -1; + struct stat statbuf; + + if (*uname != '/') return (NULL); - } else { - if (stat(uname, &sbuf1) != 0) { - (void) printf(dgettext(TEXT_DOMAIN, - "device to mount in /etc/vfstab is " - "invalid for device %s\n"), uname); - exit(1); - } - if (stat(p, &sbuf2) != 0) { - (void) printf(dgettext(TEXT_DOMAIN, - "device to fsck in /etc/vfstab is " - "invalid for raw device %s\n"), p); - exit(1); - } - if (sbuf1.st_rdev != sbuf2.st_rdev) { - (void) printf(dgettext(TEXT_DOMAIN, - "/etc/vfstab entries inconsistent on " - "line containing device %s\n"), uname); - exit(1); - } - if (!S_ISCHR(sbuf2.st_mode)) { - (void) printf(dgettext(TEXT_DOMAIN, - "/etc/vfstab device to fsck is not a " - "raw device for device %s\n"), p); - exit(1); + + if ((new_path = meta_dsk_to_rdsk(uname)) == NULL) + return (NULL); + + if (strncmp("/dev/", new_path, 5) == 0) { + ret = stat(new_path, &statbuf); + if (ret != 0 || (! S_ISCHR(statbuf.st_mode))) { + Free(new_path); + return (NULL); } - return (p); } + + return (new_path); } char * @@ -176,9 +207,9 @@ parse_device( /* fully-qualified - local set */ if (((sscanf(tname, "/dev/md/dsk/%" VAL2STR(FILENAME_MAX) "s%n", - devname, &len) == 1) && (strlen(tname) == len)) || + devname, &len) == 1) && (strlen(tname) == len)) || ((sscanf(tname, "/dev/md/rdsk/%" VAL2STR(FILENAME_MAX) "s%n", - devname, &len) == 1) && (strlen(tname) == len))) { + devname, &len) == 1) && (strlen(tname) == len))) { *snamep = Strdup(MD_LOCAL_NAME); *fnamep = Strdup(devname); Free(tname); @@ -187,11 +218,11 @@ parse_device( /* with setname specified - either fully qualified and relative spec */ if (((sscanf(tname, "%[^/]/%" VAL2STR(FILENAME_MAX) "s%n", - setname, devname, &len) == 2) && (strlen(tname) == len)) || + setname, devname, &len) == 2) && (strlen(tname) == len)) || ((sscanf(tname, "/dev/md/%[^/]/dsk/%" VAL2STR(FILENAME_MAX) "s%n", - setname, devname, &len) == 2) && (strlen(tname) == len)) || + setname, devname, &len) == 2) && (strlen(tname) == len)) || ((sscanf(tname, "/dev/md/%[^/]/rdsk/%" VAL2STR(FILENAME_MAX) "s%n", - setname, devname, &len) == 2) && (strlen(tname) == len))) { + setname, devname, &len) == 2) && (strlen(tname) == len))) { *snamep = Strdup(setname); *fnamep = Strdup(devname); @@ -281,7 +312,7 @@ meta_canonicalize( if (!valid_name_syntax(tname)) { Free(tname); if (sname != NULL) - Free(sname); + Free(sname); return (NULL); } @@ -298,7 +329,7 @@ meta_canonicalize( } if (sname != NULL) - Free(sname); + Free(sname); return (cname); } @@ -332,7 +363,7 @@ meta_canonicalize_check_set( if (chksetname(spp, sname, ep) != 0) { Free(tname); if (sname != NULL) - Free(sname); + Free(sname); return (NULL); } @@ -349,7 +380,7 @@ meta_canonicalize_check_set( } if (sname != NULL) - Free(sname); + Free(sname); return (cname); } @@ -419,9 +450,9 @@ is_existing_metadevice( */ if (uname[0] == '/') { if (strncmp("/dev/md", uname, strlen("/dev/md")) == 0 && - (raw_name = rawname(uname)) != NULL) { - Free(raw_name); - return (1); + (raw_name = rawname(uname)) != NULL) { + Free(raw_name); + return (1); } return (0); } @@ -442,8 +473,8 @@ is_existing_metadevice( } if ((raw_name = rawname(full_path)) != NULL) { - Free(raw_name); - retval = 1; + Free(raw_name); + retval = 1; } if (set_name != NULL) @@ -907,7 +938,7 @@ chkset( /* if we already have a set, make sure it's the same */ if (*spp != NULL && !metaislocalset(*spp)) { if ((*spp)->setname != sname && - strcmp((*spp)->setname, sname) != 0) { + strcmp((*spp)->setname, sname) != 0) { return (mderror(ep, MDE_SET_DIFF, sname)); } return (0); @@ -1295,8 +1326,8 @@ static char * getrname(mdsetname_t **spp, char *uname, meta_device_type_t *type, md_error_t *ep) { - char *rname, - *fname; + char *rname; + char *fname; int i; int rname_cnt = 0; char *rname_list[3]; @@ -1305,30 +1336,30 @@ getrname(mdsetname_t **spp, char *uname, assert(uname != NULL); /* if it is an absolute name then just call rawname on the input */ if (uname[0] == '/') { - if ((rname = rawname(uname)) != NULL) { - /* - * If the returned rname does not match with - * the specified uname type, we'll return null. - */ - if (strncmp(rname, "/dev/md", strlen("/dev/md")) == 0) { - if (*type == LOGICAL_DEVICE) { - (void) mdsyserror(ep, ENOENT, uname); - return (NULL); - } - *type = META_DEVICE; - } else { - if (*type == META_DEVICE) { - (void) mdsyserror(ep, ENOENT, uname); - return (NULL); + if ((rname = rawname(uname)) != NULL) { + /* + * If the returned rname does not match with + * the specified uname type, we'll return null. + */ + if (strncmp(rname, "/dev/md", strlen("/dev/md")) == 0) { + if (*type == LOGICAL_DEVICE) { + (void) mdsyserror(ep, ENOENT, uname); + return (NULL); + } + *type = META_DEVICE; + } else { + if (*type == META_DEVICE) { + (void) mdsyserror(ep, ENOENT, uname); + return (NULL); + } + *type = LOGICAL_DEVICE; } - *type = LOGICAL_DEVICE; + return (rname); } - return (rname); - } - /* out of luck */ - (void) mdsyserror(ep, ENOENT, uname); - return (NULL); + /* out of luck */ + (void) mdsyserror(ep, ENOENT, uname); + return (NULL); } /* @@ -1412,38 +1443,6 @@ getrname(mdsetname_t **spp, char *uname, } /* - * If all else fails try the straight uname. - * NOTE: This check was at the beginning of getrname instead - * of here. It was moved to avoid a conflict with SC3.0. If - * a diskset was mounted with the same name it would hang - * the cluster in a loop. Example: - * - * fubar/d10 -m fubar/d0 fubar/d1 - * mount /dev/md/fubar/dsk/d10 /fubar - * - * When the system was booted SVM would try to take ownership - * of diskset fubar. This would cause rawname("fubar/d10") to be - * called. rawname() stats the string which caused the cluster - * reservation code to try and take ownership which it was already - * doing and a deadlock would occur. By moving this final attempt - * at resolving the rawname to the end we avoid this deadlock. - */ - if (rname = rawname(uname)) { - /* - * It's only possible to get a logical device from this - * rawname call since a metadevice would have been - * detected earlier. - */ - if (*type == LOGICAL_DEVICE && - (strncmp(rname, "/dev/md/", strlen("/dev/md"))) != 1) - return (rname); - else { - rname_list[rname_cnt] = rname; - rname_cnt++; - } - } - - /* * At this point, we've searched /dev/md/rdsk, /dev/rdsk and * ./ for the specified device. rname_list contains all * the matches we've found and rname_cnt is the number of @@ -1494,9 +1493,9 @@ getrname(mdsetname_t **spp, char *uname, * error was printed above. */ (void) printf(dgettext(TEXT_DOMAIN, - "Error: ambiguous device " - "name.\n%s %s\n\n"), - rname_list[0], rname_list[1]); + "Error: ambiguous device " + "name.\n%s %s\n\n"), + rname_list[0], rname_list[1]); } rname = NULL; } else { @@ -1549,7 +1548,6 @@ getrawnames( if (mdissyserror(ep, ENOENT) && *uname_type != META_DEVICE) { if (uname[0] == '/') { /* Absolute name */ - char *p; uint_t d = 0; int l = 0; char onmb[BUFSIZ+1], snm[BUFSIZ+1]; @@ -1584,23 +1582,9 @@ getrawnames( return (rname); } - /* /.../dsk/... */ - if ((p = strstr(uname, "/dsk/")) != NULL) { + /* /.../dsk/... or /.../rdsk/... */ + if ((rname = meta_dsk_to_rdsk(uname)) != NULL) { mdclrerror(ep); - ++p; - rname = Malloc(strlen(uname) + 1 + 1); - (void) strncpy(rname, uname, (p - uname)); - rname[(p - uname)] = 'r'; - (void) strcpy(&rname[(p - uname) + 1], p); - *dnamep = metadiskname(rname); - *uname_type = LOGICAL_DEVICE; - return (rname); - } - - /* /.../rdsk/... */ - else if (strstr(uname, "/rdsk/") != NULL) { - mdclrerror(ep); - rname = Strdup(uname); *dnamep = metadiskname(rname); *uname_type = LOGICAL_DEVICE; return (rname); @@ -1750,7 +1734,7 @@ parse_ctd( /* check the device and slice */ cl = strlen(device_start_pos); if (sscanf(device_start_pos, "d%us%u%n", &device, slice, &l) != 2 || - l != cl) { + l != cl) { /* check the device and partition */ if (sscanf(device_start_pos, "d%up%u%n", &device, slice, &l) == 2 && l == cl) { @@ -2163,8 +2147,8 @@ setup_slice( 'a' + partno); } else if (sscanf(dname, "/dev/%" VAL2STR(BUFSIZ) "[^0-9/]%u%n", onmb, &d, &l) == 2 && l == cl) { - (void) snprintf(srname, len, "/dev/%s%u%c", onmb, d, - 'a' + partno); + (void) snprintf(srname, len, "/dev/%s%u%c", onmb, d, + 'a' + partno); } else { /* build the slice that is wanted */ (void) snprintf(srname, len, "%ss%u", dname, partno); @@ -2269,6 +2253,7 @@ metaflushfastnames() } fastnmlp = NULL; } + static char * getrname_fast(char *unm, meta_device_type_t uname_type, md_error_t *ep) { @@ -2277,15 +2262,14 @@ getrname_fast(char *unm, meta_device_type_t uname_type, md_error_t *ep) int cl = strlen(unm); char onmb[BUFSIZ+1], snm[BUFSIZ+1], cnmb[BUFSIZ]; char *rnm; - char *p; size_t len; if (uname_type == META_DEVICE) { /* fully qualified - local set */ if (((sscanf(unm, "/dev/md/dsk/%" VAL2STR(BUFSIZ) "s%n", - onmb, &len) == 1) && (cl == len)) || - ((sscanf(unm, "/dev/md/rdsk/%" VAL2STR(BUFSIZ) "s%n", - onmb, &len) == 1) && (cl == len))) { + onmb, &len) == 1) && (cl == len)) || ((sscanf(unm, + "/dev/md/rdsk/%" VAL2STR(BUFSIZ) "s%n", + onmb, &len) == 1) && (cl == len))) { len = strlen("/dev/md/rdsk/") + strlen(onmb) + 1; rnm = Zalloc(len); (void) snprintf(rnm, len, "/dev/md/rdsk/%s", onmb); @@ -2294,14 +2278,13 @@ getrname_fast(char *unm, meta_device_type_t uname_type, md_error_t *ep) /* fully qualified - setname specified */ if (((sscanf(unm, "/dev/md/%[^/]/dsk/%" - VAL2STR(BUFSIZ) "s%n", - snm, onmb, &len) == 2) && (cl == len)) || - ((sscanf(unm, "/dev/md/%[^/]/rdsk/%" - VAL2STR(BUFSIZ) "s%n", - snm, onmb, &len) == 2) && (cl == len))) { + VAL2STR(BUFSIZ) "s%n", snm, onmb, &len) == 2) && + (cl == len)) || ((sscanf(unm, "/dev/md/%[^/]/rdsk/%" + VAL2STR(BUFSIZ) "s%n", snm, onmb, &len) == 2) && + (cl == len))) { len = strlen("/dev/md//rdsk/") + strlen(snm) + - strlen(onmb) + 1; + strlen(onmb) + 1; rnm = Zalloc(len); (void) snprintf(rnm, len, "/dev/md/%s/rdsk/%s", snm, onmb); @@ -2316,7 +2299,7 @@ getrname_fast(char *unm, meta_device_type_t uname_type, md_error_t *ep) /* setname specified <setname>/<metadev> */ if (((sscanf(unm, "%[^/]/%" VAL2STR(BUFSIZ) "s%n", - snm, onmb, &len) == 2) && (cl == len))) { + snm, onmb, &len) == 2) && (cl == len))) { /* Not <setname>/<metadev> - error */ if (strchr(onmb, '/') != NULL) { (void) mdsyserror(ep, EINVAL, unm); @@ -2324,7 +2307,7 @@ getrname_fast(char *unm, meta_device_type_t uname_type, md_error_t *ep) } len = strlen("/dev/md//rdsk/") + strlen(snm) + - strlen(onmb) + 1; + strlen(onmb) + 1; rnm = Zalloc(len); (void) snprintf(rnm, len, "/dev/md/%s/rdsk/%s", snm, onmb); @@ -2355,23 +2338,16 @@ getrname_fast(char *unm, meta_device_type_t uname_type, md_error_t *ep) sscanf(unm, "/dev/%" VAL2STR(BUFSIZ) "[^0-9/]%u" "%" VAL2STR(BUFSIZ) "[a-h]%n", onmb, &d, snm, &l) == 3) && l == cl) { - if ((p = strchr("abcdefgh", snm[0])) != NULL) { + if (strchr("abcdefgh", snm[0]) != NULL) { (void) snprintf(cnmb, sizeof (cnmb), "/dev/r%s%u%s", onmb, d, snm); return (Strdup(cnmb)); } } - if ((p = strstr(unm, "/dsk/")) != NULL) { /* /.../dsk/... */ - ++p; - rnm = Zalloc(strlen(unm) + 1 + 1); - (void) strncpy(rnm, unm, (p - unm)); - rnm[(p - unm)] = 'r'; - (void) strcpy(&rnm[(p - unm) + 1], p); + /* /.../dsk/... or /.../rdsk/... */ + if ((rnm = meta_dsk_to_rdsk(unm)) != NULL) return (rnm); - } else if (strstr(unm, "/rdsk/") != NULL) { /* /.../rdsk/... */ - return (Strdup(unm)); - } /* * Shouldn't get here but if we do then we have an unrecognized @@ -2423,13 +2399,13 @@ metainitfastname( dnp->type = MDT_FAST_COMP; if (((sscanf(uname, "/dev/rdsk/c%ut%ud%us%u%n", &c, &t, &d, - &s, &l) == 4 || + &s, &l) == 4 || sscanf(uname, "/dev/dsk/c%ut%ud%us%u%n", &c, &t, &d, - &s, &l) == 4 || + &s, &l) == 4 || sscanf(uname, "/dev/ap/rdsk/mc%ut%ud%us%u%n", &c, &t, &d, - &s, &l) == 4 || + &s, &l) == 4 || sscanf(uname, "/dev/ap/dsk/mc%ut%ud%us%u%n", &c, &t, &d, - &s, &l) == 4 || + &s, &l) == 4 || sscanf(uname, "/dev/did/rdsk/d%us%u%n", &t, &s, &l) == 2 || sscanf(uname, "/dev/did/dsk/d%us%u%n", &t, &s, &l) == 2|| sscanf(uname, "/dev/rdsk/c%ud%us%u%n", &c, &d, &s, &l) == 3 || @@ -2442,7 +2418,7 @@ metainitfastname( sscanf(uname, "/dev/did/dsk/d%u%n", &t, &l) == 1 || sscanf(uname, "/dev/rdsk/c%ud%u%n", &c, &d, &l) == 2 || sscanf(uname, "/dev/dsk/c%ud%u%n", &c, &d, &l) == 2) && - l == strlen(uname))) { + l == strlen(uname))) { if ((np->cname = strrchr(uname, '/')) == NULL) np->cname = Strdup(uname); else @@ -2505,7 +2481,7 @@ metaname_common( /* get raw name (rname) of the slice and drive (dname) we have */ if ((rname = getrawnames(spp, uname, - &dname, &uname_type, ep)) == NULL) { + &dname, &uname_type, ep)) == NULL) { return (NULL); } @@ -2960,7 +2936,8 @@ metadrivename( * increment the mplen counter once for each decimal digit in * (MD_MAX_PARTS - 1). */ - for (i = MD_MAX_PARTS - 1, mplen = 0; i; i /= 10, ++mplen); + for (i = MD_MAX_PARTS - 1, mplen = 0; i; i /= 10, ++mplen) + ; len = strlen(uname) + mplen + 2; slicename = Malloc(len); @@ -3023,7 +3000,7 @@ metaslicename_type( } if ((namep = meta_name_getname(&sp, dnp->cname, - uname_type, ep)) == NULL) + uname_type, ep)) == NULL) return (NULL); np = setup_slice(sp, uname_type, dnp, NULL, NULL, dnp->rname, @@ -3138,7 +3115,7 @@ metaismeta( ) { return (np->drivenamep->type == MDT_META || - np->drivenamep->type == MDT_FAST_META); + np->drivenamep->type == MDT_FAST_META); } int @@ -3166,13 +3143,13 @@ metachkdisk( if ((! metaismeta(np)) && (dnp->type != MDT_COMP)) { switch (dnp->type) { - case MDT_ACCES: - case MDT_UNKNOWN: - return (mdsyserror(ep, dnp->errnum, np->bname)); - default: - assert(0); - return (mddeverror(ep, MDE_NOT_DISK, np->dev, - np->cname)); + case MDT_ACCES: + case MDT_UNKNOWN: + return (mdsyserror(ep, dnp->errnum, np->bname)); + default: + assert(0); + return (mddeverror(ep, MDE_NOT_DISK, np->dev, + np->cname)); } } return (0); @@ -3460,7 +3437,7 @@ metahsphspname( /* get corresponding hotspare pool name */ if ((uname = meta_gethspnmentbyid(sp->setno, - MD_SIDEWILD, hsp, ep)) == NULL) + MD_SIDEWILD, hsp, ep)) == NULL) return (NULL); /* setup name */ diff --git a/usr/src/uts/common/io/lvm/mirror/mirror_ioctl.c b/usr/src/uts/common/io/lvm/mirror/mirror_ioctl.c index 2b8b0d09d8..d2c12f6f9c 100644 --- a/usr/src/uts/common/io/lvm/mirror/mirror_ioctl.c +++ b/usr/src/uts/common/io/lvm/mirror/mirror_ioctl.c @@ -20,7 +20,7 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -3087,91 +3087,113 @@ md_mirror_ioctl( case DKIOCGVTOC: { - struct vtoc vtoc; + struct vtoc *vtoc; if (! (mode & FREAD)) return (EACCES); - if ((err = mirror_get_vtoc(un, &vtoc)) != 0) { + vtoc = kmem_zalloc(sizeof (*vtoc), KM_SLEEP); + + if ((err = mirror_get_vtoc(un, vtoc)) != 0) { + kmem_free(vtoc, sizeof (*vtoc)); return (err); } if ((mode & DATAMODEL_MASK) == DATAMODEL_NATIVE) { - if (ddi_copyout(&vtoc, data, sizeof (vtoc), mode)) + if (ddi_copyout(vtoc, data, sizeof (*vtoc), mode)) err = EFAULT; } #ifdef _SYSCALL32 else { - struct vtoc32 vtoc32; - vtoctovtoc32(vtoc, vtoc32); - if (ddi_copyout(&vtoc32, data, sizeof (vtoc32), mode)) + struct vtoc32 *vtoc32; + + vtoc32 = kmem_zalloc(sizeof (*vtoc32), KM_SLEEP); + + vtoctovtoc32((*vtoc), (*vtoc32)); + if (ddi_copyout(vtoc32, data, sizeof (*vtoc32), mode)) err = EFAULT; + kmem_free(vtoc32, sizeof (*vtoc32)); } #endif /* _SYSCALL32 */ + kmem_free(vtoc, sizeof (*vtoc)); return (err); } case DKIOCSVTOC: { - struct vtoc vtoc; + struct vtoc *vtoc; if (! (mode & FWRITE)) return (EACCES); + vtoc = kmem_zalloc(sizeof (*vtoc), KM_SLEEP); + if ((mode & DATAMODEL_MASK) == DATAMODEL_NATIVE) { - if (ddi_copyin(data, &vtoc, sizeof (vtoc), mode)) { + if (ddi_copyin(data, vtoc, sizeof (*vtoc), mode)) { err = EFAULT; } } #ifdef _SYSCALL32 else { - struct vtoc32 vtoc32; - if (ddi_copyin(data, &vtoc32, sizeof (vtoc32), mode)) { + struct vtoc32 *vtoc32; + + vtoc32 = kmem_zalloc(sizeof (*vtoc32), KM_SLEEP); + + if (ddi_copyin(data, vtoc32, sizeof (*vtoc32), mode)) { err = EFAULT; } else { - vtoc32tovtoc(vtoc32, vtoc); + vtoc32tovtoc((*vtoc32), (*vtoc)); } + kmem_free(vtoc32, sizeof (*vtoc32)); } #endif /* _SYSCALL32 */ if (err == 0) - err = mirror_set_vtoc(un, &vtoc); + err = mirror_set_vtoc(un, vtoc); + kmem_free(vtoc, sizeof (*vtoc)); return (err); } case DKIOCGEXTVTOC: { - struct extvtoc extvtoc; + struct extvtoc *extvtoc; if (! (mode & FREAD)) return (EACCES); - if ((err = mirror_get_extvtoc(un, &extvtoc)) != 0) { + extvtoc = kmem_zalloc(sizeof (*extvtoc), KM_SLEEP); + + if ((err = mirror_get_extvtoc(un, extvtoc)) != 0) { + kmem_free(extvtoc, sizeof (*extvtoc)); return (err); } - if (ddi_copyout(&extvtoc, data, sizeof (extvtoc), mode)) + if (ddi_copyout(extvtoc, data, sizeof (*extvtoc), mode)) err = EFAULT; + kmem_free(extvtoc, sizeof (*extvtoc)); return (err); } case DKIOCSEXTVTOC: { - struct extvtoc extvtoc; + struct extvtoc *extvtoc; if (! (mode & FWRITE)) return (EACCES); - if (ddi_copyin(data, &extvtoc, sizeof (extvtoc), mode)) { + extvtoc = kmem_zalloc(sizeof (*extvtoc), KM_SLEEP); + + if (ddi_copyin(data, extvtoc, sizeof (*extvtoc), mode)) { err = EFAULT; } if (err == 0) - err = mirror_set_extvtoc(un, &extvtoc); + err = mirror_set_extvtoc(un, extvtoc); + kmem_free(extvtoc, sizeof (*extvtoc)); return (err); } diff --git a/usr/src/uts/common/io/lvm/raid/raid_ioctl.c b/usr/src/uts/common/io/lvm/raid/raid_ioctl.c index b1de6b7d1f..d738b6e8ab 100644 --- a/usr/src/uts/common/io/lvm/raid/raid_ioctl.c +++ b/usr/src/uts/common/io/lvm/raid/raid_ioctl.c @@ -20,7 +20,7 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -2727,91 +2727,109 @@ md_raid_ioctl( case DKIOCGVTOC: { - struct vtoc vtoc; + struct vtoc *vtoc; if (! (mode & FREAD)) return (EACCES); - if ((err = raid_get_vtoc(un, &vtoc)) != 0) { + vtoc = kmem_zalloc(sizeof (*vtoc), KM_SLEEP); + if ((err = raid_get_vtoc(un, vtoc)) != 0) { + kmem_free(vtoc, sizeof (*vtoc)); return (err); } if ((mode & DATAMODEL_MASK) == DATAMODEL_NATIVE) { - if (ddi_copyout(&vtoc, data, sizeof (vtoc), mode)) + if (ddi_copyout(vtoc, data, sizeof (*vtoc), mode)) err = EFAULT; } #ifdef _SYSCALL32 else { - struct vtoc32 vtoc32; - vtoctovtoc32(vtoc, vtoc32); - if (ddi_copyout(&vtoc32, data, sizeof (vtoc32), mode)) + struct vtoc32 *vtoc32; + + vtoc32 = kmem_zalloc(sizeof (*vtoc32), KM_SLEEP); + + vtoctovtoc32((*vtoc), (*vtoc32)); + if (ddi_copyout(vtoc32, data, sizeof (*vtoc32), mode)) err = EFAULT; + kmem_free(vtoc32, sizeof (*vtoc32)); } #endif /* _SYSCALL32 */ + kmem_free(vtoc, sizeof (*vtoc)); return (err); } case DKIOCSVTOC: { - struct vtoc vtoc; + struct vtoc *vtoc; if (! (mode & FWRITE)) return (EACCES); + vtoc = kmem_zalloc(sizeof (*vtoc), KM_SLEEP); if ((mode & DATAMODEL_MASK) == DATAMODEL_NATIVE) { - if (ddi_copyin(data, &vtoc, sizeof (vtoc), mode)) { + if (ddi_copyin(data, vtoc, sizeof (*vtoc), mode)) { err = EFAULT; } } #ifdef _SYSCALL32 else { - struct vtoc32 vtoc32; - if (ddi_copyin(data, &vtoc32, sizeof (vtoc32), mode)) { + struct vtoc32 *vtoc32; + + vtoc32 = kmem_zalloc(sizeof (*vtoc32), KM_SLEEP); + + if (ddi_copyin(data, vtoc32, sizeof (*vtoc32), mode)) { err = EFAULT; } else { - vtoc32tovtoc(vtoc32, vtoc); + vtoc32tovtoc((*vtoc32), (*vtoc)); } + kmem_free(vtoc32, sizeof (*vtoc32)); } #endif /* _SYSCALL32 */ if (err == 0) - err = raid_set_vtoc(un, &vtoc); + err = raid_set_vtoc(un, vtoc); + kmem_free(vtoc, sizeof (*vtoc)); return (err); } case DKIOCGEXTVTOC: { - struct extvtoc extvtoc; + struct extvtoc *extvtoc; if (! (mode & FREAD)) return (EACCES); - if ((err = raid_get_extvtoc(un, &extvtoc)) != 0) { + extvtoc = kmem_zalloc(sizeof (*extvtoc), KM_SLEEP); + if ((err = raid_get_extvtoc(un, extvtoc)) != 0) { + kmem_free(extvtoc, sizeof (*extvtoc)); return (err); } - if (ddi_copyout(&extvtoc, data, sizeof (extvtoc), mode)) + if (ddi_copyout(extvtoc, data, sizeof (*extvtoc), mode)) err = EFAULT; + kmem_free(extvtoc, sizeof (*extvtoc)); return (err); } case DKIOCSEXTVTOC: { - struct extvtoc extvtoc; + struct extvtoc *extvtoc; if (! (mode & FWRITE)) return (EACCES); - if (ddi_copyin(data, &extvtoc, sizeof (extvtoc), mode)) { + extvtoc = kmem_zalloc(sizeof (*extvtoc), KM_SLEEP); + if (ddi_copyin(data, extvtoc, sizeof (*extvtoc), mode)) { err = EFAULT; } if (err == 0) - err = raid_set_extvtoc(un, &extvtoc); + err = raid_set_extvtoc(un, extvtoc); + kmem_free(extvtoc, sizeof (*extvtoc)); return (err); } diff --git a/usr/src/uts/common/io/lvm/softpart/sp_ioctl.c b/usr/src/uts/common/io/lvm/softpart/sp_ioctl.c index f08c94e628..2e4aae56b7 100644 --- a/usr/src/uts/common/io/lvm/softpart/sp_ioctl.c +++ b/usr/src/uts/common/io/lvm/softpart/sp_ioctl.c @@ -20,7 +20,7 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -1343,88 +1343,104 @@ md_sp_ioctl(dev_t dev, int cmd, void *data, int mode, IOLOCK *lockp) case DKIOCGVTOC: { /* vtoc information */ - struct vtoc vtoc; + struct vtoc *vtoc; if (! (mode & FREAD)) return (EACCES); - md_get_vtoc((md_unit_t *)un, &vtoc); + vtoc = kmem_zalloc(sizeof (*vtoc), KM_SLEEP); + md_get_vtoc((md_unit_t *)un, vtoc); if ((mode & DATAMODEL_MASK) == DATAMODEL_NATIVE) { - if (ddi_copyout(&vtoc, data, sizeof (vtoc), mode)) + if (ddi_copyout(vtoc, data, sizeof (*vtoc), mode)) err = EFAULT; } #ifdef _SYSCALL32 else { - struct vtoc32 vtoc32; - vtoctovtoc32(vtoc, vtoc32); - if (ddi_copyout(&vtoc32, data, sizeof (vtoc32), mode)) + struct vtoc32 *vtoc32; + + vtoc32 = kmem_zalloc(sizeof (*vtoc32), KM_SLEEP); + + vtoctovtoc32((*vtoc), (*vtoc32)); + if (ddi_copyout(vtoc32, data, sizeof (*vtoc32), mode)) err = EFAULT; + kmem_free(vtoc32, sizeof (*vtoc32)); } #endif /* _SYSCALL32 */ + kmem_free(vtoc, sizeof (*vtoc)); return (err); } case DKIOCSVTOC: { - struct vtoc vtoc; + struct vtoc *vtoc; if (! (mode & FWRITE)) return (EACCES); + vtoc = kmem_zalloc(sizeof (*vtoc), KM_SLEEP); if ((mode & DATAMODEL_MASK) == DATAMODEL_NATIVE) { - if (ddi_copyin(data, &vtoc, sizeof (vtoc), mode)) { + if (ddi_copyin(data, vtoc, sizeof (*vtoc), mode)) { err = EFAULT; } } #ifdef _SYSCALL32 else { - struct vtoc32 vtoc32; - if (ddi_copyin(data, &vtoc32, sizeof (vtoc32), mode)) { + struct vtoc32 *vtoc32; + + vtoc32 = kmem_zalloc(sizeof (*vtoc32), KM_SLEEP); + + if (ddi_copyin(data, vtoc32, sizeof (*vtoc32), mode)) { err = EFAULT; } else { - vtoc32tovtoc(vtoc32, vtoc); + vtoc32tovtoc((*vtoc32), (*vtoc)); } + kmem_free(vtoc32, sizeof (*vtoc32)); } #endif /* _SYSCALL32 */ if (err == 0) - err = md_set_vtoc((md_unit_t *)un, &vtoc); + err = md_set_vtoc((md_unit_t *)un, vtoc); + kmem_free(vtoc, sizeof (*vtoc)); return (err); } case DKIOCGEXTVTOC: { /* extended vtoc information */ - struct extvtoc extvtoc; + struct extvtoc *extvtoc; if (! (mode & FREAD)) return (EACCES); - md_get_extvtoc((md_unit_t *)un, &extvtoc); + extvtoc = kmem_zalloc(sizeof (*extvtoc), KM_SLEEP); + md_get_extvtoc((md_unit_t *)un, extvtoc); - if (ddi_copyout(&extvtoc, data, sizeof (extvtoc), mode)) + if (ddi_copyout(extvtoc, data, sizeof (*extvtoc), mode)) err = EFAULT; + kmem_free(extvtoc, sizeof (*extvtoc)); return (err); } case DKIOCSEXTVTOC: { - struct extvtoc extvtoc; + struct extvtoc *extvtoc; if (! (mode & FWRITE)) return (EACCES); - if (ddi_copyin(data, &extvtoc, sizeof (extvtoc), mode)) { + extvtoc = kmem_zalloc(sizeof (*extvtoc), KM_SLEEP); + if (ddi_copyin(data, extvtoc, sizeof (*extvtoc), mode)) { err = EFAULT; } if (err == 0) - err = md_set_extvtoc((md_unit_t *)un, &extvtoc); + err = md_set_extvtoc((md_unit_t *)un, extvtoc); + kmem_free(extvtoc, sizeof (*extvtoc)); return (err); } diff --git a/usr/src/uts/common/io/lvm/stripe/stripe_ioctl.c b/usr/src/uts/common/io/lvm/stripe/stripe_ioctl.c index 73b7ec96d4..c790495e8c 100644 --- a/usr/src/uts/common/io/lvm/stripe/stripe_ioctl.c +++ b/usr/src/uts/common/io/lvm/stripe/stripe_ioctl.c @@ -20,7 +20,7 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -1138,94 +1138,112 @@ md_stripe_ioctl(dev_t dev, int cmd, void *data, int mode, IOLOCK *lockp) case DKIOCGVTOC: { - struct vtoc vtoc; + struct vtoc *vtoc; if (! (mode & FREAD)) return (EACCES); - if ((err = stripe_get_vtoc(un, &vtoc)) != 0) { + vtoc = kmem_zalloc(sizeof (*vtoc), KM_SLEEP); + if ((err = stripe_get_vtoc(un, vtoc)) != 0) { + kmem_free(vtoc, sizeof (*vtoc)); return (err); } if ((mode & DATAMODEL_MASK) == DATAMODEL_NATIVE) { - if (ddi_copyout(&vtoc, data, sizeof (vtoc), mode)) + if (ddi_copyout(vtoc, data, sizeof (*vtoc), mode)) err = EFAULT; } #ifdef _SYSCALL32 else { - struct vtoc32 vtoc32; - vtoctovtoc32(vtoc, vtoc32); - if (ddi_copyout(&vtoc32, data, sizeof (vtoc32), mode)) + struct vtoc32 *vtoc32; + + vtoc32 = kmem_zalloc(sizeof (*vtoc32), KM_SLEEP); + + vtoctovtoc32((*vtoc), (*vtoc32)); + if (ddi_copyout(vtoc32, data, sizeof (*vtoc32), mode)) err = EFAULT; + kmem_free(vtoc32, sizeof (*vtoc32)); } #endif /* _SYSCALL32 */ + kmem_free(vtoc, sizeof (*vtoc)); return (err); } case DKIOCSVTOC: { - struct vtoc vtoc; + struct vtoc *vtoc; if (! (mode & FWRITE)) return (EACCES); + vtoc = kmem_zalloc(sizeof (*vtoc), KM_SLEEP); if ((mode & DATAMODEL_MASK) == DATAMODEL_NATIVE) { - if (ddi_copyin(data, &vtoc, sizeof (vtoc), mode)) { + if (ddi_copyin(data, vtoc, sizeof (*vtoc), mode)) { err = EFAULT; } } #ifdef _SYSCALL32 else { - struct vtoc32 vtoc32; - if (ddi_copyin(data, &vtoc32, sizeof (vtoc32), mode)) { + struct vtoc32 *vtoc32; + + vtoc32 = kmem_zalloc(sizeof (*vtoc32), KM_SLEEP); + + if (ddi_copyin(data, vtoc32, sizeof (*vtoc32), mode)) { err = EFAULT; } else { - vtoc32tovtoc(vtoc32, vtoc); + vtoc32tovtoc((*vtoc32), (*vtoc)); } + kmem_free(vtoc32, sizeof (*vtoc32)); } #endif /* _SYSCALL32 */ if (err == 0) { - err = stripe_set_vtoc(un, &vtoc); + err = stripe_set_vtoc(un, vtoc); } + kmem_free(vtoc, sizeof (*vtoc)); return (err); } case DKIOCGEXTVTOC: { - struct extvtoc extvtoc; + struct extvtoc *extvtoc; if (! (mode & FREAD)) return (EACCES); - if ((err = stripe_get_extvtoc(un, &extvtoc)) != 0) { + extvtoc = kmem_zalloc(sizeof (*extvtoc), KM_SLEEP); + if ((err = stripe_get_extvtoc(un, extvtoc)) != 0) { + kmem_free(extvtoc, sizeof (*extvtoc)); return (err); } - if (ddi_copyout(&extvtoc, data, sizeof (extvtoc), mode)) + if (ddi_copyout(extvtoc, data, sizeof (*extvtoc), mode)) err = EFAULT; + kmem_free(extvtoc, sizeof (*extvtoc)); return (err); } case DKIOCSEXTVTOC: { - struct extvtoc extvtoc; + struct extvtoc *extvtoc; if (! (mode & FWRITE)) return (EACCES); - if (ddi_copyin(data, &extvtoc, sizeof (extvtoc), mode)) { + extvtoc = kmem_zalloc(sizeof (*extvtoc), KM_SLEEP); + if (ddi_copyin(data, extvtoc, sizeof (*extvtoc), mode)) { err = EFAULT; } if (err == 0) { - err = stripe_set_extvtoc(un, &extvtoc); + err = stripe_set_extvtoc(un, extvtoc); } + kmem_free(extvtoc, sizeof (*extvtoc)); return (err); } diff --git a/usr/src/uts/common/io/lvm/trans/trans_ioctl.c b/usr/src/uts/common/io/lvm/trans/trans_ioctl.c index 0eb2933cba..df120a11dd 100644 --- a/usr/src/uts/common/io/lvm/trans/trans_ioctl.c +++ b/usr/src/uts/common/io/lvm/trans/trans_ioctl.c @@ -20,7 +20,7 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -2002,92 +2002,109 @@ md_trans_ioctl( case DKIOCGVTOC: { - struct vtoc vtoc; + struct vtoc *vtoc; if (! (mode & FREAD)) return (EACCES); - if ((err = trans_get_vtoc(un, &vtoc)) != 0) { + vtoc = kmem_zalloc(sizeof (*vtoc), KM_SLEEP); + if ((err = trans_get_vtoc(un, vtoc)) != 0) { + kmem_free(vtoc, sizeof (*vtoc)); return (err); } if ((mode & DATAMODEL_MASK) == DATAMODEL_NATIVE) { - if (ddi_copyout(&vtoc, data, sizeof (vtoc), mode)) + if (ddi_copyout(vtoc, data, sizeof (*vtoc), mode)) err = EFAULT; } #ifdef _SYSCALL32 else { - struct vtoc32 vtoc32; - vtoctovtoc32(vtoc, vtoc32); - if (ddi_copyout(&vtoc32, data, sizeof (vtoc32), mode)) + struct vtoc32 *vtoc32; + + vtoc32 = kmem_zalloc(sizeof (*vtoc32), KM_SLEEP); + + vtoctovtoc32((*vtoc), (*vtoc32)); + if (ddi_copyout(vtoc32, data, sizeof (*vtoc32), mode)) err = EFAULT; + kmem_free(vtoc32, sizeof (*vtoc32)); } #endif /* _SYSCALL32 */ + kmem_free(vtoc, sizeof (*vtoc)); return (err); } case DKIOCSVTOC: { - struct vtoc vtoc; + struct vtoc *vtoc; if (! (mode & FWRITE)) return (EACCES); + vtoc = kmem_zalloc(sizeof (*vtoc), KM_SLEEP); if ((mode & DATAMODEL_MASK) == DATAMODEL_NATIVE) { - if (ddi_copyin(data, &vtoc, sizeof (vtoc), mode)) { + if (ddi_copyin(data, vtoc, sizeof (*vtoc), mode)) { err = EFAULT; } } #ifdef _SYSCALL32 else { - struct vtoc32 vtoc32; - if (ddi_copyin(data, &vtoc32, sizeof (vtoc32), mode)) { + struct vtoc32 *vtoc32; + + vtoc32 = kmem_zalloc(sizeof (*vtoc32), KM_SLEEP); + + if (ddi_copyin(data, vtoc32, sizeof (*vtoc32), mode)) { err = EFAULT; } else { - vtoc32tovtoc(vtoc32, vtoc); + vtoc32tovtoc((*vtoc32), (*vtoc)); } + kmem_free(vtoc32, sizeof (*vtoc32)); } #endif /* _SYSCALL32 */ if (err == 0) - err = trans_set_vtoc(un, &vtoc); + err = trans_set_vtoc(un, vtoc); + kmem_free(vtoc, sizeof (*vtoc)); return (err); } case DKIOCGEXTVTOC: { - struct extvtoc extvtoc; + struct extvtoc *extvtoc; if (! (mode & FREAD)) return (EACCES); - if ((err = trans_get_extvtoc(un, &extvtoc)) != 0) { + extvtoc = kmem_zalloc(sizeof (*extvtoc), KM_SLEEP); + if ((err = trans_get_extvtoc(un, extvtoc)) != 0) { return (err); } - if (ddi_copyout(&extvtoc, data, sizeof (extvtoc), mode)) + if (ddi_copyout(extvtoc, data, sizeof (*extvtoc), mode)) err = EFAULT; + kmem_free(extvtoc, sizeof (*extvtoc)); return (err); } case DKIOCSEXTVTOC: { - struct extvtoc extvtoc; + struct extvtoc *extvtoc; if (! (mode & FWRITE)) return (EACCES); - if (ddi_copyin(data, &extvtoc, sizeof (extvtoc), mode)) { + extvtoc = kmem_zalloc(sizeof (*extvtoc), KM_SLEEP); + if (ddi_copyin(data, extvtoc, sizeof (*extvtoc), mode)) { err = EFAULT; } if (err == 0) - err = trans_set_extvtoc(un, &extvtoc); + err = trans_set_extvtoc(un, extvtoc); + kmem_free(extvtoc, sizeof (*extvtoc)); return (err); } |