1 drivers/block/ll_rw_blk.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++
2 include/linux/blkdev.h | 1
3 2 files changed, 50 insertions(+)
5 --- linux-2.6.0-test6/drivers/block/ll_rw_blk.c~dev_read_only_2.6.0 2003-10-14 19:56:55.000000000 +0400
6 +++ linux-2.6.0-test6-alexey/drivers/block/ll_rw_blk.c 2003-10-22 01:35:56.000000000 +0400
7 @@ -2213,6 +2213,9 @@ end_io:
9 if (test_bit(QUEUE_FLAG_DEAD, &q->queue_flags))
11 + if (test_bit(QUEUE_FLAG_RDONLY, &q->queue_flags)
12 + && bio->bi_rw == WRITE)
16 * If this device has partitions, remap block n
17 @@ -2867,6 +2870,52 @@ void blk_unregister_queue(struct gendisk
21 +#define MAX_RDONLY_DEVS 16
23 +static struct block_device *rdonly_devs[MAX_RDONLY_DEVS] = {0, };
26 + * Debug code for turning block devices "read-only" (will discard writes
27 + * silently). This is for filesystem crash/recovery testing.
29 +void dev_set_rdonly(struct block_device *bdev, int no_write)
34 + q = bdev_get_queue(bdev);
37 + "dev_set_rdonly() for non-existing device\n");
40 + printk(KERN_WARNING "Turning device %s read-only\n",
41 + bdev->bd_disk ? bdev->bd_disk->disk_name : "?");
42 + set_bit(QUEUE_FLAG_RDONLY, &q->queue_flags);
43 + rdonly_devs[no_write] = bdev;
47 +void dev_clear_rdonly(int no_write)
51 + if (rdonly_devs[no_write] == NULL)
54 + q = bdev_get_queue(rdonly_devs[no_write]);
57 + "dev_clear_rdonly: no queue for device at slot %d\n",
61 + clear_bit(QUEUE_FLAG_RDONLY, &q->queue_flags);
62 + rdonly_devs[no_write] = NULL;
65 +EXPORT_SYMBOL(dev_set_rdonly);
66 +EXPORT_SYMBOL(dev_clear_rdonly);
68 EXPORT_SYMBOL(process_that_request_first);
69 EXPORT_SYMBOL(end_that_request_first);
70 --- linux-2.6.0-test6/include/linux/blkdev.h~dev_read_only_2.6.0 2003-10-14 19:57:05.000000000 +0400
71 +++ linux-2.6.0-test6-alexey/include/linux/blkdev.h 2003-10-21 23:31:18.000000000 +0400
72 @@ -367,6 +367,7 @@ struct request_queue
73 #define QUEUE_FLAG_READFULL 3 /* write queue has been filled */
74 #define QUEUE_FLAG_WRITEFULL 4 /* read queue has been filled */
75 #define QUEUE_FLAG_DEAD 5 /* queue being torn down */
76 +#define QUEUE_FLAG_RDONLY 6 /* queue accepts reads only */
78 #define blk_queue_plugged(q) !list_empty(&(q)->plug_list)
79 #define blk_queue_tagged(q) test_bit(QUEUE_FLAG_QUEUED, &(q)->queue_flags)