changeset 13306:5dc578fe734a

785 implement MHIOCGRP_CLEAR Reviewed by: Garrett D'Amore <garrett@nexenta.com> Reviewed by: Gordon Ross <gwr@nexenta.com> Reviewed by: Rich Lowe <richlowe@richlowe.net> Approved by: Garrett D'Amore <garrett@damore.org>
author galibern cyril <cyril.galibern@gmail.com>
date Fri, 18 Mar 2011 20:20:57 -0700
parents c0863802718a
children b78ce5a9eedd
files usr/src/uts/common/io/scsi/targets/sd.c usr/src/uts/common/sys/scsi/targets/sddef.h
diffstat 2 files changed, 38 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/io/scsi/targets/sd.c	Fri Mar 18 14:06:44 2011 -0400
+++ b/usr/src/uts/common/io/scsi/targets/sd.c	Fri Mar 18 20:20:57 2011 -0700
@@ -25,6 +25,9 @@
 /*
  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
  */
+/*
+ * Copyright 2011 cyril.galibern@opensvc.com
+ */
 
 /*
  * SCSI disk target driver.
@@ -20954,7 +20957,7 @@
  *                      for the target.
  *		usr_cmd SCSI-3 reservation facility command (one of
  *			SD_SCSI3_REGISTER, SD_SCSI3_RESERVE, SD_SCSI3_RELEASE,
- *			SD_SCSI3_PREEMPTANDABORT)
+ *			SD_SCSI3_PREEMPTANDABORT, SD_SCSI3_CLEAR)
  *		usr_bufp - user provided pointer register, reserve descriptor or
  *			preempt and abort structure (mhioc_register_t,
  *                      mhioc_resv_desc_t, mhioc_preemptandabort_t)
@@ -21020,6 +21023,12 @@
 		prp->aptpl = ptr->aptpl;
 		break;
 	}
+	case SD_SCSI3_CLEAR: {
+		mhioc_resv_desc_t *ptr = (mhioc_resv_desc_t *)usr_bufp;
+
+		bcopy(ptr->key.key, prp->res_key, MHIOC_RESV_KEY_SIZE);
+		break;
+	}
 	case SD_SCSI3_RESERVE:
 	case SD_SCSI3_RELEASE: {
 		mhioc_resv_desc_t *ptr = (mhioc_resv_desc_t *)usr_bufp;
@@ -22290,6 +22299,7 @@
 		case MHIOCGRP_INKEYS:
 		case MHIOCGRP_INRESV:
 		case MHIOCGRP_REGISTER:
+		case MHIOCGRP_CLEAR:
 		case MHIOCGRP_RESERVE:
 		case MHIOCGRP_PREEMPTANDABORT:
 		case MHIOCGRP_REGISTERANDIGNOREKEY:
@@ -22606,6 +22616,28 @@
 		}
 		break;
 
+	case MHIOCGRP_CLEAR:
+		SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_CLEAR\n");
+		if ((err = drv_priv(cred_p)) != EPERM) {
+			if (un->un_reservation_type == SD_SCSI2_RESERVATION) {
+				err = ENOTSUP;
+			} else if (arg != NULL) {
+				mhioc_register_t reg;
+				if (ddi_copyin((void *)arg, &reg,
+				    sizeof (mhioc_register_t), flag) != 0) {
+					err = EFAULT;
+				} else {
+					err =
+					    sd_send_scsi_PERSISTENT_RESERVE_OUT(
+					    ssc, SD_SCSI3_CLEAR,
+					    (uchar_t *)&reg);
+					if (err != 0)
+						goto done_with_assess;
+				}
+			}
+		}
+		break;
+
 	case MHIOCGRP_RESERVE:
 		SD_TRACE(SD_LOG_IOCTL, un, "MHIOCGRP_RESERVE\n");
 		if ((err = drv_priv(cred_p)) != EPERM) {
@@ -24729,7 +24761,7 @@
  * A direct semantic implementation of the SCSI-3 Persistent Reservation
  * facility is supported through the shared multihost disk ioctls
  * (MHIOCGRP_INKEYS, MHIOCGRP_INRESV, MHIOCGRP_REGISTER, MHIOCGRP_RESERVE,
- * MHIOCGRP_PREEMPTANDABORT)
+ * MHIOCGRP_PREEMPTANDABORT, MHIOCGRP_CLEAR)
  *
  * Reservation Reclaim:
  * --------------------
--- a/usr/src/uts/common/sys/scsi/targets/sddef.h	Fri Mar 18 14:06:44 2011 -0400
+++ b/usr/src/uts/common/sys/scsi/targets/sddef.h	Fri Mar 18 20:20:57 2011 -0700
@@ -21,6 +21,9 @@
 /*
  * Copyright (c) 1990, 2010, Oracle and/or its affiliates. All rights reserved.
  */
+/*
+ * Copyright 2011 cyril.galibern@opensvc.com
+ */
 
 #ifndef	_SYS_SCSI_TARGETS_SDDEF_H
 #define	_SYS_SCSI_TARGETS_SDDEF_H
@@ -884,6 +887,7 @@
 #define	SD_SCSI3_REGISTER		0x00
 #define	SD_SCSI3_RESERVE		0x01
 #define	SD_SCSI3_RELEASE		0x02
+#define	SD_SCSI3_CLEAR			0x03
 #define	SD_SCSI3_PREEMPTANDABORT	0x05
 #define	SD_SCSI3_REGISTERANDIGNOREKEY	0x06