|
@@ -3416,8 +3416,22 @@ static int check_for_unit_attention(ctlr_info_t *h, CommandList_struct *c)
|
|
|
case REPORT_LUNS_CHANGED:
|
|
|
printk(KERN_WARNING "cciss%d: report LUN data "
|
|
|
"changed\n", h->ctlr);
|
|
|
- add_to_scan_list(h);
|
|
|
- wake_up_process(cciss_scan_thread);
|
|
|
+ /*
|
|
|
+ * Here, we could call add_to_scan_list and wake up the scan thread,
|
|
|
+ * except that it's quite likely that we will get more than one
|
|
|
+ * REPORT_LUNS_CHANGED condition in quick succession, which means
|
|
|
+ * that those which occur after the first one will likely happen
|
|
|
+ * *during* the scan_thread's rescan. And the rescan code is not
|
|
|
+ * robust enough to restart in the middle, undoing what it has already
|
|
|
+ * done, and it's not clear that it's even possible to do this, since
|
|
|
+ * part of what it does is notify the block layer, which starts
|
|
|
+ * doing it's own i/o to read partition tables and so on, and the
|
|
|
+ * driver doesn't have visibility to know what might need undoing.
|
|
|
+ * In any event, if possible, it is horribly complicated to get right
|
|
|
+ * so we just don't do it for now.
|
|
|
+ *
|
|
|
+ * Note: this REPORT_LUNS_CHANGED condition only occurs on the MSA2012.
|
|
|
+ */
|
|
|
return 1;
|
|
|
break;
|
|
|
case POWER_OR_RESET:
|