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

Commit 8ffdc655 authored by Tejun Heo's avatar Tejun Heo Committed by Jens Axboe
Browse files

[BLOCK] add @uptodate to end_that_request_last() and @error to rq_end_io_fn()



add @uptodate argument to end_that_request_last() and @error
to rq_end_io_fn().  there's no generic way to pass error code
to request completion function, making generic error handling
of non-fs request difficult (rq->errors is driver-specific and
each driver uses it differently).  this patch adds @uptodate
to end_that_request_last() and @error to rq_end_io_fn().

for fs requests, this doesn't really matter, so just using the
same uptodate argument used in the last call to
end_that_request_first() should suffice.  imho, this can also
help the generic command-carrying request jens is working on.

Signed-off-by: default avatartejun heo <htejun@gmail.com>
Signed-Off-By: default avatarJens Axboe <axboe@suse.de>
parent 64100099
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -498,7 +498,7 @@ struct request *elv_next_request(request_queue_t *q)
			blkdev_dequeue_request(rq);
			rq->flags |= REQ_QUIET;
			end_that_request_chunk(rq, 0, nr_bytes);
			end_that_request_last(rq);
			end_that_request_last(rq, 0);
		} else {
			printk(KERN_ERR "%s: bad return=%d\n", __FUNCTION__,
								ret);
+15 −7
Original line number Diff line number Diff line
@@ -344,7 +344,7 @@ EXPORT_SYMBOL(blk_queue_issue_flush_fn);
/*
 * Cache flushing for ordered writes handling
 */
static void blk_pre_flush_end_io(struct request *flush_rq)
static void blk_pre_flush_end_io(struct request *flush_rq, int error)
{
	struct request *rq = flush_rq->end_io_data;
	request_queue_t *q = rq->q;
@@ -362,7 +362,7 @@ static void blk_pre_flush_end_io(struct request *flush_rq)
	}
}

static void blk_post_flush_end_io(struct request *flush_rq)
static void blk_post_flush_end_io(struct request *flush_rq, int error)
{
	struct request *rq = flush_rq->end_io_data;
	request_queue_t *q = rq->q;
@@ -2317,7 +2317,7 @@ EXPORT_SYMBOL(blk_rq_map_kern);
 */
void blk_execute_rq_nowait(request_queue_t *q, struct gendisk *bd_disk,
			   struct request *rq, int at_head,
			   void (*done)(struct request *))
			   rq_end_io_fn *done)
{
	int where = at_head ? ELEVATOR_INSERT_FRONT : ELEVATOR_INSERT_BACK;

@@ -2521,7 +2521,7 @@ EXPORT_SYMBOL(blk_put_request);
 * blk_end_sync_rq - executes a completion event on a request
 * @rq: request to complete
 */
void blk_end_sync_rq(struct request *rq)
void blk_end_sync_rq(struct request *rq, int error)
{
	struct completion *waiting = rq->waiting;

@@ -3183,9 +3183,17 @@ EXPORT_SYMBOL(end_that_request_chunk);
/*
 * queue lock must be held
 */
void end_that_request_last(struct request *req)
void end_that_request_last(struct request *req, int uptodate)
{
	struct gendisk *disk = req->rq_disk;
	int error;

	/*
	 * extend uptodate bool to allow < 0 value to be direct io error
	 */
	error = 0;
	if (end_io_error(uptodate))
		error = !uptodate ? -EIO : uptodate;

	if (unlikely(laptop_mode) && blk_fs_request(req))
		laptop_io_completion();
@@ -3200,7 +3208,7 @@ void end_that_request_last(struct request *req)
		disk->in_flight--;
	}
	if (req->end_io)
		req->end_io(req);
		req->end_io(req, error);
	else
		__blk_put_request(req->q, req);
}
@@ -3212,7 +3220,7 @@ void end_request(struct request *req, int uptodate)
	if (!end_that_request_first(req, uptodate, req->hard_cur_sectors)) {
		add_disk_randomness(req->rq_disk);
		blkdev_dequeue_request(req);
		end_that_request_last(req);
		end_that_request_last(req, uptodate);
	}
}

+1 −1
Original line number Diff line number Diff line
@@ -3471,7 +3471,7 @@ static inline boolean DAC960_ProcessCompletedRequest(DAC960_Command_T *Command,

	 if (!end_that_request_first(Request, UpToDate, Command->BlockCount)) {

 	 	end_that_request_last(Request);
 	 	end_that_request_last(Request, UpToDate);

		if (Command->Completion) {
			complete(Command->Completion);
+1 −1
Original line number Diff line number Diff line
@@ -2310,7 +2310,7 @@ static inline void complete_command( ctlr_info_t *h, CommandList_struct *cmd,
	printk("Done with %p\n", cmd->rq);
#endif /* CCISS_DEBUG */ 

	end_that_request_last(cmd->rq);
	end_that_request_last(cmd->rq, status ? 1 : -EIO);
	cmd_free(h,cmd,1);
}

+1 −1
Original line number Diff line number Diff line
@@ -1036,7 +1036,7 @@ static inline void complete_command(cmdlist_t *cmd, int timeout)
	complete_buffers(cmd->rq->bio, ok);

        DBGPX(printk("Done with %p\n", cmd->rq););
	end_that_request_last(cmd->rq);
	end_that_request_last(cmd->rq, ok ? 1 : -EIO);
}

/*
Loading