[SCSI] pmcraid: support SMI-S object model of storage pool
authorAnil Ravindranath <anil_ravindranath@pmc-sierra.com>
Fri, 20 Nov 2009 17:39:30 +0000 (09:39 -0800)
committerJames Bottomley <James.Bottomley@suse.de>
Thu, 10 Dec 2009 14:54:12 +0000 (08:54 -0600)
PMC-Sierra mgmt application uses SMI-S model. According to SMI-S, the
object model exposed by the SMI-S provider should show an StoragePool
which contains member disks of a RAID Virtual disk and StorageVolume
based on the StoragePool. But according to SMI-S, there is a possibility
where StoragePool is created but StorageVolume is not yet created. To
satisfy this scenario, we are trying a hidden RAID Virtual disk. The
hidden RAID virtual disk will not be exposed to OS. Once a StorageVolume
is created for this RAID virtual disk it is exposed.

Signed-off-by: Anil Ravindranath<anil_ravindranath@pmc-sierra.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
drivers/scsi/pmcraid.c
drivers/scsi/pmcraid.h

index 34c6b896a91b98cf2328b251058c7aa82ce2829a..e7d2688fbeba9f6cd2ca37d27f5c4229347bd4ae 100644 (file)
@@ -1,7 +1,8 @@
 /*
  * pmcraid.c -- driver for PMC Sierra MaxRAID controller adapters
  *
- * Written By: PMC Sierra Corporation
+ * Written By: Anil Ravindranath<anil_ravindranath@pmc-sierra.com>
+ *             PMC-Sierra Inc
  *
  * Copyright (C) 2008, 2009 PMC Sierra Inc
  *
@@ -79,7 +80,7 @@ DECLARE_BITMAP(pmcraid_minor, PMCRAID_MAX_ADAPTERS);
 /*
  * Module parameters
  */
-MODULE_AUTHOR("PMC Sierra Corporation, anil_ravindranath@pmc-sierra.com");
+MODULE_AUTHOR("Anil Ravindranath<anil_ravindranath@pmc-sierra.com>");
 MODULE_DESCRIPTION("PMC Sierra MaxRAID Controller Driver");
 MODULE_LICENSE("GPL");
 MODULE_VERSION(PMCRAID_DRIVER_VERSION);
@@ -162,10 +163,10 @@ static int pmcraid_slave_alloc(struct scsi_device *scsi_dev)
        spin_lock_irqsave(&pinstance->resource_lock, lock_flags);
        list_for_each_entry(temp, &pinstance->used_res_q, queue) {
 
-               /* do not expose VSETs with order-ids >= 240 */
+               /* do not expose VSETs with order-ids > MAX_VSET_TARGETS */
                if (RES_IS_VSET(temp->cfg_entry)) {
                        target = temp->cfg_entry.unique_flags1;
-                       if (target >= PMCRAID_MAX_VSET_TARGETS)
+                       if (target > PMCRAID_MAX_VSET_TARGETS)
                                continue;
                        bus = PMCRAID_VSET_BUS_ID;
                        lun = 0;
@@ -1210,7 +1211,7 @@ static int pmcraid_expose_resource(struct pmcraid_config_table_entry *cfgte)
        int retval = 0;
 
        if (cfgte->resource_type == RES_TYPE_VSET)
-               retval = ((cfgte->unique_flags1 & 0xFF) < 0xFE);
+               retval = ((cfgte->unique_flags1 & 0x80) == 0);
        else if (cfgte->resource_type == RES_TYPE_GSCSI)
                retval = (RES_BUS(cfgte->resource_address) !=
                                PMCRAID_VIRTUAL_ENCL_BUS_ID);
@@ -1361,6 +1362,7 @@ static int pmcraid_notify_aen(struct pmcraid_instance *pinstance, u8 type)
  * Return value:
  *  none
  */
+
 static void pmcraid_handle_config_change(struct pmcraid_instance *pinstance)
 {
        struct pmcraid_config_table_entry *cfg_entry;
@@ -1368,9 +1370,10 @@ static void pmcraid_handle_config_change(struct pmcraid_instance *pinstance)
        struct pmcraid_cmd *cmd;
        struct pmcraid_cmd *cfgcmd;
        struct pmcraid_resource_entry *res = NULL;
-       u32 new_entry = 1;
        unsigned long lock_flags;
        unsigned long host_lock_flags;
+       u32 new_entry = 1;
+       u32 hidden_entry = 0;
        int rc;
 
        ccn_hcam = (struct pmcraid_hcam_ccn *)pinstance->ccn.hcam;
@@ -1406,9 +1409,15 @@ static void pmcraid_handle_config_change(struct pmcraid_instance *pinstance)
        }
 
        /* If this resource is not going to be added to mid-layer, just notify
-        * applications and return
+        * applications and return. If this notification is about hiding a VSET
+        * resource, check if it was exposed already.
         */
-       if (!pmcraid_expose_resource(cfg_entry))
+       if (pinstance->ccn.hcam->notification_type ==
+           NOTIFICATION_TYPE_ENTRY_CHANGED &&
+           cfg_entry->resource_type == RES_TYPE_VSET &&
+           cfg_entry->unique_flags1 & 0x80) {
+               hidden_entry = 1;
+       } else if (!pmcraid_expose_resource(cfg_entry))
                goto out_notify_apps;
 
        spin_lock_irqsave(&pinstance->resource_lock, lock_flags);
@@ -1424,6 +1433,12 @@ static void pmcraid_handle_config_change(struct pmcraid_instance *pinstance)
 
        if (new_entry) {
 
+               if (hidden_entry) {
+                       spin_unlock_irqrestore(&pinstance->resource_lock,
+                                               lock_flags);
+                       goto out_notify_apps;
+               }
+
                /* If there are more number of resources than what driver can
                 * manage, do not notify the applications about the CCN. Just
                 * ignore this notifications and re-register the same HCAM
@@ -1454,8 +1469,9 @@ static void pmcraid_handle_config_change(struct pmcraid_instance *pinstance)
                sizeof(struct pmcraid_config_table_entry));
 
        if (pinstance->ccn.hcam->notification_type ==
-           NOTIFICATION_TYPE_ENTRY_DELETED) {
+           NOTIFICATION_TYPE_ENTRY_DELETED || hidden_entry) {
                if (res->scsi_dev) {
+                       res->cfg_entry.unique_flags1 &= 0x7F;
                        res->change_detected = RES_CHANGE_DEL;
                        res->cfg_entry.resource_handle =
                                PMCRAID_INVALID_RES_HANDLE;
index 2752b56cad56441ed5bc98583c22d3608b7d632a..92f89d50850c95aae55c195a354caef666a370d5 100644 (file)
@@ -1,6 +1,9 @@
 /*
  * pmcraid.h -- PMC Sierra MaxRAID controller driver header file
  *
+ * Written By: Anil Ravindranath<anil_ravindranath@pmc-sierra.com>
+ *             PMC-Sierra Inc
+ *
  * Copyright (C) 2008, 2009 PMC Sierra Inc.
  *
  * This program is free software; you can redistribute it and/or modify
 #define PMCRAID_VSET_LUN_ID                      0x0
 #define PMCRAID_PHYS_BUS_ID                      0x0
 #define PMCRAID_VIRTUAL_ENCL_BUS_ID              0x8
-#define PMCRAID_MAX_VSET_TARGETS                 240
+#define PMCRAID_MAX_VSET_TARGETS                 0x7F
 #define PMCRAID_MAX_VSET_LUNS_PER_TARGET         8
 
 #define PMCRAID_IOA_MAX_SECTORS                  32767