Skip to contentSkip to conversation

Trivial CDRW packet writing doc update

PATCH New Peter Osterlund 1 participant 3 messages Jul 28, 2004

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/3 Trivial CDRW packet writing doc update

Document that pktcdvd block devices have a 2KB block size.

---

 linux-petero/Documentation/cdrom/packet-writing.txt |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
Documentation/cdrom/packet-writing.txt renamed from Documentation/cdrom/packet-writing.txt~packet-doc-update +2 -2
diff -puN Documentation/cdrom/packet-writing.txt~packet-doc-update Documentation/cdrom/packet-writing.txt
@@ -71,8 +71,8 @@ Notes
   filesystem corruption if the disc wears out.
 
 - Since the pktcdvd driver makes the disc appear as a regular block
-  device, you can put any filesystem you like on the disc. For
-  example, run:
+  device with a 2KB block size, you can put any filesystem you like on
+  the disc. For example, run:
 
 	# /sbin/mke2fs /dev/pktcdvd/dev_name
 

_

Signature · 2 lines
Peter Osterlund - [email protected]
http://w1.894.telia.com/~u89404340
#1 lore raw

PATCH 2/3 Simplified request size handling in CDRW packet writing

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.

---

 linux-petero/drivers/block/pktcdvd.c |   45 +++++------------------------------
 linux-petero/include/linux/pktcdvd.h |    2 -
 2 files changed, 7 insertions(+), 40 deletions(-)
drivers/block/pktcdvd.c renamed from drivers/block/pktcdvd.c~packet-limit-request-size +7 -38
diff -puN drivers/block/pktcdvd.c~packet-limit-request-size drivers/block/pktcdvd.c
@@ -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);
 }
include/linux/pktcdvd.h renamed from include/linux/pktcdvd.h~packet-limit-request-size +0 -2
diff -puN include/linux/pktcdvd.h~packet-limit-request-size include/linux/pktcdvd.h
@@ -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;
 };
 
 /*

_

Signature · 2 lines
Peter Osterlund - [email protected]
http://w1.894.telia.com/~u89404340
#2 lore raw

PATCH 3/3 Fix setting of maximum read speed in CDRW packet writing

pkt_iosched_process_queue() failed to enable maximum read speed on the Iomega Super DVD 8x USB drive. It's better to use 0xffff to set maximum speed, because it is what the driver does at other places, and 0xffff seems to be understood by more drive models than using some other large but non-standard speed.

---

 linux-petero/drivers/block/pktcdvd.c |   12 +++++++-----
 1 files changed, 7 insertions(+), 5 deletions(-)
drivers/block/pktcdvd.c renamed from drivers/block/pktcdvd.c~packet-read-speed +7 -5
diff -puN drivers/block/pktcdvd.c~packet-read-speed drivers/block/pktcdvd.c
@@ -63,6 +63,8 @@
 #define VPRINTK(fmt, args...)
 #endif
 
+#define MAX_SPEED 0xffff
+
 #define ZONE(sector, pd) (((sector) + (pd)->offset) & ~((pd)->settings.size - 1))
 
 
@@ -400,9 +402,9 @@ static int pkt_set_speed(struct pktcdvd_
 	int ret;
 
 	write_speed = write_speed * 177; /* should be 176.4, but CD-RWs rounds down */
-	write_speed = min_t(unsigned, write_speed, 0xffff);
+	write_speed = min_t(unsigned, write_speed, MAX_SPEED);
 	read_speed = read_speed * 177;
-	read_speed = min_t(unsigned, read_speed, 0xffff);
+	read_speed = min_t(unsigned, read_speed, MAX_SPEED);
 
 	init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
 	cgc.sense = &sense;
@@ -519,7 +521,7 @@ static void pkt_iosched_process_queue(st
 		if (pd->iosched.successive_reads >= HI_SPEED_SWITCH) {
 			if (pd->read_speed == pd->write_speed) {
 				pd->read_speed = 0xff;
-				pkt_set_speed(pd, pd->write_speed, pd->read_speed);
+				pkt_set_speed(pd, pd->write_speed, MAX_SPEED);
 			}
 		} else {
 			if (pd->read_speed != pd->write_speed) {
@@ -1919,7 +1921,7 @@ static int pkt_open_dev(struct pktcdvd_d
 		spin_unlock_irq(q->queue_lock);
 		set_bit(PACKET_WRITABLE, &pd->flags);
 	} else {
-		pkt_set_speed(pd, 0xffff, 0xffff);
+		pkt_set_speed(pd, MAX_SPEED, MAX_SPEED);
 		clear_bit(PACKET_WRITABLE, &pd->flags);
 	}
 
@@ -1955,7 +1957,7 @@ static void pkt_release_dev(struct pktcd
 	pkt_lock_door(pd, 0);
 
 	q = bdev_get_queue(pd->bdev);
-	pkt_set_speed(pd, 0xffff, 0xffff);
+	pkt_set_speed(pd, MAX_SPEED, MAX_SPEED);
 	spin_lock_irq(q->queue_lock);
 	q->elevator.elevator_completed_req_fn = pd->cdrw.elv_completed_req_fn;
 	spin_unlock_irq(q->queue_lock);

_

Signature · 2 lines
Peter Osterlund - [email protected]
http://w1.894.telia.com/~u89404340