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));
-
 		}
 	}