Blob Blame History Raw
From a3db7def912c2fd3756cfd99c1165db075281caa Mon Sep 17 00:00:00 2001
From: Fabio M. Di Nitto <fdinitto@redhat.com>
Date: Tue, 13 Oct 2009 09:26:02 +0200
Subject: [PATCH 05/12] RH: cciss_id

Signed-off-by: Fabio M. Di Nitto <fdinitto@redhat.com>
---
:100644 100644 54be0a5... 7e4b7b1... M	Makefile
:000000 100644 0000000... 6db12a4... A	cciss_id/Makefile
:000000 100644 0000000... 091b5fe... A	cciss_id/cciss_id.c
 Makefile            |    3 +-
 cciss_id/Makefile   |   47 +++++++++++++++++++
 cciss_id/cciss_id.c |  128 +++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 177 insertions(+), 1 deletions(-)

diff --git a/Makefile b/Makefile
index 54be0a5..7e4b7b1 100644
--- a/Makefile
+++ b/Makefile
@@ -25,7 +25,8 @@ BUILDDIRS = \
 	libmultipath/checkers \
 	multipath \
 	multipathd \
-	kpartx
+	kpartx \
+	cciss_id
 
 ifeq   ($(MULTIPATH_VERSION),)
 VERSION = $(shell basename ${PWD} | cut -d'-' -f3)
