Index: linux-2.6.10/drivers/block/ll_rw_blk.c
===================================================================
--- linux-2.6.10.orig/drivers/block/ll_rw_blk.c 2004-12-25 05:33:59.000000000 +0800
-+++ linux-2.6.10/drivers/block/ll_rw_blk.c 2005-04-07 00:37:34.299974720 +0800
++++ linux-2.6.10/drivers/block/ll_rw_blk.c 2005-04-08 12:35:49.785573840 +0800
@@ -2598,6 +2598,8 @@
set_bit(BIO_EOF, &bio->bi_flags);
}
/*
* If this device has partitions, remap block n
* of partition p to block n+start(p) of the disk.
-@@ -3156,6 +3165,91 @@
+@@ -3156,6 +3165,79 @@
EXPORT_SYMBOL(swap_io_context);
/*
+ */
+struct deventry {
+ dev_t dev;
-+ struct deventry *next;
++ struct list_head dev_list;
+};
-+
-+static struct deventry *devlist = NULL;
++static struct list_head devlist = LIST_HEAD_INIT(devlist);
+static spinlock_t devlock = SPIN_LOCK_UNLOCKED;
+
+int dev_check_rdonly(struct block_device *bdev)
+ struct deventry *cur;
+ if (!bdev) return 0;
+ spin_lock(&devlock);
-+ cur = devlist;
-+ while(cur) {
++ list_for_each_entry(cur, &devlist, dev_list) {
+ if (bdev->bd_dev == cur->dev) {
+ spin_unlock(&devlock);
+ return 1;
+ }
-+ cur = cur->next;
+ }
+ spin_unlock(&devlock);
+ return 0;
+ return;
+
+ spin_lock(&devlock);
-+ cur = devlist;
-+ while(cur) {
++ list_for_each_entry(cur, &devlist, dev_list) {
+ 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;
++ list_add(&newdev->dev_list, &devlist);
+ spin_unlock(&devlock);
+ printk(KERN_WARNING "Turning device %s read-only\n",
+ bdev->bd_disk ? bdev->bd_disk->disk_name : "?");
+
+void dev_clear_rdonly(struct block_device *bdev)
+{
-+ struct deventry *cur, *last = NULL;
++ struct deventry *cur, *tmp;
+ if (!bdev) return;
+ spin_lock(&devlock);
-+ cur = devlist;
-+ while(cur) {
++ list_for_each_entry_safe(cur, tmp, &devlist, dev_list) {
+ if (bdev->bd_dev == cur->dev) {
-+ if (last)
-+ last->next = cur->next;
-+ else
-+ devlist = cur->next;
++ list_del_init(&cur->dev_list);
++ kfree(cur);
+ spin_unlock(&devlock);
-+ kfree(cur);
+ printk(KERN_WARNING "Removing read-only on %s\n",
+ bdev->bd_disk ? bdev->bd_disk->disk_name : "?");
+ return;
+ }
-+ last = cur;
-+ cur = cur->next;
+ }
+ spin_unlock(&devlock);
+}