Skip to content

Commit

Permalink
mg_disk: fix locking
Browse files Browse the repository at this point in the history
IRQ and timeout handlers call functions which expect locked queue lock
without locking it.  Fix it.

While at it, convert 0s used as null pointer constant to NULLs.

[ Impact: fix locking, cleanup ]

Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: unsik Kim <donari75@gmail.com>
  • Loading branch information
Tejun Heo authored and Jens Axboe committed Apr 28, 2009
1 parent 27b1833 commit 39f36b4
Showing 1 changed file with 13 additions and 4 deletions.
17 changes: 13 additions & 4 deletions drivers/block/mg_disk.c
Original file line number Diff line number Diff line change
Expand Up @@ -160,11 +160,16 @@ static irqreturn_t mg_irq(int irq, void *dev_id)
struct mg_host *host = dev_id;
void (*handler)(struct mg_host *) = host->mg_do_intr;

host->mg_do_intr = 0;
spin_lock(&host->lock);

host->mg_do_intr = NULL;
del_timer(&host->timer);
if (!handler)
handler = mg_unexpected_intr;
handler(host);

spin_unlock(&host->lock);

return IRQ_HANDLED;
}

Expand Down Expand Up @@ -319,7 +324,7 @@ static void mg_read(struct request *req)

remains = req->nr_sectors;

if (mg_out(host, req->sector, req->nr_sectors, MG_CMD_RD, 0) !=
if (mg_out(host, req->sector, req->nr_sectors, MG_CMD_RD, NULL) !=
MG_ERR_NONE)
mg_bad_rw_intr(host);

Expand Down Expand Up @@ -363,7 +368,7 @@ static void mg_write(struct request *req)

remains = req->nr_sectors;

if (mg_out(host, req->sector, req->nr_sectors, MG_CMD_WR, 0) !=
if (mg_out(host, req->sector, req->nr_sectors, MG_CMD_WR, NULL) !=
MG_ERR_NONE) {
mg_bad_rw_intr(host);
return;
Expand Down Expand Up @@ -521,9 +526,11 @@ void mg_times_out(unsigned long data)
char *name;
struct request *req;

spin_lock_irq(&host->lock);

req = elv_next_request(host->breq);
if (!req)
return;
goto out_unlock;

host->mg_do_intr = NULL;

Expand All @@ -534,6 +541,8 @@ void mg_times_out(unsigned long data)
mg_bad_rw_intr(host);

mg_request(host->breq);
out_unlock:
spin_unlock_irq(&host->lock);
}

static void mg_request_poll(struct request_queue *q)
Expand Down

0 comments on commit 39f36b4

Please sign in to comment.