Print out numeric device if no name can be found for 2.6.
r=nathan
/* this is cfs's dev_rdonly check */
if (bio->bi_rw == WRITE &&
- dev_check_rdonly(bio->bi_bdev->bd_dev)) {
-+ dev_check_rdonly(bio->bi_bdev)) {
++ dev_check_rdonly(bio->bi_bdev)) {
bio_endio(bio, bio->bi_size, 0);
break;
}
-@@ -3086,53 +3086,85 @@ void swap_io_context(struct io_context *
+@@ -3086,53 +3086,86 @@ void swap_io_context(struct io_context *
*ioc2 = temp;
}
*/
-void dev_set_rdonly(struct block_device *bdev, int no_write)
+struct deventry {
-+ dev_t dev;
-+ struct deventry *next;
++ dev_t dev;
++ struct deventry *next;
+};
+
+static struct deventry *devlist = NULL;
- printk(KERN_ALERT "%s:%d illegal arg %d (max %d)\n",
- __FILE__, __LINE__, no_write, MAX_RDONLY_DEVS);
- return;
-+ struct deventry *cur;
-+ if (!bdev) return 0;
-+ spin_lock(&devlock);
-+ cur = devlist;
-+ while(cur) {
-+ if (bdev->bd_dev == cur->dev) {
-+ spin_unlock(&devlock);
-+ return 1;
++ struct deventry *cur;
++ if (!bdev) return 0;
++ spin_lock(&devlock);
++ cur = devlist;
++ while(cur) {
++ if (bdev->bd_dev == cur->dev) {
++ spin_unlock(&devlock);
++ return 1;
}
-
- if (bdev) {
- bdev->bd_disk ? bdev->bd_disk->disk_name : "?",
- no_write);
- rdonly_devs[no_write] = bdev->bd_dev;
-+ cur = cur->next;
++ cur = cur->next;
}
-+ spin_unlock(&devlock);
-+ return 0;
++ spin_unlock(&devlock);
++ return 0;
}
-void dev_clear_rdonly(int no_write)
- __FILE__, __LINE__, no_write, MAX_RDONLY_DEVS);
- return;
- }
-+ struct deventry *newdev, *cur;
++ struct deventry *newdev, *cur;
- if (rdonly_devs[no_write] == 0)
-+ if (!bdev)
-+ return;
-+ newdev = kmalloc(sizeof(struct deventry), GFP_KERNEL);
-+ if (!newdev)
++ if (!bdev)
++ return;
++ newdev = kmalloc(sizeof(struct deventry), GFP_KERNEL);
++ if (!newdev)
return;
- printk(KERN_WARNING "Clearing read-only at %d\n", no_write);
- if (rdonly_devs[i] == dev)
- return 1;
- return 0;
-+ spin_lock(&devlock);
-+ cur = devlist;
-+ while(cur) {
-+ if (bdev->bd_dev == cur->dev) {
-+ spin_unlock(&devlock);
-+ kfree(newdev);
-+ return;
-+}
-+ cur = cur->next;
-+ }
-+ newdev->dev = bdev->bd_dev;
-+ newdev->next = devlist;
-+ devlist = newdev;
-+ spin_unlock(&devlock);
-+ printk(KERN_WARNING "Turning device %s read-only\n",
-+ bdev->bd_disk ? bdev->bd_disk->disk_name : "?");
++ spin_lock(&devlock);
++ cur = devlist;
++ while(cur) {
++ if (bdev->bd_dev == cur->dev) {
++ spin_unlock(&devlock);
++ kfree(newdev);
++ return;
++ }
++ cur = cur->next;
++ }
++ newdev->dev = bdev->bd_dev;
++ newdev->next = devlist;
++ devlist = newdev;
++ spin_unlock(&devlock);
++ printk(KERN_WARNING "Turning device %s (%#x) read-only\n",
++ bdev->bd_disk ? bdev->bd_disk->disk_name : "", bdev->bd_dev);
+}
+
+void dev_clear_rdonly(struct block_device *bdev)
+{
-+ struct deventry *cur, *last = NULL;
-+ if (!bdev) return;
-+ spin_lock(&devlock);
-+ cur = devlist;
-+ while(cur) {
-+ if (bdev->bd_dev == cur->dev) {
-+ if (last)
-+ last->next = cur->next;
-+ else
-+ devlist = cur->next;
-+ spin_unlock(&devlock);
-+ kfree(cur);
-+ printk(KERN_WARNING "Removing read-only on %s\n",
-+ bdev->bd_disk ? bdev->bd_disk->disk_name : "?");
++ struct deventry *cur, *last = NULL;
++ if (!bdev) return;
++ spin_lock(&devlock);
++ cur = devlist;
++ while(cur) {
++ if (bdev->bd_dev == cur->dev) {
++ if (last)
++ last->next = cur->next;
++ else
++ devlist = cur->next;
++ spin_unlock(&devlock);
++ kfree(cur);
++ printk(KERN_WARNING "Removing read-only on %s (%#x)\n",
++ bdev->bd_disk ? bdev->bd_disk->disk_name :
++ "unknown block", bdev->bd_dev);
+ return;
-+ }
-+ last = cur;
-+ cur = cur->next;
-+ }
-+ spin_unlock(&devlock);
++ }
++ last = cur;
++ cur = cur->next;
++ }
++ spin_unlock(&devlock);
}
EXPORT_SYMBOL(dev_set_rdonly);
+ /* this is cfs's dev_rdonly check */
+ if (bio->bi_rw == WRITE &&
-+ dev_check_rdonly(bio->bi_bdev)) {
++ dev_check_rdonly(bio->bi_bdev)) {
+ bio_endio(bio, bio->bi_size, 0);
+ break;
+ }
/*
* If this device has partitions, remap block n
* of partition p to block n+start(p) of the disk.
-@@ -3078,6 +3087,91 @@ void swap_io_context(struct io_context *
+@@ -3078,6 +3087,92 @@ void swap_io_context(struct io_context *
}
/*
+ * silently). This is for filesystem crash/recovery testing.
+ */
+struct deventry {
-+ dev_t dev;
-+ struct deventry *next;
++ dev_t dev;
++ struct deventry *next;
+};
+
+static struct deventry *devlist = NULL;
+
+int dev_check_rdonly(struct block_device *bdev)
+{
-+ struct deventry *cur;
-+ if (!bdev) return 0;
-+ spin_lock(&devlock);
-+ cur = devlist;
-+ while(cur) {
-+ if (bdev->bd_dev == cur->dev) {
-+ spin_unlock(&devlock);
-+ return 1;
++ struct deventry *cur;
++ if (!bdev) return 0;
++ spin_lock(&devlock);
++ cur = devlist;
++ while(cur) {
++ if (bdev->bd_dev == cur->dev) {
++ spin_unlock(&devlock);
++ return 1;
+ }
-+ cur = cur->next;
++ cur = cur->next;
+ }
-+ spin_unlock(&devlock);
-+ return 0;
++ spin_unlock(&devlock);
++ return 0;
+}
+
+void dev_set_rdonly(struct block_device *bdev)
+{
-+ struct deventry *newdev, *cur;
++ struct deventry *newdev, *cur;
+
-+ if (!bdev)
-+ return;
-+ newdev = kmalloc(sizeof(struct deventry), GFP_KERNEL);
-+ if (!newdev)
++ if (!bdev)
++ return;
++ newdev = kmalloc(sizeof(struct deventry), GFP_KERNEL);
++ if (!newdev)
+ return;
+
-+ spin_lock(&devlock);
-+ cur = devlist;
-+ while(cur) {
-+ if (bdev->bd_dev == cur->dev) {
-+ spin_unlock(&devlock);
-+ kfree(newdev);
-+ return;
-+}
-+ cur = cur->next;
-+ }
-+ newdev->dev = bdev->bd_dev;
-+ newdev->next = devlist;
-+ devlist = newdev;
-+ spin_unlock(&devlock);
-+ printk(KERN_WARNING "Turning device %s read-only\n",
-+ bdev->bd_disk ? bdev->bd_disk->disk_name : "?");
++ spin_lock(&devlock);
++ cur = devlist;
++ while(cur) {
++ if (bdev->bd_dev == cur->dev) {
++ spin_unlock(&devlock);
++ kfree(newdev);
++ return;
++ }
++ cur = cur->next;
++ }
++ newdev->dev = bdev->bd_dev;
++ newdev->next = devlist;
++ devlist = newdev;
++ spin_unlock(&devlock);
++ printk(KERN_WARNING "Turning device %s (%#x) read-only\n",
++ bdev->bd_disk ? bdev->bd_disk->disk_name : "", bdev->bd_dev);
+}
+
+void dev_clear_rdonly(struct block_device *bdev)
+{
-+ struct deventry *cur, *last = NULL;
-+ if (!bdev) return;
-+ spin_lock(&devlock);
-+ cur = devlist;
-+ while(cur) {
-+ if (bdev->bd_dev == cur->dev) {
-+ if (last)
-+ last->next = cur->next;
-+ else
-+ devlist = cur->next;
-+ spin_unlock(&devlock);
-+ kfree(cur);
-+ printk(KERN_WARNING "Removing read-only on %s\n",
-+ bdev->bd_disk ? bdev->bd_disk->disk_name : "?");
++ struct deventry *cur, *last = NULL;
++ if (!bdev) return;
++ spin_lock(&devlock);
++ cur = devlist;
++ while(cur) {
++ if (bdev->bd_dev == cur->dev) {
++ if (last)
++ last->next = cur->next;
++ else
++ devlist = cur->next;
++ spin_unlock(&devlock);
++ kfree(cur);
++ printk(KERN_WARNING "Removing read-only on %s (%#x)\n",
++ bdev->bd_disk ? bdev->bd_disk->disk_name :
++ "unknown block", bdev->bd_dev);
+ return;
-+ }
-+ last = cur;
-+ cur = cur->next;
-+ }
-+ spin_unlock(&devlock);
++ }
++ last = cur;
++ cur = cur->next;
++ }
++ spin_unlock(&devlock);
+}
+
+EXPORT_SYMBOL(dev_set_rdonly);
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
--- linux-2.4.20-rh.orig/drivers/block/ll_rw_blk.c 2004-05-27 11:25:09.000000000 -0700
+++ linux-2.4.20-rh/drivers/block/ll_rw_blk.c 2005-04-08 09:02:14.734804881 -0700
-@@ -645,6 +645,86 @@ void set_device_ro(kdev_t dev,int flag)
+@@ -645,6 +645,84 @@ void set_device_ro(kdev_t dev,int flag)
else ro_bits[major][minor >> 5] &= ~(1 << (minor & 31));
}
-+
+/*
-+ * Debug code for turning block devices read-only *silently* (will
++ * Debug code for turning block devices read-only *silently* (will
+ * discard writes silently). This is only for filesystem crash/recovery
+ * testing.
+ */
+struct deventry {
-+ kdev_t dev;
-+ struct deventry *next;
++ kdev_t dev;
++ struct deventry *next;
+};
+
+static struct deventry *devlist = NULL;
-+static spinlock_t devlock = SPIN_LOCK_UNLOCKED;
++static spinlock_t devlock = SPIN_LOCK_UNLOCKED;
+
+int dev_check_rdonly(kdev_t dev) {
-+ struct deventry *cur;
-+ spin_lock(&devlock);
-+ cur = devlist;
-+ while(cur) {
-+ if (dev == cur->dev) {
-+ spin_unlock(&devlock);
-+ return 1;
-+ }
-+ cur = cur->next;
-+ }
-+ spin_unlock(&devlock);
-+ return 0;
++ struct deventry *cur;
++ spin_lock(&devlock);
++ cur = devlist;
++ while(cur) {
++ if (dev == cur->dev) {
++ spin_unlock(&devlock);
++ return 1;
++ }
++ cur = cur->next;
++ }
++ spin_unlock(&devlock);
++ return 0;
+}
+
+void dev_set_rdonly(kdev_t dev)
+{
-+ struct deventry *newdev, *cur;
-+ newdev = kmalloc(sizeof(struct deventry), GFP_KERNEL);
-+ if (!newdev) return;
++ struct deventry *newdev, *cur;
++ newdev = kmalloc(sizeof(struct deventry), GFP_KERNEL);
++ if (!newdev) return;
+
-+ spin_lock(&devlock);
-+ cur = devlist;
-+ while(cur) {
-+ if (dev == cur->dev) {
-+ spin_unlock(&devlock);
-+ kfree(newdev);
-+ return;
-+ }
-+ cur = cur->next;
-+ }
-+ newdev->dev = dev;
-+ newdev->next = devlist;
-+ devlist = newdev;
-+ spin_unlock(&devlock);
-+ printk(KERN_WARNING "Turning device %s read-only\n",
-+ bdevname(dev));
++ spin_lock(&devlock);
++ cur = devlist;
++ while(cur) {
++ if (dev == cur->dev) {
++ spin_unlock(&devlock);
++ kfree(newdev);
++ return;
++ }
++ cur = cur->next;
++ }
++ newdev->dev = dev;
++ newdev->next = devlist;
++ devlist = newdev;
++ spin_unlock(&devlock);
++ printk(KERN_WARNING "Turning device %s read-only\n", bdevname(dev));
+}
+
+void dev_clear_rdonly(kdev_t dev) {
-+ struct deventry *cur, *last = NULL;
-+ spin_lock(&devlock);
-+ cur = devlist;
-+ while(cur) {
-+ if (dev == cur->dev) {
-+ if (last)
-+ last->next = cur->next;
-+ else
-+ devlist = cur->next;
-+ spin_unlock(&devlock);
-+ kfree(cur);
-+ printk(KERN_WARNING "Removing read-only on %s\n",
-+ bdevname(dev));
-+ return;
-+ }
-+ last = cur;
-+ cur = cur->next;
-+ }
-+ spin_unlock(&devlock);
++ struct deventry *cur, *last = NULL;
++
++ spin_lock(&devlock);
++ cur = devlist;
++ while(cur) {
++ if (dev == cur->dev) {
++ if (last)
++ last->next = cur->next;
++ else
++ devlist = cur->next;
++ spin_unlock(&devlock);
++ kfree(cur);
++ printk(KERN_WARNING "Removing read-only on %s\n",
++ bdevname(dev));
++ return;
++ }
++ last = cur;
++ cur = cur->next;
++ }
++ spin_unlock(&devlock);
+}
+
+EXPORT_SYMBOL(dev_set_rdonly);
+EXPORT_SYMBOL(dev_check_rdonly);
+EXPORT_SYMBOL(dev_clear_rdonly);
+
-+
inline void drive_stat_acct (kdev_t dev, int rw,
unsigned long nr_sectors, int new_io)
{
buffer_IO_error(bh);
break;
}
-+ if ((rw & WRITE)&&(dev_check_rdonly(bh->b_rdev))) {
-+ bh->b_end_io(bh, 0);
-+ break;
-+ }
++ if ((rw & WRITE)&&(dev_check_rdonly(bh->b_rdev))) {
++ bh->b_end_io(bh, 0);
++ break;
++ }
} while (q->make_request_fn(q, rw, bh));
}
--- linux-2.4.24.orig/drivers/block/ll_rw_blk.c 2005-04-07 17:30:58.978035892 -0700
+++ linux-2.4.24/drivers/block/ll_rw_blk.c 2005-04-07 17:22:04.354867801 -0700
-@@ -691,6 +691,86 @@ void set_device_ro(kdev_t dev,int flag)
+@@ -691,6 +691,85 @@ void set_device_ro(kdev_t dev,int flag)
else ro_bits[major][minor >> 5] &= ~(1 << (minor & 31));
}
+ * testing.
+ */
+struct deventry {
-+ kdev_t dev;
-+ struct deventry *next;
++ kdev_t dev;
++ struct deventry *next;
+};
+
+static struct deventry *devlist = NULL;
+static spinlock_t devlock = SPIN_LOCK_UNLOCKED;
+
+int dev_check_rdonly(kdev_t dev) {
-+ struct deventry *cur;
-+ spin_lock(&devlock);
-+ cur = devlist;
-+ while(cur) {
-+ if (dev == cur->dev) {
-+ spin_unlock(&devlock);
-+ return 1;
-+ }
-+ cur = cur->next;
-+ }
-+ spin_unlock(&devlock);
-+ return 0;
++ struct deventry *cur;
++ spin_lock(&devlock);
++ cur = devlist;
++ while(cur) {
++ if (dev == cur->dev) {
++ spin_unlock(&devlock);
++ return 1;
++ }
++ cur = cur->next;
++ }
++ spin_unlock(&devlock);
++ return 0;
+}
+
+void dev_set_rdonly(kdev_t dev)
+{
-+ struct deventry *newdev, *cur;
-+ newdev = kmalloc(sizeof(struct deventry), GFP_KERNEL);
-+ if (!newdev) return;
++ struct deventry *newdev, *cur;
++ newdev = kmalloc(sizeof(struct deventry), GFP_KERNEL);
++ if (!newdev) return;
+
-+ spin_lock(&devlock);
-+ cur = devlist;
-+ while(cur) {
-+ if (dev == cur->dev) {
-+ spin_unlock(&devlock);
-+ kfree(newdev);
-+ return;
-+ }
-+ cur = cur->next;
-+ }
-+ newdev->dev = dev;
-+ newdev->next = devlist;
-+ devlist = newdev;
-+ spin_unlock(&devlock);
-+ printk(KERN_WARNING "Turning device %s read-only\n",
-+ bdevname(dev));
++ spin_lock(&devlock);
++ cur = devlist;
++ while(cur) {
++ if (dev == cur->dev) {
++ spin_unlock(&devlock);
++ kfree(newdev);
++ return;
++ }
++ cur = cur->next;
++ }
++ newdev->dev = dev;
++ newdev->next = devlist;
++ devlist = newdev;
++ spin_unlock(&devlock);
++ printk(KERN_WARNING "Turning device %s read-only\n", bdevname(dev));
+}
+
+void dev_clear_rdonly(kdev_t dev) {
-+ struct deventry *cur, *last = NULL;
-+ spin_lock(&devlock);
-+ cur = devlist;
-+ while(cur) {
-+ if (dev == cur->dev) {
-+ if (last)
-+ last->next = cur->next;
-+ else
-+ devlist = cur->next;
-+ spin_unlock(&devlock);
-+ kfree(cur);
-+ printk(KERN_WARNING "Removing read-only on %s\n",
-+ bdevname(dev));
-+ return;
-+ }
-+ last = cur;
-+ cur = cur->next;
-+ }
-+ spin_unlock(&devlock);
++ struct deventry *cur, *last = NULL;
++ spin_lock(&devlock);
++ cur = devlist;
++ while(cur) {
++ if (dev == cur->dev) {
++ if (last)
++ last->next = cur->next;
++ else
++ devlist = cur->next;
++ spin_unlock(&devlock);
++ kfree(cur);
++ printk(KERN_WARNING "Removing read-only on %s\n",
++ bdevname(dev));
++ return;
++ }
++ last = cur;
++ cur = cur->next;
++ }
++ spin_unlock(&devlock);
+}
+
+EXPORT_SYMBOL(dev_set_rdonly);
break;
}
-+ if ((rw & WRITE)&&(dev_check_rdonly(bh->b_rdev))) {
-+ bh->b_end_io(bh, 0);
-+ break;
-+ }
++ if ((rw & WRITE)&&(dev_check_rdonly(bh->b_rdev))) {
++ bh->b_end_io(bh, 0);
++ break;
++ }
} while (q->make_request_fn(q, rw, bh));
}
bdev->bd_op = NULL;
unlock_kernel();
up(&bdev->bd_sem);
-+ dev_clear_rdonly(to_kdev_t(bdev->bd_dev));
++ dev_clear_rdonly(to_kdev_t(bdev->bd_dev));
bdput(bdev);
return ret;
}