From 1b1cc1856070df2e68ece8291cd56d77fafcfeb6 Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 21 Oct 2003 21:39:04 +0000 Subject: [PATCH] - dev_read_only patch against 2.6.0-test6 NOTE: it differs from 2.4's patch: 1) struct block_device * must be passed instead of kdev_t 2) dev_set_rdonly() sets flag in request queue. after that queue becomes rdonly --- .../patches/dev_read_only_2.6.0.patch | 81 ++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 lustre/kernel_patches/patches/dev_read_only_2.6.0.patch diff --git a/lustre/kernel_patches/patches/dev_read_only_2.6.0.patch b/lustre/kernel_patches/patches/dev_read_only_2.6.0.patch new file mode 100644 index 0000000..f0f79df --- /dev/null +++ b/lustre/kernel_patches/patches/dev_read_only_2.6.0.patch @@ -0,0 +1,81 @@ + drivers/block/ll_rw_blk.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++ + include/linux/blkdev.h | 1 + 2 files changed, 50 insertions(+) + +--- 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 ++++ linux-2.6.0-test6-alexey/drivers/block/ll_rw_blk.c 2003-10-22 01:35:56.000000000 +0400 +@@ -2213,6 +2213,9 @@ end_io: + + if (test_bit(QUEUE_FLAG_DEAD, &q->queue_flags)) + goto end_io; ++ if (test_bit(QUEUE_FLAG_RDONLY, &q->queue_flags) ++ && bio->bi_rw == WRITE) ++ goto end_io; + + /* + * If this device has partitions, remap block n +@@ -2867,6 +2870,52 @@ void blk_unregister_queue(struct gendisk + } + } + ++#define MAX_RDONLY_DEVS 16 ++ ++static struct block_device *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 (bdev) { ++ request_queue_t *q; ++ ++ q = bdev_get_queue(bdev); ++ if (!q) { ++ printk(KERN_ERR ++ "dev_set_rdonly() for non-existing device\n"); ++ return; ++ } ++ printk(KERN_WARNING "Turning device %s read-only\n", ++ bdev->bd_disk ? bdev->bd_disk->disk_name : "?"); ++ set_bit(QUEUE_FLAG_RDONLY, &q->queue_flags); ++ rdonly_devs[no_write] = bdev; ++ } ++} ++ ++void dev_clear_rdonly(int no_write) ++{ ++ request_queue_t *q; ++ ++ if (rdonly_devs[no_write] == NULL) ++ return; ++ ++ q = bdev_get_queue(rdonly_devs[no_write]); ++ if (!q) { ++ printk(KERN_ERR ++ "dev_clear_rdonly: no queue for device at slot %d\n", ++ no_write); ++ return; ++ } ++ clear_bit(QUEUE_FLAG_RDONLY, &q->queue_flags); ++ rdonly_devs[no_write] = NULL; ++} ++ ++EXPORT_SYMBOL(dev_set_rdonly); ++EXPORT_SYMBOL(dev_clear_rdonly); + + EXPORT_SYMBOL(process_that_request_first); + EXPORT_SYMBOL(end_that_request_first); +--- linux-2.6.0-test6/include/linux/blkdev.h~dev_read_only_2.6.0 2003-10-14 19:57:05.000000000 +0400 ++++ linux-2.6.0-test6-alexey/include/linux/blkdev.h 2003-10-21 23:31:18.000000000 +0400 +@@ -367,6 +367,7 @@ struct request_queue + #define QUEUE_FLAG_READFULL 3 /* write queue has been filled */ + #define QUEUE_FLAG_WRITEFULL 4 /* read queue has been filled */ + #define QUEUE_FLAG_DEAD 5 /* queue being torn down */ ++#define QUEUE_FLAG_RDONLY 6 /* queue accepts reads only */ + + #define blk_queue_plugged(q) !list_empty(&(q)->plug_list) + #define blk_queue_tagged(q) test_bit(QUEUE_FLAG_QUEUED, &(q)->queue_flags) + +_ -- 1.8.3.1