Whamcloud - gitweb
f0f79dfdb1cb95259fd21f9fb4e0ee57e9b46bad
[fs/lustre-release.git] / lustre / kernel_patches / patches / dev_read_only_2.6.0.patch
1  drivers/block/ll_rw_blk.c |   49 ++++++++++++++++++++++++++++++++++++++++++++++
2  include/linux/blkdev.h    |    1 
3  2 files changed, 50 insertions(+)
4
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:
8  
9                 if (test_bit(QUEUE_FLAG_DEAD, &q->queue_flags))
10                         goto end_io;
11 +               if (test_bit(QUEUE_FLAG_RDONLY, &q->queue_flags)
12 +                               && bio->bi_rw == WRITE)
13 +                       goto end_io;
14  
15                 /*
16                  * If this device has partitions, remap block n
17 @@ -2867,6 +2870,52 @@ void blk_unregister_queue(struct gendisk
18         }
19  }
20  
21 +#define MAX_RDONLY_DEVS                16
22 +
23 +static struct block_device *rdonly_devs[MAX_RDONLY_DEVS] = {0, };
24 +
25 +/*
26 + * Debug code for turning block devices "read-only" (will discard writes
27 + * silently).  This is for filesystem crash/recovery testing.
28 + */
29 +void dev_set_rdonly(struct block_device *bdev, int no_write)
30 +{
31 +       if (bdev) {
32 +               request_queue_t *q;
33 +
34 +               q = bdev_get_queue(bdev);
35 +               if (!q) {
36 +                       printk(KERN_ERR
37 +                               "dev_set_rdonly() for non-existing device\n");
38 +                       return;
39 +               }
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;
44 +       }
45 +}
46 +
47 +void dev_clear_rdonly(int no_write)
48 +{
49 +       request_queue_t *q;
50 +       
51 +       if (rdonly_devs[no_write] == NULL)
52 +               return;
53 +       
54 +       q = bdev_get_queue(rdonly_devs[no_write]);
55 +       if (!q) {
56 +               printk(KERN_ERR
57 +                       "dev_clear_rdonly: no queue for device at slot %d\n",
58 +                       no_write);
59 +               return;
60 +       }
61 +       clear_bit(QUEUE_FLAG_RDONLY, &q->queue_flags);
62 +       rdonly_devs[no_write] = NULL;
63 +}
64 +
65 +EXPORT_SYMBOL(dev_set_rdonly);
66 +EXPORT_SYMBOL(dev_clear_rdonly);
67  
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 */
77  
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)
80
81 _