summaryrefslogtreecommitdiff
path: root/target
diff options
context:
space:
mode:
Diffstat (limited to 'target')
-rw-r--r--target/linux/generic-2.6/patches-2.6.27/065-rootfs_split.patch171
1 files 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 aff95ccecc..6fb86b9b41 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);