# HG changeset patch # User shidokht # Date 1175018442 25200 # Node ID 9871dc0ad022fc0049240cb34cb67a8b003c142a # Parent d387dedbee6067e0c5d43bc970310d00030d0ee5 6531497 ldi_get_size() may fail on a sd device opened with FNDELAY 6534665 sd: whole disk minor node disappears on the last close of a removable media with GPT labels diff -r d387dedbee60 -r 9871dc0ad022 usr/src/uts/common/io/cmlb.c --- a/usr/src/uts/common/io/cmlb.c Tue Mar 27 09:31:42 2007 -0700 +++ b/usr/src/uts/common/io/cmlb.c Tue Mar 27 11:00:42 2007 -0700 @@ -956,7 +956,8 @@ case DKIOCSMBOOT: break; default: - status = cmlb_validate_geometry(cl, 0, 0, tg_cookie); + status = cmlb_validate_geometry(cl, 1, CMLB_SILENT, + tg_cookie); /* * VTOC related ioctls except SVTOC/SGEOM should diff -r d387dedbee60 -r 9871dc0ad022 usr/src/uts/common/io/scsi/targets/sd.c --- a/usr/src/uts/common/io/scsi/targets/sd.c Tue Mar 27 09:31:42 2007 -0700 +++ b/usr/src/uts/common/io/scsi/targets/sd.c Tue Mar 27 11:00:42 2007 -0700 @@ -2599,21 +2599,25 @@ * request is passed to ddi_prop_op. Size depends on valid geometry. */ un = ddi_get_soft_state(sd_state, instance); - if ((dev == DDI_DEV_T_ANY) || (un == NULL) || - !SD_IS_VALID_LABEL(un)) { + if ((dev == DDI_DEV_T_ANY) || (un == NULL)) { return (ddi_prop_op(dev, dip, prop_op, mod_flags, name, valuep, lengthp)); - } else { - /* get nblocks value */ - ASSERT(!mutex_owned(SD_MUTEX(un))); - - (void) cmlb_partinfo(un->un_cmlbhandle, SDPART(dev), - (diskaddr_t *)&nblocks64, NULL, NULL, NULL, + } else if (!SD_IS_VALID_LABEL(un)) { + (void) cmlb_validate(un->un_cmlbhandle, 0, (void *)SD_PATH_DIRECT); - - return (ddi_prop_op_nblocks(dev, dip, prop_op, mod_flags, - name, valuep, lengthp, nblocks64)); - } + if (!SD_IS_VALID_LABEL(un)) + return (ddi_prop_op(dev, dip, prop_op, mod_flags, + name, valuep, lengthp)); + } + + /* get nblocks value */ + ASSERT(!mutex_owned(SD_MUTEX(un))); + + (void) cmlb_partinfo(un->un_cmlbhandle, SDPART(dev), + (diskaddr_t *)&nblocks64, NULL, NULL, NULL, (void *)SD_PATH_DIRECT); + + return (ddi_prop_op_nblocks(dev, dip, prop_op, mod_flags, + name, valuep, lengthp, nblocks64)); } /* @@ -9194,11 +9198,6 @@ un->un_wm_cache = NULL; } } - mutex_exit(SD_MUTEX(un)); - (void) cmlb_close(un->un_cmlbhandle, - (void *)SD_PATH_DIRECT); - mutex_enter(SD_MUTEX(un)); - } }