Whamcloud - gitweb
- 2.6 fixes landed
[fs/lustre-release.git] / lustre / kernel_patches / patches / dev_read_only_2.6.0.patch
index f0f79df..9639f28 100644 (file)
@@ -2,25 +2,31 @@
  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:
+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;
-+              if (test_bit(QUEUE_FLAG_RDONLY, &q->queue_flags)
-+                              && bio->bi_rw == WRITE)
-+                      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
-@@ -2867,6 +2870,52 @@ void blk_unregister_queue(struct gendisk
-       }
+                * of partition p to block n+start(p) of the disk.
+@@ -2805,6 +2812,58 @@
+       *ioc2 = temp;
  }
  
 +#define MAX_RDONLY_DEVS               16
 +
-+static struct block_device *rdonly_devs[MAX_RDONLY_DEVS] = {0, };
++static dev_t rdonly_devs[MAX_RDONLY_DEVS] = {0, };
 +
 +/*
 + * Debug code for turning block devices "read-only" (will discard writes
 + */
 +void dev_set_rdonly(struct block_device *bdev, int no_write)
 +{
-+      if (bdev) {
-+              request_queue_t *q;
++      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;
++      }
 +
-+              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;
++      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)
 +{
-+      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);
++      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;
 +      }
-+      clear_bit(QUEUE_FLAG_RDONLY, &q->queue_flags);
-+      rdonly_devs[no_write] = NULL;
++
++      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);
  
- 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)
-
-_
+ /*
+  * sysfs parts below