diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-11 13:52:27 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-11 14:10:35 -0400 |
commit | c9059598ea8981d02356eead3188bf7fa4d717b8 (patch) | |
tree | 03e73b20a30e988da7c6a3e0ad93b2dc5843274d /drivers/block/xd.c | |
parent | 0a33f80a8373eca7f4bea3961d1346c3815fa5ed (diff) | |
parent | b0fd271d5fba0b2d00888363f3869e3f9b26caa9 (diff) |
Merge branch 'for-2.6.31' of git://git.kernel.dk/linux-2.6-block
* 'for-2.6.31' of git://git.kernel.dk/linux-2.6-block: (153 commits)
block: add request clone interface (v2)
floppy: fix hibernation
ramdisk: remove long-deprecated "ramdisk=" boot-time parameter
fs/bio.c: add missing __user annotation
block: prevent possible io_context->refcount overflow
Add serial number support for virtio_blk, V4a
block: Add missing bounce_pfn stacking and fix comments
Revert "block: Fix bounce limit setting in DM"
cciss: decode unit attention in SCSI error handling code
cciss: Remove no longer needed sendcmd reject processing code
cciss: change SCSI error handling routines to work with interrupts enabled.
cciss: separate error processing and command retrying code in sendcmd_withirq_core()
cciss: factor out fix target status processing code from sendcmd functions
cciss: simplify interface of sendcmd() and sendcmd_withirq()
cciss: factor out core of sendcmd_withirq() for use by SCSI error handling code
cciss: Use schedule_timeout_uninterruptible in SCSI error handling code
block: needs to set the residual length of a bidi request
Revert "block: implement blkdev_readpages"
block: Fix bounce limit setting in DM
Removed reference to non-existing file Documentation/PCI/PCI-DMA-mapping.txt
...
Manually fix conflicts with tracing updates in:
block/blk-sysfs.c
drivers/ide/ide-atapi.c
drivers/ide/ide-cd.c
drivers/ide/ide-floppy.c
drivers/ide/ide-tape.c
include/trace/events/block.h
kernel/trace/blktrace.c
Diffstat (limited to 'drivers/block/xd.c')
-rw-r--r-- | drivers/block/xd.c | 41 |
1 files changed, 18 insertions, 23 deletions
diff --git a/drivers/block/xd.c b/drivers/block/xd.c index 64b496fce98b..ce2429219925 100644 --- a/drivers/block/xd.c +++ b/drivers/block/xd.c | |||
@@ -305,30 +305,25 @@ static void do_xd_request (struct request_queue * q) | |||
305 | if (xdc_busy) | 305 | if (xdc_busy) |
306 | return; | 306 | return; |
307 | 307 | ||
308 | while ((req = elv_next_request(q)) != NULL) { | 308 | req = blk_fetch_request(q); |
309 | unsigned block = req->sector; | 309 | while (req) { |
310 | unsigned count = req->nr_sectors; | 310 | unsigned block = blk_rq_pos(req); |
311 | int rw = rq_data_dir(req); | 311 | unsigned count = blk_rq_cur_sectors(req); |
312 | XD_INFO *disk = req->rq_disk->private_data; | 312 | XD_INFO *disk = req->rq_disk->private_data; |
313 | int res = 0; | 313 | int res = -EIO; |
314 | int retry; | 314 | int retry; |
315 | 315 | ||
316 | if (!blk_fs_request(req)) { | 316 | if (!blk_fs_request(req)) |
317 | end_request(req, 0); | 317 | goto done; |
318 | continue; | 318 | if (block + count > get_capacity(req->rq_disk)) |
319 | } | 319 | goto done; |
320 | if (block + count > get_capacity(req->rq_disk)) { | ||
321 | end_request(req, 0); | ||
322 | continue; | ||
323 | } | ||
324 | if (rw != READ && rw != WRITE) { | ||
325 | printk("do_xd_request: unknown request\n"); | ||
326 | end_request(req, 0); | ||
327 | continue; | ||
328 | } | ||
329 | for (retry = 0; (retry < XD_RETRIES) && !res; retry++) | 320 | for (retry = 0; (retry < XD_RETRIES) && !res; retry++) |
330 | res = xd_readwrite(rw, disk, req->buffer, block, count); | 321 | res = xd_readwrite(rq_data_dir(req), disk, req->buffer, |
331 | end_request(req, res); /* wrap up, 0 = fail, 1 = success */ | 322 | block, count); |
323 | done: | ||
324 | /* wrap up, 0 = success, -errno = fail */ | ||
325 | if (!__blk_end_request_cur(req, res)) | ||
326 | req = blk_fetch_request(q); | ||
332 | } | 327 | } |
333 | } | 328 | } |
334 | 329 | ||
@@ -418,7 +413,7 @@ static int xd_readwrite (u_char operation,XD_INFO *p,char *buffer,u_int block,u_ | |||
418 | printk("xd%c: %s timeout, recalibrating drive\n",'a'+drive,(operation == READ ? "read" : "write")); | 413 | printk("xd%c: %s timeout, recalibrating drive\n",'a'+drive,(operation == READ ? "read" : "write")); |
419 | xd_recalibrate(drive); | 414 | xd_recalibrate(drive); |
420 | spin_lock_irq(&xd_lock); | 415 | spin_lock_irq(&xd_lock); |
421 | return (0); | 416 | return -EIO; |
422 | case 2: | 417 | case 2: |
423 | if (sense[0] & 0x30) { | 418 | if (sense[0] & 0x30) { |
424 | printk("xd%c: %s - ",'a'+drive,(operation == READ ? "reading" : "writing")); | 419 | printk("xd%c: %s - ",'a'+drive,(operation == READ ? "reading" : "writing")); |
@@ -439,7 +434,7 @@ static int xd_readwrite (u_char operation,XD_INFO *p,char *buffer,u_int block,u_ | |||
439 | else | 434 | else |
440 | printk(" - no valid disk address\n"); | 435 | printk(" - no valid disk address\n"); |
441 | spin_lock_irq(&xd_lock); | 436 | spin_lock_irq(&xd_lock); |
442 | return (0); | 437 | return -EIO; |
443 | } | 438 | } |
444 | if (xd_dma_buffer) | 439 | if (xd_dma_buffer) |
445 | for (i=0; i < (temp * 0x200); i++) | 440 | for (i=0; i < (temp * 0x200); i++) |
@@ -448,7 +443,7 @@ static int xd_readwrite (u_char operation,XD_INFO *p,char *buffer,u_int block,u_ | |||
448 | count -= temp, buffer += temp * 0x200, block += temp; | 443 | count -= temp, buffer += temp * 0x200, block += temp; |
449 | } | 444 | } |
450 | spin_lock_irq(&xd_lock); | 445 | spin_lock_irq(&xd_lock); |
451 | return (1); | 446 | return 0; |
452 | } | 447 | } |
453 | 448 | ||
454 | /* xd_recalibrate: recalibrate a given drive and reset controller if necessary */ | 449 | /* xd_recalibrate: recalibrate a given drive and reset controller if necessary */ |