Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[SCSI] libiscsi: use bh locking instead of irq with session lock

The session lock is taken in threads, timers, and bottom halves
like softirqs and tasklets. All the code but
iscsi_conn/session_failure take the session lock with the spin_lock_bh
call. This was done because I thought some offload drivers
would be calling these functions from a irq. They never did,
so this patch has iscsi_conn/session_failure use the bh
locking.

Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>

authored by

Mike Christie and committed by
James Bottomley
bfcf72e4 f41d4721

+6 -8
+6 -8
drivers/scsi/libiscsi.c
··· 1338 1338 { 1339 1339 struct iscsi_conn *conn; 1340 1340 struct device *dev; 1341 - unsigned long flags; 1342 1341 1343 - spin_lock_irqsave(&session->lock, flags); 1342 + spin_lock_bh(&session->lock); 1344 1343 conn = session->leadconn; 1345 1344 if (session->state == ISCSI_STATE_TERMINATE || !conn) { 1346 - spin_unlock_irqrestore(&session->lock, flags); 1345 + spin_unlock_bh(&session->lock); 1347 1346 return; 1348 1347 } 1349 1348 1350 1349 dev = get_device(&conn->cls_conn->dev); 1351 - spin_unlock_irqrestore(&session->lock, flags); 1350 + spin_unlock_bh(&session->lock); 1352 1351 if (!dev) 1353 1352 return; 1354 1353 /* ··· 1366 1367 void iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err) 1367 1368 { 1368 1369 struct iscsi_session *session = conn->session; 1369 - unsigned long flags; 1370 1370 1371 - spin_lock_irqsave(&session->lock, flags); 1371 + spin_lock_bh(&session->lock); 1372 1372 if (session->state == ISCSI_STATE_FAILED) { 1373 - spin_unlock_irqrestore(&session->lock, flags); 1373 + spin_unlock_bh(&session->lock); 1374 1374 return; 1375 1375 } 1376 1376 1377 1377 if (conn->stop_stage == 0) 1378 1378 session->state = ISCSI_STATE_FAILED; 1379 - spin_unlock_irqrestore(&session->lock, flags); 1379 + spin_unlock_bh(&session->lock); 1380 1380 1381 1381 set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); 1382 1382 set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx);