From: Chris Mason I think Andrew and I managed to mismerge the loop setup race fix. loop_set_fd is using get_capacity() to read the size of the disk and sending that to bd_set_size. But, it is doing this before calling set_capacity, so the size being used is wrong. This should clean things up. --- 25-akpm/drivers/block/loop.c | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) diff -puN drivers/block/loop.c~loop-bd_setsize-fix drivers/block/loop.c --- 25/drivers/block/loop.c~loop-bd_setsize-fix Mon Mar 29 15:54:23 2004 +++ 25-akpm/drivers/block/loop.c Mon Mar 29 15:54:23 2004 @@ -687,7 +687,6 @@ static int loop_set_fd(struct loop_devic lo->transfer = NULL; lo->ioctl = NULL; lo->lo_sizelimit = 0; - bd_set_size(bdev,(loff_t)get_capacity(disks[lo->lo_number])<<9); lo->old_gfp_mask = mapping_gfp_mask(mapping); mapping_set_gfp_mask(mapping, lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS)); @@ -702,6 +701,7 @@ static int loop_set_fd(struct loop_devic lo->lo_queue->unplug_fn = loop_unplug; set_capacity(disks[lo->lo_number], size); + bd_set_size(bdev, size << 9); set_blocksize(bdev, lo_blocksize); _