drivers/block/ll_rw_blk.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++ include/linux/blkdev.h | 1 2 files changed, 50 insertions(+) Index: linux-2.6.0/drivers/block/ll_rw_blk.c =================================================================== --- linux-2.6.0.orig/drivers/block/ll_rw_blk.c 2004-01-04 15:27:35.000000000 +0300 +++ linux-2.6.0/drivers/block/ll_rw_blk.c 2004-01-07 17:35:57.000000000 +0300 @@ -2298,6 +2298,13 @@ if (test_bit(QUEUE_FLAG_DEAD, &q->queue_flags)) goto end_io; + /* this is cfs's dev_rdonly check */ + if (bio->bi_rw == WRITE && + dev_check_rdonly(bio->bi_bdev->bd_dev)) { + bio_endio(bio, bio->bi_size, 0); + break; + } + /* * If this device has partitions, remap block n * of partition p to block n+start(p) of the disk. @@ -2805,6 +2812,58 @@ *ioc2 = temp; } +#define MAX_RDONLY_DEVS 16 + +static dev_t rdonly_devs[MAX_RDONLY_DEVS] = {0, }; + +/* + * Debug code for turning block devices "read-only" (will discard writes + * silently). This is for filesystem crash/recovery testing. + */ +void dev_set_rdonly(struct block_device *bdev, int no_write) +{ + if (no_write >= MAX_RDONLY_DEVS) { + printk(KERN_ALERT "%s:%d illegal arg %d (max %d)\n", + __FILE__, __LINE__, no_write, MAX_RDONLY_DEVS); + return; + } + + if (bdev) { + printk(KERN_WARNING "Turning device %s read-only at %d\n", + bdev->bd_disk ? bdev->bd_disk->disk_name : "?", + no_write); + rdonly_devs[no_write] = bdev->bd_dev; + } +} + +void dev_clear_rdonly(int no_write) +{ + if (no_write >= MAX_RDONLY_DEVS) { + printk(KERN_ALERT "%s:%d illegal arg %d (max %d)\n", + __FILE__, __LINE__, no_write, MAX_RDONLY_DEVS); + return; + } + + if (rdonly_devs[no_write] == 0) + return; + + printk(KERN_WARNING "Clearing read-only at %d\n", no_write); + rdonly_devs[no_write] = 0; +} + +int dev_check_rdonly(dev_t dev) +{ + int i; + + for (i = 0; i < MAX_RDONLY_DEVS; i++) + if (rdonly_devs[i] == dev) + return 1; + return 0; +} + +EXPORT_SYMBOL(dev_set_rdonly); +EXPORT_SYMBOL(dev_clear_rdonly); +EXPORT_SYMBOL(dev_check_rdonly); /* * sysfs parts below