From: Peter Osterlund <petero2@telia.com>
To: Andrew Morton <akpm@osdl.org>
Cc: linux-kernel@vger.kernel.org
Subject: [PATCH 2/3] Simplified request size handling in CDRW packet writing
Date: 28 Jul 2004 22:42:57 +0200 [thread overview]
Message-ID: <m3hdrrualq.fsf@telia.com> (raw)
In-Reply-To: m3llh3uavw.fsf@telia.com
Simplified the code in the pktcdvd driver that ensures that write
requests are not larger than the packet size. This also limits the
read request size, but that doesn't seem cause any measurable
overhead, so it's better to keep the code simple.
Signed-off-by: Peter Osterlund <petero2@telia.com>
---
linux-petero/drivers/block/pktcdvd.c | 45 +++++------------------------------
linux-petero/include/linux/pktcdvd.h | 2 -
2 files changed, 7 insertions(+), 40 deletions(-)
diff -puN drivers/block/pktcdvd.c~packet-limit-request-size drivers/block/pktcdvd.c
--- linux/drivers/block/pktcdvd.c~packet-limit-request-size 2004-07-28 22:00:20.491858952 +0200
+++ linux-petero/drivers/block/pktcdvd.c 2004-07-28 22:00:20.495858344 +0200
@@ -85,25 +85,6 @@ static struct pktcdvd_device *pkt_find_d
return NULL;
}
-/*
- * The underlying block device is not allowed to merge write requests. Some
- * CDRW drives can not handle writes larger than one packet, even if the size
- * is a multiple of the packet size.
- */
-static int pkt_lowlevel_elv_merge_fn(request_queue_t *q, struct request **req, struct bio *bio)
-{
- struct pktcdvd_device *pd = pkt_find_dev(q);
- BUG_ON(!pd);
-
- if (bio_data_dir(bio) == WRITE)
- return ELEVATOR_NO_MERGE;
-
- if (pd->cdrw.elv_merge_fn)
- return pd->cdrw.elv_merge_fn(q, req, bio);
-
- return ELEVATOR_NO_MERGE;
-}
-
static void pkt_lowlevel_elv_completed_req_fn(request_queue_t *q, struct request *req)
{
struct pktcdvd_device *pd = pkt_find_dev(q);
@@ -119,17 +100,6 @@ static void pkt_lowlevel_elv_completed_r
pd->cdrw.elv_completed_req_fn(q, req);
}
-static int pkt_lowlevel_merge_requests_fn(request_queue_t *q, struct request *rq, struct request *next)
-{
- struct pktcdvd_device *pd = pkt_find_dev(q);
- BUG_ON(!pd);
-
- if (rq_data_dir(rq) == WRITE)
- return 0;
-
- return pd->cdrw.merge_requests_fn(q, rq, next);
-}
-
static void pkt_bio_init(struct bio *bio)
{
bio->bi_next = NULL;
@@ -1933,17 +1903,20 @@ static int pkt_open_dev(struct pktcdvd_d
}
}
spin_lock_irq(q->queue_lock);
- pd->cdrw.elv_merge_fn = q->elevator.elevator_merge_fn;
pd->cdrw.elv_completed_req_fn = q->elevator.elevator_completed_req_fn;
- pd->cdrw.merge_requests_fn = q->merge_requests_fn;
- q->elevator.elevator_merge_fn = pkt_lowlevel_elv_merge_fn;
q->elevator.elevator_completed_req_fn = pkt_lowlevel_elv_completed_req_fn;
- q->merge_requests_fn = pkt_lowlevel_merge_requests_fn;
spin_unlock_irq(q->queue_lock);
if (write) {
if ((ret = pkt_open_write(pd)))
goto restore_queue;
+ /*
+ * Some CDRW drives can not handle writes larger than one packet,
+ * even if the size is a multiple of the packet size.
+ */
+ spin_lock_irq(q->queue_lock);
+ blk_queue_max_sectors(q, pd->settings.size);
+ spin_unlock_irq(q->queue_lock);
set_bit(PACKET_WRITABLE, &pd->flags);
} else {
pkt_set_speed(pd, 0xffff, 0xffff);
@@ -1960,9 +1933,7 @@ static int pkt_open_dev(struct pktcdvd_d
restore_queue:
spin_lock_irq(q->queue_lock);
- q->elevator.elevator_merge_fn = pd->cdrw.elv_merge_fn;
q->elevator.elevator_completed_req_fn = pd->cdrw.elv_completed_req_fn;
- q->merge_requests_fn = pd->cdrw.merge_requests_fn;
spin_unlock_irq(q->queue_lock);
out_putdev:
blkdev_put(pd->bdev);
@@ -1986,9 +1957,7 @@ static void pkt_release_dev(struct pktcd
q = bdev_get_queue(pd->bdev);
pkt_set_speed(pd, 0xffff, 0xffff);
spin_lock_irq(q->queue_lock);
- q->elevator.elevator_merge_fn = pd->cdrw.elv_merge_fn;
q->elevator.elevator_completed_req_fn = pd->cdrw.elv_completed_req_fn;
- q->merge_requests_fn = pd->cdrw.merge_requests_fn;
spin_unlock_irq(q->queue_lock);
blkdev_put(pd->bdev);
}
diff -puN include/linux/pktcdvd.h~packet-limit-request-size include/linux/pktcdvd.h
--- linux/include/linux/pktcdvd.h~packet-limit-request-size 2004-07-28 22:00:20.492858800 +0200
+++ linux-petero/include/linux/pktcdvd.h 2004-07-28 22:00:20.495858344 +0200
@@ -140,9 +140,7 @@ struct packet_cdrw
struct list_head pkt_active_list;
spinlock_t active_list_lock; /* Serialize access to pkt_active_list */
struct task_struct *thread;
- elevator_merge_fn *elv_merge_fn;
elevator_completed_req_fn *elv_completed_req_fn;
- merge_requests_fn *merge_requests_fn;
};
/*
_
--
Peter Osterlund - petero2@telia.com
http://w1.894.telia.com/~u89404340
next prev parent reply other threads:[~2004-07-28 20:53 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-07-28 20:36 [PATCH 1/3] Trivial CDRW packet writing doc update Peter Osterlund
2004-07-28 20:42 ` Peter Osterlund [this message]
2004-07-28 20:49 ` [PATCH 3/3] Fix setting of maximum read speed in CDRW packet writing Peter Osterlund
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=m3hdrrualq.fsf@telia.com \
--to=petero2@telia.com \
--cc=akpm@osdl.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.