Mercurial > illumos > illumos-gate
changeset 3903:9871dc0ad022
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
author | shidokht |
---|---|
date | Tue, 27 Mar 2007 11:00:42 -0700 |
parents | d387dedbee60 |
children | 73066af3aa6a |
files | usr/src/uts/common/io/cmlb.c usr/src/uts/common/io/scsi/targets/sd.c |
diffstat | 2 files changed, 18 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- 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
--- 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)); - } }