From 5741f54d7d3bffc5c616bace5cd8122706892004 Mon Sep 17 00:00:00 2001
From: lars <lars@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Date: Wed, 5 Nov 2008 13:03:00 +0000
Subject: [PATCH] fix broken patch.

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@13126 3c298f89-4303-0410-b956-a3cf2f4a3e73
---
 .../patches-2.6.27/065-rootfs_split.patch     | 171 +++++++++---------
 1 file changed, 83 insertions(+), 88 deletions(-)

diff --git a/target/linux/generic-2.6/patches-2.6.27/065-rootfs_split.patch b/target/linux/generic-2.6/patches-2.6.27/065-rootfs_split.patch
index aff95ccec..6fb86b9b4 100644
--- a/target/linux/generic-2.6/patches-2.6.27/065-rootfs_split.patch
+++ b/target/linux/generic-2.6/patches-2.6.27/065-rootfs_split.patch
@@ -373,7 +373,7 @@
  	return err;
  }
  
-@@ -210,7 +246,12 @@ static int block2mtd_write(struct mtd_in
+@@ -210,32 +246,109 @@ static int block2mtd_write(struct mtd_info *mtd, loff_t to, size_t len,
  static void block2mtd_sync(struct mtd_info *mtd)
  {
  	struct block2mtd_dev *dev = mtd->priv;
@@ -387,74 +387,37 @@
  	return;
  }
  
-@@ -288,47 +288,17 @@ static void block2mtd_sync(struct mtd_info *mtd)
- }
- 
  
--static void block2mtd_free_device(struct block2mtd_dev *dev)
--{
--	if (!dev)
--		return;
--
--	kfree(dev->mtd.name);
--
--	if (dev->blkdev) {
--		invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping,
--					0, -1);
--		close_bdev_excl(dev->blkdev);
--	}
--
--	kfree(dev);
--}
--
--
--/* FIXME: ensure that mtd->size % erase_size == 0 */
--static struct block2mtd_dev *add_device(char *devname, int erase_size, const char *mtdname)
 +static int _open_bdev(struct block2mtd_dev *dev)
- {
- 	struct block_device *bdev;
-- 	struct block2mtd_dev *dev;
-- 	struct mtd_partition *part;
-- 	char *name;
- 
--	if (!devname)
--		return NULL;
--
--	dev = kzalloc(sizeof(struct block2mtd_dev), GFP_KERNEL);
--	if (!dev)
--		return NULL;
--
- 	/* Get a handle on the device */
--	bdev = open_bdev_excl(devname, O_RDWR, NULL);
++{
++	struct block_device *bdev;
++
++	/* Get a handle on the device */
 +	bdev = open_bdev_excl(dev->devname, O_RDWR, NULL);
- #ifndef MODULE
- 	if (IS_ERR(bdev)) {
- 
- 		/* We might not have rootfs mounted at this point. Try
- 		   to resolve the device name by other means. */
- 
--		dev_t devt = name_to_dev_t(devname);
++#ifndef MODULE
++	if (IS_ERR(bdev)) {
++
++		/* We might not have rootfs mounted at this point. Try
++		   to resolve the device name by other means. */
++
 +		dev_t devt = name_to_dev_t(dev->devname);
- 		if (devt) {
- 			bdev = open_by_devnum(devt, FMODE_WRITE | FMODE_READ);
- 		}
-@@ -263,17 +295,97 @@ static struct block2mtd_dev *add_device(
- #endif
- 
- 	if (IS_ERR(bdev)) {
--		ERROR("error: cannot open device %s", devname);
--		goto devinit_err;
++		if (devt) {
++			bdev = open_by_devnum(devt, FMODE_WRITE | FMODE_READ);
++		}
++	}
++#endif
++
++	if (IS_ERR(bdev)) {
 +		ERROR("error: cannot open device %s", dev->devname);
 +		return 1;
- 	}
- 	dev->blkdev = bdev;
- 
- 	if (MAJOR(bdev->bd_dev) == MTD_BLOCK_MAJOR) {
- 		ERROR("attempting to use an MTD device as a block device");
--		goto devinit_err;
++	}
++	dev->blkdev = bdev;
++
++	if (MAJOR(bdev->bd_dev) == MTD_BLOCK_MAJOR) {
++		ERROR("attempting to use an MTD device as a block device");
 +		return 1;
- 	}
- 
++	}
++
 +	return 0;
 +}
 +
@@ -471,12 +434,12 @@
 +	dev->blkdev = NULL;
 +}
 +
-+static void block2mtd_free_device(struct block2mtd_dev *dev)
-+{
-+	if (!dev)
-+		return;
-+
-+	kfree(dev->mtd.name);
+ static void block2mtd_free_device(struct block2mtd_dev *dev)
+ {
+ 	if (!dev)
+ 		return;
+ 
+ 	kfree(dev->mtd.name);
 +	_close_bdev(dev);
 +	kfree(dev);
 +}
@@ -494,7 +457,11 @@
 +
 +	/* get the device number for the whole disk */
 +	devt = MKDEV(MAJOR(dev->blkdev->bd_dev), 0);
-+
+ 
+-	if (dev->blkdev) {
+-		invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping,
+-					0, -1);
+-		close_bdev_excl(dev->blkdev);
 +	/* close the old block device */
 +	_close_bdev(dev);
 +
@@ -504,36 +471,64 @@
 +		err = -EINVAL;
 +	else {
 +		err = rescan_partitions(bdev->bd_disk, bdev);
-+	}
+ 	}
 +	if (bdev)
 +		close_bdev_excl(bdev);
-+
+ 
+-	kfree(dev);
+-}
 +	/* try to open the partition block device again */
 +	_open_bdev(dev);
 +	write_unlock(&dev->bdev_mutex);
-+
+ 
 +	return err;
 +}
