[Iprdd-commit] iprutils iprlib.c, 1.114, 1.115 iprlib.h, 1.97, 1.98 version.mk, 1.61, 1.62
Brought to you by:
brking
|
From: Brian K. <br...@us...> - 2007-05-01 21:56:23
|
Update of /cvsroot/iprdd/iprutils In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv22403 Modified Files: iprlib.c iprlib.h version.mk Log Message: Fix iprinit dual initiator failover device rescanning code Index: version.mk =================================================================== RCS file: /cvsroot/iprdd/iprutils/version.mk,v retrieving revision 1.61 retrieving revision 1.62 diff -u -d -r1.61 -r1.62 --- version.mk 26 Apr 2007 19:55:10 -0000 1.61 +++ version.mk 1 May 2007 21:56:18 -0000 1.62 @@ -6,9 +6,9 @@ IPR_MAJOR_RELEASE=2 IPR_MINOR_RELEASE=2 -IPR_FIX_LEVEL=5 +IPR_FIX_LEVEL=5.cvs IPR_RELEASE=1 -IPR_FIX_DATE=(April 26, 2007) +IPR_FIX_DATE=(May 1, 2007) IPR_VERSION_STR=$(IPR_MAJOR_RELEASE).$(IPR_MINOR_RELEASE).$(IPR_FIX_LEVEL) $(IPR_FIX_DATE) Index: iprlib.c =================================================================== RCS file: /cvsroot/iprdd/iprutils/iprlib.c,v retrieving revision 1.114 retrieving revision 1.115 diff -u -d -r1.114 -r1.115 --- iprlib.c 26 Apr 2007 13:32:30 -0000 1.114 +++ iprlib.c 1 May 2007 21:56:18 -0000 1.115 @@ -678,13 +678,7 @@ int ipr_improper_device_type(struct ipr_dev *dev) { - struct ipr_ioa *ioa = dev->ioa; - - if (ioa->is_secondary && !ioa->was_secondary && - ipr_is_af_dasd_device(dev) && dev->scsi_dev_data) - return 1; - if (!ioa->is_secondary && ioa->was_secondary && - ipr_is_af_dasd_device(dev) && !dev->scsi_dev_data) + if (dev->rescan) return 1; if (!dev->scsi_dev_data) return 0; @@ -1176,6 +1170,8 @@ static int same_scsi_dev(struct scsi_dev_data *first, struct scsi_dev_data *second) { + if (!first || !second) + return 0; if (first->host != second->host) return 0; if (first->channel != second->channel) @@ -1188,8 +1184,6 @@ return 0; if (first->online != second->online) return 0; - if (first->handle != second->handle) - return 0; if (strcmp(first->vendor_id, second->vendor_id)) return 0; if (strcmp(first->product_id, second->product_id)) @@ -1203,15 +1197,32 @@ return 1; } +static int same_dev_rcd(struct ipr_dev_record *first, struct ipr_dev_record *second) +{ + if (memcmp(&first->resource_addr, &second->resource_addr, + sizeof(first->resource_addr))) + return 0; + if (memcmp(first->vendor_id, second->vendor_id, IPR_VENDOR_ID_LEN)) + return 0; + if (memcmp(first->product_id, second->product_id, IPR_PROD_ID_LEN)) + return 0; + if (memcmp(first->serial_num, second->serial_num, IPR_SERIAL_NUM_LEN)) + return 0; + return 1; +} + static int same_dev(struct ipr_dev *first, struct ipr_dev *second) { if (strcmp(first->dev_name, second->dev_name)) return 0; if (strcmp(first->gen_name, second->gen_name)) return 0; - if (!first->scsi_dev_data || !second->scsi_dev_data) - return 0; - if (!same_scsi_dev(first->scsi_dev_data, second->scsi_dev_data)) + if (!first->scsi_dev_data && !second->scsi_dev_data) { + if (!ipr_is_af_dasd_device(first) || !ipr_is_af_dasd_device(second)) + return 0; + if (!same_dev_rcd(first->dev_rcd, second->dev_rcd)) + return 0; + } else if (!same_scsi_dev(first->scsi_dev_data, second->scsi_dev_data)) return 0; return 1; } @@ -1234,6 +1245,12 @@ new->init_not_allowed = !dev_init_allowed(new); if (!old->init_not_allowed || new->init_not_allowed) new->should_init = 0; + if (new->ioa->is_secondary && !old->ioa->is_secondary && + ipr_is_af_dasd_device(new) && new->scsi_dev_data) + new->rescan = 1; + if (!new->ioa->is_secondary && old->ioa->is_secondary && + ipr_is_af_dasd_device(new) && !new->scsi_dev_data) + new->rescan = 1; } static void resolve_ioa(struct ipr_ioa *ioa, struct ipr_ioa *old_ioa) @@ -1241,13 +1258,13 @@ struct ipr_dev *dev, *old_dev; ioa->should_init = 0; - ioa->was_secondary = old_ioa->is_secondary; for_each_dev(ioa, dev) { for_each_dev(old_ioa, old_dev) { if (!same_dev(dev, old_dev)) continue; memcpy(&dev->attr, &old_dev->attr, sizeof(dev->attr)); + dev->rescan = old_dev->rescan; resolve_dev(dev, old_dev); break; } @@ -1261,7 +1278,6 @@ for_each_ioa(ioa) { ioa->should_init = 1; - ioa->was_secondary = 0; for_each_dev(ioa, dev) dev->should_init = 1; } @@ -6015,6 +6031,7 @@ if (!dev->local_flag) continue; dev->local_flag = 0; + dev->rescan = 0; ipr_for_each_unique_ra(dev, ipr_scan_ra); } Index: iprlib.h =================================================================== RCS file: /cvsroot/iprdd/iprutils/iprlib.h,v retrieving revision 1.97 retrieving revision 1.98 diff -u -d -r1.97 -r1.98 --- iprlib.h 26 Apr 2007 13:32:30 -0000 1.97 +++ iprlib.h 1 May 2007 21:56:18 -0000 1.98 @@ -1102,6 +1102,7 @@ u32 should_init:1; u32 init_not_allowed:1; u32 local_flag:1; + u32 rescan:1; struct scsi_dev_data *scsi_dev_data; struct ipr_dev *ses[IPR_DEV_MAX_PATHS]; struct ipr_res_addr res_addr[IPR_DEV_MAX_PATHS]; @@ -1141,7 +1142,6 @@ u8 scsi_id_changeable:1; u8 dual_raid_support:1; u8 is_secondary:1; - u8 was_secondary:1; u8 should_init:1; u8 is_aux_cache:1; u8 protect_last_bus:1; |