On Wed, 07 Jan 2004 18:03:48 +0100, Ruben Garcia wrote:
The loop device advertises a block size of 1024 even when configured over a cdrom.
When burning a ext2 on a cd, and mounting it directly, I get:
blocksize=2048;
when I losetup /dev/loop0 /dev/cdrom, and then try to mount, I get:
blocksize=1024; and then misaligned transfer; this results in not being able to read the superblock.
The loop device should be changed to export the same blocksize of the underlying device
Huh, if you look at loop.c it appears to do that already (line 735) but
it doesn't. This patch makes it so.
--- linux-2.6.0/drivers/block/loop.c-orig 2004-01-07 22:47:37.755375858 -0500
+++ linux-2.6.0/drivers/block/loop.c 2004-01-07 22:48:04.990990082 -0500
@@ -732,8 +732,6 @@
mapping_set_gfp_mask(inode->i_mapping,
lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS));
- set_blocksize(bdev, lo_blocksize);
-
lo->lo_bio = lo->lo_biotail = NULL;
/*
@@ -749,6 +747,7 @@
if (S_ISBLK(inode->i_mode)) {
request_queue_t *q = bdev_get_queue(lo_device);
+ blk_queue_hardsect_size(lo->lo_queue, q->hardsect_size);
blk_queue_max_sectors(lo->lo_queue, q->max_sectors);
blk_queue_max_phys_segments(lo->lo_queue,q->max_phys_segments);
blk_queue_max_hw_segments(lo->lo_queue, q->max_hw_segments);
@@ -757,6 +756,8 @@
blk_queue_merge_bvec(lo->lo_queue, q->merge_bvec_fn);
}
+ set_blocksize(bdev, lo_blocksize);
+
kernel_thread(loop_thread, lo, CLONE_KERNEL);
down(&lo->lo_sem);
HTH,