Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ba027def authored by Jens Axboe's avatar Jens Axboe Committed by Linus Torvalds
Browse files

[PATCH] Revert ide softirq handling



There's a problem with the REQ_BLOCK_PC handling as well (bad ->data_len
handling) where it could actually complete a request ahead of time.  I
suggest we just back this out for now, I will resubmit it later when I'm
fully confident in it.

This reverts commit 8672d571

Signed-off-by: default avatarJens Axboe <axboe@suse.de>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 661dd5c8
Loading
Loading
Loading
Loading
+3 −31
Original line number Diff line number Diff line
@@ -55,22 +55,9 @@
#include <asm/io.h>
#include <asm/bitops.h>

void ide_softirq_done(struct request *rq)
{
	request_queue_t *q = rq->q;

	add_disk_randomness(rq->rq_disk);
	end_that_request_chunk(rq, 1, rq->data_len);

	spin_lock_irq(q->queue_lock);
	end_that_request_last(rq, 1);
	spin_unlock_irq(q->queue_lock);
}

int __ide_end_request(ide_drive_t *drive, struct request *rq, int uptodate,
		      int nr_sectors)
{
	unsigned int nbytes;
	int ret = 1;

	BUG_ON(!(rq->flags & REQ_STARTED));
@@ -94,20 +81,6 @@ int __ide_end_request(ide_drive_t *drive, struct request *rq, int uptodate,
		HWGROUP(drive)->hwif->ide_dma_on(drive);
	}

	/*
	 * For partial completions (or non fs/pc requests), use the regular
	 * direct completion path. Same thing for requests that failed, to
	 * preserve the ->errors value we use the normal completion path
	 * for those
	 */
	nbytes = nr_sectors << 9;
	if (!rq->errors && rq_all_done(rq, nbytes)) {
		rq->data_len = nbytes;
		blkdev_dequeue_request(rq);
		HWGROUP(drive)->rq = NULL;
		blk_complete_request(rq);
		ret = 0;
	} else {
	if (!end_that_request_first(rq, uptodate, nr_sectors)) {
		add_disk_randomness(rq->rq_disk);
		blkdev_dequeue_request(rq);
@@ -115,7 +88,6 @@ int __ide_end_request(ide_drive_t *drive, struct request *rq, int uptodate,
		end_that_request_last(rq, uptodate);
		ret = 0;
	}
	}

	return ret;
}
+0 −2
Original line number Diff line number Diff line
@@ -1011,8 +1011,6 @@ static int ide_init_queue(ide_drive_t *drive)
	blk_queue_max_hw_segments(q, max_sg_entries);
	blk_queue_max_phys_segments(q, max_sg_entries);

	blk_queue_softirq_done(q, ide_softirq_done);

	/* assign drive queue */
	drive->queue = q;

+0 −1
Original line number Diff line number Diff line
@@ -1002,7 +1002,6 @@ extern int noautodma;

extern int ide_end_request (ide_drive_t *drive, int uptodate, int nrsecs);
extern int __ide_end_request (ide_drive_t *drive, struct request *rq, int uptodate, int nrsecs);
extern void ide_softirq_done(struct request *rq);

/*
 * This is used on exit from the driver to designate the next irq handler