[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [linux-2.6.18-xen] scsifront: avoid acquiring same lock twice if ring is full


  • To: xen-changelog@xxxxxxxxxxxxxxxxxxx
  • From: Xen patchbot-linux-2.6.18-xen <patchbot@xxxxxxx>
  • Date: Wed, 14 Jan 2015 10:22:03 +0000
  • Delivery-date: Wed, 14 Jan 2015 10:22:12 +0000
  • List-id: "Change log for Mercurial \(receive only\)" <xen-changelog.lists.xen.org>

# HG changeset patch
# User Juergen Gross <jgross@xxxxxxxx>
# Date 1421228828 -3600
# Node ID 3015a92b2b53825d00dc81c2dd131fc77ce8ab00
# Parent  078f1bb69ea5e3772f3df4b4ee21f3c52e381e51
scsifront: avoid acquiring same lock twice if ring is full

The locking in scsifront_dev_reset_handler() as introduced by c/s
1209:4d1471ca031e is obviously wrong. In case of a full ring the host
lock is acquired twice.

Fixing this issue enables to get rid of the endless fo loop with an
explicit break statement.

Signed-off-by: Juergen Gross <jgross@xxxxxxxx>

Also add a missing version check.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Committed-by: Jan Beulich <jbeulich@xxxxxxxx>
---


diff -r 078f1bb69ea5 -r 3015a92b2b53 drivers/xen/scsifront/scsifront.c
--- a/drivers/xen/scsifront/scsifront.c Wed Dec 10 10:22:39 2014 +0100
+++ b/drivers/xen/scsifront/scsifront.c Wed Jan 14 10:47:08 2015 +0100
@@ -447,12 +447,10 @@ static int scsifront_dev_reset_handler(s
        uint16_t rqid;
        int err = 0;
 
-       for (;;) {
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
-               spin_lock_irq(host->host_lock);
+       spin_lock_irq(host->host_lock);
 #endif
-               if (!RING_FULL(&info->ring))
-                       break;
+       while (RING_FULL(&info->ring)) {
                if (err) {
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
                        spin_unlock_irq(host->host_lock);
@@ -463,7 +461,9 @@ static int scsifront_dev_reset_handler(s
                spin_unlock_irq(host->host_lock);
                err = wait_event_interruptible(info->wq_sync,
                                               !info->waiting_sync);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
                spin_lock_irq(host->host_lock);
+#endif
        }
 
        ring_req      = scsifront_pre_request(info);

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.