Whamcloud - gitweb
b=10651
[fs/lustre-release.git] / lustre / kernel_patches / patches / dev_read_only_2.4.20-rh.patch
1 diff -ur linux-2.4.20-rh.orig/drivers/block/ll_rw_blk.c linux-2.4.20-rh/drivers/block/ll_rw_blk.c
2 --- linux-2.4.20-rh.orig/drivers/block/ll_rw_blk.c      2004-05-27 11:25:09.000000000 -0700
3 +++ linux-2.4.20-rh/drivers/block/ll_rw_blk.c   2005-04-08 09:02:14.734804881 -0700
4 @@ -645,6 +645,84 @@ void set_device_ro(kdev_t dev,int flag)
5         else ro_bits[major][minor >> 5] &= ~(1 << (minor & 31));
6  }
7  
8 +/*
9 + * Debug code for turning block devices read-only *silently* (will
10 + * discard writes silently).  This is only for filesystem crash/recovery
11 + * testing.
12 + */
13 +struct deventry {
14 +       kdev_t dev;
15 +       struct deventry *next;
16 +};
17 +
18 +static struct deventry *devlist = NULL;
19 +static spinlock_t devlock = SPIN_LOCK_UNLOCKED;
20 +
21 +int dev_check_rdonly(kdev_t dev) {
22 +       struct deventry *cur;
23 +       spin_lock(&devlock);
24 +       cur = devlist;
25 +       while(cur) {
26 +               if (dev == cur->dev) {
27 +                       spin_unlock(&devlock);
28 +                       return 1;
29 +               }
30 +               cur = cur->next;
31 +       }
32 +       spin_unlock(&devlock);
33 +       return 0;
34 +}
35 +
36 +void dev_set_rdonly(kdev_t dev)
37 +{
38 +       struct deventry *newdev, *cur;
39 +       newdev = kmalloc(sizeof(struct deventry), GFP_KERNEL);
40 +       if (!newdev) return;
41 +
42 +       spin_lock(&devlock);
43 +       cur = devlist;
44 +       while(cur) {
45 +               if (dev == cur->dev) {
46 +                       spin_unlock(&devlock);
47 +                       kfree(newdev);
48 +                       return;
49 +               }
50 +               cur = cur->next;
51 +       }
52 +       newdev->dev = dev;
53 +       newdev->next = devlist;
54 +       devlist = newdev;
55 +       spin_unlock(&devlock);
56 +       printk(KERN_WARNING "Turning device %s read-only\n", bdevname(dev));
57 +}
58 +
59 +void dev_clear_rdonly(kdev_t dev) {
60 +       struct deventry *cur, *last = NULL;
61 +
62 +       spin_lock(&devlock);
63 +       cur = devlist;
64 +       while(cur) {
65 +               if (dev == cur->dev) {
66 +                       if (last)
67 +                               last->next = cur->next;
68 +                       else
69 +                               devlist = cur->next;
70 +                       spin_unlock(&devlock);
71 +                       kfree(cur);
72 +                       printk(KERN_WARNING "Removing read-only on %s\n",
73 +                              bdevname(dev));
74 +                       return;
75 +               }
76 +               last = cur;
77 +               cur = cur->next;
78 +       }
79 +       spin_unlock(&devlock);
80 +}
81 +
82 +EXPORT_SYMBOL(dev_set_rdonly);
83 +EXPORT_SYMBOL(dev_check_rdonly);
84 +EXPORT_SYMBOL(dev_clear_rdonly);
85 +
86  inline void drive_stat_acct (kdev_t dev, int rw,
87                                 unsigned long nr_sectors, int new_io)
88  {
89 @@ -1183,6 +1263,10 @@ void generic_make_request (int rw, struc
90                         buffer_IO_error(bh);
91                         break;
92                 }
93 +               if ((rw & WRITE)&&(dev_check_rdonly(bh->b_rdev))) {
94 +                       bh->b_end_io(bh, 0);
95 +                       break;
96 +               }
97         } while (q->make_request_fn(q, rw, bh));
98  }
99  
100 diff -ur linux-2.4.20-rh.orig/fs/block_dev.c linux-2.4.20-rh/fs/block_dev.c
101 --- linux-2.4.20-rh.orig/fs/block_dev.c 2002-08-02 17:39:45.000000000 -0700
102 +++ linux-2.4.20-rh/fs/block_dev.c      2005-04-08 09:02:15.005789333 -0700
103 @@ -645,6 +645,7 @@ int blkdev_put(struct block_device *bdev
104                 bdev->bd_op = NULL;
105         unlock_kernel();
106         up(&bdev->bd_sem);
107 +       dev_clear_rdonly(to_kdev_t(bdev->bd_dev));
108         bdput(bdev);
109         return ret;
110  }
111 diff -ur linux-2.4.20-rh.orig/include/linux/fs.h linux-2.4.20-rh/include/linux/fs.h
112 --- linux-2.4.20-rh.orig/include/linux/fs.h     2004-05-27 11:25:09.000000000 -0700
113 +++ linux-2.4.20-rh/include/linux/fs.h  2005-04-08 09:02:14.915794496 -0700
114 @@ -1425,6 +1425,10 @@ extern struct buffer_head * getblk(kdev_
115  extern void ll_rw_block(int, int, struct buffer_head * bh[]);
116  extern void submit_bh(int, struct buffer_head *);
117  extern int is_read_only(kdev_t);
118 +#define HAVE_CLEAR_RDONLY_ON_PUT
119 +void dev_set_rdonly(kdev_t dev);
120 +int dev_check_rdonly(kdev_t dev);
121 +void dev_clear_rdonly(kdev_t dev);
122  extern void __brelse(struct buffer_head *);
123  static inline void brelse(struct buffer_head *buf)
124  {
125