-+
-+/* FIXME: ensure that mtd->size % erase_size == 0 */
+ 
+ /* FIXME: ensure that mtd->size % erase_size == 0 */
+-static struct block2mtd_dev *add_device(char *devname, int erase_size, const char *mtdname)
 +static struct block2mtd_dev *add_device(char *devname, int erase_size, char *mtdname)
-+{
-+	struct block2mtd_dev *dev;
-+	struct mtd_partition *part;
-+	char *name;
-+
-+	if (!devname)
-+		return NULL;
-+
+ {
+-	struct block_device *bdev;
+ 	struct block2mtd_dev *dev;
+ 	struct mtd_partition *part;
+ 	char *name;
+@@ -243,37 +356,17 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size, const cha
+ 	if (!devname)
+ 		return NULL;
+ 
+-	dev = kzalloc(sizeof(struct block2mtd_dev), GFP_KERNEL);
 +	dev = kzalloc(sizeof(struct block2mtd_dev) + strlen(devname) + 1, GFP_KERNEL);
-+	if (!dev)
-+		return NULL;
-+
+ 	if (!dev)
+ 		return NULL;
+ 
+-	/* Get a handle on the device */
+-	bdev = open_bdev_excl(devname, O_RDWR, NULL);
+-#ifndef MODULE
+-	if (IS_ERR(bdev)) {
+-
+-		/* We might not have rootfs mounted at this point. Try
+-		   to resolve the device name by other means. */
 +	strcpy(dev->devname, devname);
-+
+ 
+-		dev_t devt = name_to_dev_t(devname);
+-		if (devt) {
+-			bdev = open_by_devnum(devt, FMODE_WRITE | FMODE_READ);
+-		}
+-	}
+-#endif
+-
+-	if (IS_ERR(bdev)) {
+-		ERROR("error: cannot open device %s", devname);
 +	if (_open_bdev(dev))
-+		goto devinit_err;
-+
+ 		goto devinit_err;
+-	}
+-	dev->blkdev = bdev;
+-
+-	if (MAJOR(bdev->bd_dev) == MTD_BLOCK_MAJOR) {
+-		ERROR("attempting to use an MTD device as a block device");
+-		goto devinit_err;
+-	}
+ 
  	mutex_init(&dev->write_mutex);
 +	rwlock_init(&dev->bdev_mutex);
  
-- 
2.20.1