diff --git a/cciss_id/Makefile b/cciss_id/Makefile
new file mode 100644
index 0000000..6db12a4
--- /dev/null
+++ b/cciss_id/Makefile
@@ -0,0 +1,47 @@
+
+# *****************************************************************************
+# *                                                                           *
+# *     (C)  Copyright 2007 Hewlett-Packard Development Company, L.P          *
+# *                                                                           *
+# * This program is free software; you can redistribute it and/or modify it   *
+# * under the terms of the GNU General Public License as published by the Free*
+# * Software  Foundation; either version 2 of the License, or (at your option)*
+# * any later version.                                                        *
+# *                                                                           *
+# * This program is distributed in the hope that it will be useful, but       *
+# * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY*
+# * or FITNESS FOR  A PARTICULAR PURPOSE. See the GNU General Public License  *
+# * for more details.                                                         *
+# *                                                                           *
+# * You should have received a copy of the GNU General Public License along   *
+# * with this program; if not, write to the Free Software Foundation, Inc.,   *
+# * 675 Mass Ave, Cambridge, MA 02139, USA.                                   *
+# *                                                                           *
+# *                                                                           *
+# *                                                                           *
+# *                                                                           *
+# *****************************************************************************
+
+include ../Makefile.inc
+
+OBJS = cciss_id.o
+CFLAGS = -pipe -g -Wall -Wunused -Wstrict-prototypes
+
+LDFLAGS = -ldevmapper
+
+EXEC = cciss_id
+
+all: $(EXEC)
+
+$(EXEC): $(OBJS)
+	$(CC) $(OBJS) -o $(EXEC) $(LDFLAGS)
+
+install:
+	$(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir)
+	$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)/
+
+uninstall:
+	rm $(DESTDIR)$(bindir)/$(EXEC)
+
+clean:
+	rm -f core.* *.o $(EXEC) *.gz
diff --git a/cciss_id/cciss_id.c b/cciss_id/cciss_id.c
new file mode 100644
index 0000000..091b5fe
--- /dev/null
+++ b/cciss_id/cciss_id.c
@@ -0,0 +1,128 @@
+/*
+ *****************************************************************************
+ *                                                                           *
+ *     (C)  Copyright 2007 Hewlett-Packard Development Company, L.P          *
+ *                                                                           *
+ * This program is free software; you can redistribute it and/or modify it   *
+ * under the terms of the GNU General Public License as published by the Free*
+ * Software  Foundation; either version 2 of the License, or (at your option)*
+ * any later version.                                                        *
+ *                                                                           *
+ * This program is distributed in the hope that it will be useful, but       *
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY*
+ * or FITNESS FOR  A PARTICULAR PURPOSE. See the GNU General Public License  *
+ * for more details.                                                         *
+ *                                                                           *
+ * You should have received a copy of the GNU General Public License along   *
+ * with this program; if not, write to the Free Software Foundation, Inc.,   *
+ * 675 Mass Ave, Cambridge, MA 02139, USA.                                   *
+ *                                                                           *
+ *                                                                           *
+ *                                                                           *
+ *                                                                           *
+ *****************************************************************************
+*/
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+
+#include <linux/cciss_ioctl.h>
+
+#define LEN_PAGE83_CCISSDEV	0x20 	/* Page length of 83h for cciss devices */
+#define LEN_DEVICEFILE	255 		/* Length of device file name */
+#define PATH_CCISSDEV	"/dev/cciss/" 	/* Path of CCISS devices */
+int main(int argc, char *argv[])
+{
+	const int resp_len = LEN_PAGE83_CCISSDEV;
+	unsigned char resp[resp_len+1];
+	char dev_name[LEN_DEVICEFILE] = "\0" ;
+	unsigned int lun_id = 0;
+	int fd, status, i;
+	struct stat file_stat;
+
+	LogvolInfo_struct    lvi;	// logical "volume" info
+	IOCTL_Command_struct cic; 	// cciss ioctl command
+
+	if(argc < 2) {
+		fprintf(stderr, "Usage: %s /dev/cciss/cNdN\n", argv[0]);
+		return -1;
+	}
+
+	if ( strncmp(PATH_CCISSDEV, argv[1], strlen(PATH_CCISSDEV) ) != 0 ) {
+		if ( strchr(argv[1], '!') ) {
+			sprintf(dev_name, "%s%s", PATH_CCISSDEV,
+				strchr(argv[1], '!')+1);
+		}
+                //fprintf(stderr, "dev_name is: -%s-", dev_name);
+        } else {
+		sprintf(dev_name, "%s", argv[1]);
+	}
+
+	if (stat(dev_name, &file_stat) < 0) {
+		fprintf (stderr, "Stat failed for file %s. Errno=%d\n", dev_name, errno);
+		return -1;
+	}
+	if (!S_ISBLK(file_stat.st_mode)) {
+		fprintf (stderr, "File %s is not a block device. \n", dev_name);
+                return -1;
+	}
+
+
+	if((fd = open(dev_name,  O_RDWR)) < 0) {
+		fprintf(stderr, "Open failed for file %s. Errno=%d\n", dev_name, errno);
+		return -1;
+	}
+
+       	if (ioctl(fd, CCISS_GETLUNINFO, &lvi) < 0) {
+		fprintf(stderr, "IOCTL failure CCISS_GETLUNINFO for file %s Errno=%d\n", dev_name, errno);
+		close(fd);
+                return -1;
+       	} else {
+	       	lun_id = lvi.LunID;
+       	}
+
+	memset(&cic, 0, sizeof(IOCTL_Command_struct));
+	memset(resp, 0, resp_len+1);
+	cic.LUN_info.LogDev.Mode = 0x01; /* logical volume addressing */
+	cic.LUN_info.LogDev.VolId = lun_id & 0x3FFFFFFF;
+	cic.Request.CDBLen = 6;
+	cic.Request.Type.Type =  TYPE_CMD; // It is a command.
+	cic.Request.Type.Attribute = ATTR_SIMPLE;
+	cic.Request.Type.Direction = XFER_READ; // Read
+	cic.Request.Timeout = 0; // Don't time out
+	cic.Request.CDB[0] = 0x12;
+	cic.Request.CDB[1] = 0x01; /* EVPD (enable vital product data) */
+	cic.Request.CDB[2] = 0x83;
+	cic.Request.CDB[4] = resp_len & 0xFF;
+	cic.buf_size = resp_len;
+	cic.buf = resp;
+	status = ioctl(fd, CCISS_PASSTHRU, &cic);
+	if(status) {
+		fprintf(stderr, "IOCTL failure CCISS_PASSTHRU for file %s Errno=%d\n", dev_name, errno);
+		close(fd);
+                return -1;
+	}
+	else {
+		if ((cic.error_info.CommandStatus | cic.error_info.ScsiStatus )) {
+             		fprintf(stderr, "CCISS command status error for Inquiry on %s\n",
+                       		dev_name);
+                	close(fd);
+             		return -1;
+        	}
+		printf("3");
+		for(i=8; i<24; i++)
+			/* printf("Buff[%d] =%x\n", i, resp[i]); */
+			printf("%02x", resp[i]);
+		printf("\n");
+	}
+
+	close(fd);
+	return 0;
+}
-- 
1.6.5.1