clean of the rootfs_split patch
authorGabor Juhos <juhosg@openwrt.org>
Thu, 19 Jul 2007 07:13:20 +0000 (07:13 +0000)
committerGabor Juhos <juhosg@openwrt.org>
Thu, 19 Jul 2007 07:13:20 +0000 (07:13 +0000)
SVN-Revision: 8047

target/linux/adm5120-2.6/config/default
target/linux/amcc-2.6/config/default
target/linux/at91-2.6/config/default
target/linux/avr32-2.6/config/default
target/linux/generic-2.6/config-2.6.22
target/linux/generic-2.6/config-template
target/linux/generic-2.6/patches-2.6.22/060-rootfs_split.patch
target/linux/generic-2.6/patches/060-rootfs_split.patch
target/linux/magicbox-2.6/config/default
target/linux/rdc-2.6/config/default

index eb30a16254e032fe0543242f28f0e19e664d7285..b99e53765aa94847cded6e7841eb2550302c1faa 100644 (file)
@@ -184,7 +184,8 @@ CONFIG_MTD_PARTITIONS=y
 # CONFIG_MTD_REDBOOT_PARTS is not set
 # CONFIG_MTD_ROM is not set
 # CONFIG_MTD_SLRAM is not set
-# CONFIG_MTD_SPLIT_ROOTFS is not set
+# CONFIG_MTD_ROOTFS_ROOT_DEV is not set
+# CONFIG_MTD_ROOTFS_SPLIT is not set
 # CONFIG_NETDEV_1000 is not set
 CONFIG_NET_KEY=y
 # CONFIG_NET_PCI is not set
index 4edff5b9d5250c1418d470bdefa1b354ceae1b32..d0fccac52dfff72ff5626716e52668c3d4702537 100644 (file)
@@ -121,7 +121,6 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=2
 # CONFIG_MTD_REDBOOT_PARTS is not set
 # CONFIG_MTD_ROM is not set
 # CONFIG_MTD_SLRAM is not set
-CONFIG_MTD_SPLIT_ROOTFS=y
 # CONFIG_NATSEMI is not set
 # CONFIG_NE2K_PCI is not set
 # CONFIG_NET_VENDOR_3COM is not set
index d2160396e902f984125eace4443b73cf31f23594..eb0081b2218c0f818234b39349806f700b7c0e74 100644 (file)
@@ -210,7 +210,8 @@ CONFIG_MTD_PARTITIONS=y
 # CONFIG_MTD_REDBOOT_PARTS is not set
 # CONFIG_MTD_ROM is not set
 # CONFIG_MTD_SLRAM is not set
-# CONFIG_MTD_SPLIT_ROOTFS is not set
+# CONFIG_MTD_ROOTFS_ROOT_DEV is not set
+# CONFIG_MTD_ROOTFS_SPLIT is not set
 # CONFIG_NET_EMATCH is not set
 # CONFIG_NET_IPGRE_BROADCAST is not set
 # CONFIG_NET_PKTGEN is not set
index 2a6056efee3c675104097c1f312cb13b8c3079aa..5c62fa6835347b993dd6c1485bcd100b11f42c11 100644 (file)
@@ -83,7 +83,6 @@ CONFIG_MTD_PHYSMAP=y
 # CONFIG_MTD_REDBOOT_PARTS is not set
 # CONFIG_MTD_ROM is not set
 # CONFIG_MTD_SLRAM is not set
-CONFIG_MTD_SPLIT_ROOTFS=y
 CONFIG_MTD=y
 # CONFIG_OWNERSHIP_TRACE is not set
 CONFIG_PHYS_OFFSET=0x10000000
index 1c081ae8dbbd88a52140759df112d69cd63f7662..1eaf9d712ac5543044deb5ee0fbef637e770646a 100644 (file)
@@ -678,7 +678,8 @@ CONFIG_MODULE_UNLOAD=y
 CONFIG_MSDOS_FS=m
 CONFIG_MSDOS_PARTITION=y
 # CONFIG_MTD_NAND is not set
-CONFIG_MTD_SPLIT_ROOTFS=y
+CONFIG_MTD_ROOTFS_ROOT_DEV=y
+CONFIG_MTD_ROOTFS_SPLIT=y
 # CONFIG_MTD_UBI is not set
 # CONFIG_MYRI10GE is not set
 # CONFIG_NCP_FS is not set
index 4d9b2b900cff21068683484a4ba60f2ade68ad8c..b2d67a6ad17c670b433ed3c992d401913e10a5b1 100644 (file)
@@ -663,7 +663,8 @@ CONFIG_MODULE_UNLOAD=y
 CONFIG_MSDOS_FS=m
 CONFIG_MSDOS_PARTITION=y
 # CONFIG_MTD_NAND is not set
-CONFIG_MTD_SPLIT_ROOTFS=y
+CONFIG_MTD_ROOTFS_ROOT_DEV=y
+CONFIG_MTD_ROOTFS_SPLIT=y
 # CONFIG_MYRI10GE is not set
 # CONFIG_NCP_FS is not set
 CONFIG_NET=y
index 4610d3c01a2b6bd78e6451f43c98236c0c26c436..c8fe052b839295c5a1824acec13bcbf1b2c04a94 100644 (file)
@@ -1,21 +1,28 @@
-diff -urN linux-2.6.21.1.old/drivers/mtd/Kconfig linux-2.6.21.1.dev/drivers/mtd/Kconfig
---- linux-2.6.21.1.old/drivers/mtd/Kconfig     2007-04-27 23:49:26.000000000 +0200
-+++ linux-2.6.21.1.dev/drivers/mtd/Kconfig     2007-05-26 19:58:42.320520952 +0200
-@@ -47,6 +47,11 @@
+Index: linux/drivers/mtd/Kconfig
+===================================================================
+--- linux.orig/drivers/mtd/Kconfig
++++ linux/drivers/mtd/Kconfig
+@@ -47,6 +47,16 @@ config MTD_PARTITIONS
          devices. Partitioning on NFTL 'devices' is a different - that's the
          'normal' form of partitioning used on a block device.
  
-+config MTD_SPLIT_ROOTFS
-+      bool "Automatically split rootfs partition for squashfs"
++config MTD_ROOTFS_ROOT_DEV
++      bool "Automatically set 'rootfs' partition to be root filesystem"
++      depends on MTD_PARTITIONS
++      default y
++
++config MTD_ROOTFS_SPLIT
++      bool "Automatically split 'rootfs' partition for squashfs"
 +      depends on MTD_PARTITIONS
 +      default y
 +
  config MTD_REDBOOT_PARTS
        tristate "RedBoot partition table parsing"
        depends on MTD_PARTITIONS
-diff -urN linux-2.6.21.1.old/drivers/mtd/mtdpart.c linux-2.6.21.1.dev/drivers/mtd/mtdpart.c
---- linux-2.6.21.1.old/drivers/mtd/mtdpart.c   2007-04-27 23:49:26.000000000 +0200
-+++ linux-2.6.21.1.dev/drivers/mtd/mtdpart.c   2007-05-26 19:58:42.331519280 +0200
+Index: linux/drivers/mtd/mtdpart.c
+===================================================================
+--- linux.orig/drivers/mtd/mtdpart.c
++++ linux/drivers/mtd/mtdpart.c
 @@ -20,6 +20,8 @@
  #include <linux/mtd/mtd.h>
  #include <linux/mtd/partitions.h>
@@ -25,15 +32,16 @@ diff -urN linux-2.6.21.1.old/drivers/mtd/mtdpart.c linux-2.6.21.1.dev/drivers/mt
  
  /* Our partition linked list */
  static LIST_HEAD(mtd_partitions);
-@@ -308,6 +310,171 @@
+@@ -308,6 +310,265 @@ int del_mtd_partitions(struct mtd_info *
        return 0;
  }
  
 +static u_int32_t cur_offset = 0;
-+static int add_mtd_partition(struct mtd_info *master, const struct mtd_partition *part, int i)
++static int add_one_partition(struct mtd_info *master, const struct mtd_partition *part,
++              int i, struct mtd_part **slp)
 +{
 +      struct mtd_part *slave;
-+      
++
 +      /* allocate the partition structure */
 +      slave = kzalloc (sizeof(*slave), GFP_KERNEL);
 +      if (!slave) {
@@ -191,62 +199,118 @@ diff -urN linux-2.6.21.1.old/drivers/mtd/mtdpart.c linux-2.6.21.1.dev/drivers/mt
 +              slave->registered = 1;
 +      }
 +
++      if (slp)
++              *slp = slave;
++
 +      return 0;
 +}
++
++#ifdef CONFIG_MTD_ROOTFS_SPLIT
++#define ROOTFS_SPLIT_NAME "rootfs_data"
++static int split_squashfs(struct mtd_info *master, struct mtd_partition *old,
++              struct mtd_partition **new)
++{
++      struct mtd_partition *part = NULL;
++      int len;
++      char buf[512];
++      struct squashfs_super_block *sb = (struct squashfs_super_block *) buf;
++      int ret;
++
++      ret = master->read(master, old->offset, sizeof(*sb), &len, buf);
++      if (ret) {
++              printk(KERN_ALERT "split_squashfs: error occured while reading "
++                      "from \"%s\"\n", master->name);
++              goto out;
++      }
++
++      if (len != sizeof(*sb)) {
++              printk(KERN_ALERT "split_squashfs: unable to read superblock "
++                      "from \"%s\"\n", master->name);
++              ret=-1;
++              goto out;
++      }
++
++      if (*((u32 *) buf) != SQUASHFS_MAGIC) {
++              printk(KERN_ALERT "split_squasfs: no squashfs found in \"%s\"\n",
++                      master->name);
++              ret=0;
++              goto out;
++      }
++
++      if (sb->bytes_used <= 0) {
++              printk(KERN_ALERT "split_squashfs: squashfs is empty in \"%s\"\n",
++                      master->name);
++              ret=0;
++              goto out;
++      }
++
++      part = kmalloc(sizeof(*part)+sizeof(ROOTFS_SPLIT_NAME)+1, GFP_KERNEL);
++      if (part == NULL) {
++              printk(KERN_INFO "split_squashfs: no memory for partition \"%s\"\n",
++                      ROOTFS_SPLIT_NAME);
++              ret = -ENOMEM;
++              goto out;
++      }
++
++      part->name = (unsigned char *)&part[1];
++      memcpy(part, old, sizeof(*part));
++      strcpy(part->name, ROOTFS_SPLIT_NAME);
++
++      len = (u32) sb->bytes_used;
++      len += (part->offset & 0x000fffff);
++      len +=  (master->erasesize - 1);
++      len &= ~(master->erasesize - 1);
++      len -= (part->offset & 0x000fffff);
++      part->offset += len;
++      part->size -= len;
++
++      ret = 0;
++
++out:
++      *new = part;
++      return ret;
++}
++
++static int split_rootfs_data(struct mtd_info *master, struct mtd_partition *part,
++              int index)
++{
++      struct mtd_partition *dpart;
++      int ret;
++
++      ret = split_squashfs(master, part, &dpart);
++      if (ret)
++              return ret;
++
++      if (dpart == NULL)
++              return 1;
++
++      printk(KERN_INFO "mtd: partition \"%s\" created automatically, ofs=%lX, len=%lX \n",
++              ROOTFS_SPLIT_NAME, dpart->offset, dpart->size);
++
++      ret = add_one_partition(master, dpart, index, NULL);
++      if (ret)
++              kfree(dpart);
++
++      return ret;
++}
++#endif /* CONFIG_MTD_ROOTFS_SPLIT */
 +
  /*
   * This function, given a master MTD object and a partition table, creates
   * and registers slave MTD objects which are bound to the master according to
-@@ -319,169 +487,53 @@
-                      const struct mtd_partition *parts,
+@@ -320,168 +581,31 @@ int add_mtd_partitions(struct mtd_info *
                       int nbparts)
  {
--      struct mtd_part *slave;
+       struct mtd_part *slave;
 -      u_int32_t cur_offset = 0;
 -      int i;
 +      struct mtd_partition *part;
-+      int i, ret = 0;
++      int i, j, ret = 0;
  
        printk (KERN_NOTICE "Creating %d MTD partitions on \"%s\":\n", nbparts, master->name);
  
-       for (i = 0; i < nbparts; i++) {
-+              part = (struct mtd_partition *) &parts[i];
-+              ret = add_mtd_partition(master, part, i);
-+              if (ret)
-+                      return ret;
-+              if (strcmp(part->name, "rootfs") == 0) {
-+#ifdef CONFIG_MTD_SPLIT_ROOTFS
-+                      int len;
-+                      char buf[512];
-+                      struct squashfs_super_block *sb = (struct squashfs_super_block *) buf;
-+#define ROOTFS_SPLIT_NAME "rootfs_data"
-+                      if ((master->read(master, part->offset, sizeof(struct squashfs_super_block), &len, buf) == 0) &&
-+                                      (len == sizeof(struct squashfs_super_block)) &&
-+                                      (*((u32 *) buf) == SQUASHFS_MAGIC) &&
-+                                      (sb->bytes_used > 0)) {
-+
-+                              
-+                              part = kmalloc(sizeof(struct mtd_partition), GFP_KERNEL);
-+                              memcpy(part, &parts[i], sizeof(struct mtd_partition));
-+                              
-+                              part->name = kmalloc(sizeof(ROOTFS_SPLIT_NAME) + 1, GFP_KERNEL);
-+                              strcpy(part->name, ROOTFS_SPLIT_NAME);
-+
-+                              len = (u32) sb->bytes_used;
-+                              len += (part->offset & 0x000fffff);
-+                              len +=  (master->erasesize - 1);
-+                              len &= ~(master->erasesize - 1);
-+                              len -= (part->offset & 0x000fffff);
-+                              part->offset += len;
-+                              part->size -= len;
-+                      
-+                              if (master->erasesize <= part->size)
-+                                      ret = add_mtd_partition(master, part, i + 1);
-+                              else
-+                                      kfree(part->name);
-+                              if (ret)
-+                                      return ret;
+-      for (i = 0; i < nbparts; i++) {
+-
 -              /* allocate the partition structure */
 -              slave = kzalloc (sizeof(*slave), GFP_KERNEL);
 -              if (!slave) {
@@ -324,8 +388,7 @@ diff -urN linux-2.6.21.1.old/drivers/mtd/mtdpart.c linux-2.6.21.1.dev/drivers/mt
 -                              printk(KERN_NOTICE "Moving partition %d: "
 -                                     "0x%08x -> 0x%08x\n", i,
 -                                     cur_offset, slave->offset);
-+                              kfree(part);
-                       }
+-                      }
 -              }
 -              if (slave->mtd.size == MTDPART_SIZ_FULL)
 -                      slave->mtd.size = master->size - slave->offset;
@@ -390,7 +453,20 @@ diff -urN linux-2.6.21.1.old/drivers/mtd/mtdpart.c linux-2.6.21.1.dev/drivers/mt
 -                                                      offs + slave->offset))
 -                                      slave->mtd.ecc_stats.badblocks++;
 -                              offs += slave->mtd.erasesize;
--                      }
++      for (i = 0, j = 0; i < nbparts; i++) {
++              part = (struct mtd_partition *) &parts[i];
++              ret = add_one_partition(master, part, j, &slave);
++              if (ret)
++                      return ret;
++              j++;
++
++              if (strcmp(part->name, "rootfs") == 0 && slave->registered) {
++#if CONFIG_MTD_ROOTFS_ROOT_DEV
++                      if (ROOT_DEV == 0) {
++                              printk(KERN_NOTICE "mtd: partition \"rootfs\" "
++                                      "set to be root filesystem\n");
++                              ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, slave->mtd.index);
+                       }
 -              }
 -
 -              if(parts[i].mtdp)
@@ -403,8 +479,12 @@ diff -urN linux-2.6.21.1.old/drivers/mtd/mtdpart.c linux-2.6.21.1.dev/drivers/mt
 -                      /* register our partition */
 -                      add_mtd_device(&slave->mtd);
 -                      slave->registered = 1;
-+#endif /* CONFIG_MTD_SPLIT_ROOTFS */
-+                      ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, i);
++#endif
++#if CONFIG_MTD_ROOTFS_SPLIT
++                      ret = split_rootfs_data(master, part, j);
++                      if (ret == 0)
++                              j++;
++#endif
                }
        }
  
index 7e4161e8dfed9dac856f26c735cc72d91a68bf8c..c8fe052b839295c5a1824acec13bcbf1b2c04a94 100644 (file)
@@ -1,21 +1,28 @@
-diff -urN linux-2.6.21.1.old/drivers/mtd/Kconfig linux-2.6.21.1.dev/drivers/mtd/Kconfig
---- linux-2.6.21.1.old/drivers/mtd/Kconfig     2007-04-27 23:49:26.000000000 +0200
-+++ linux-2.6.21.1.dev/drivers/mtd/Kconfig     2007-05-26 19:58:42.320520952 +0200
-@@ -49,6 +49,11 @@
+Index: linux/drivers/mtd/Kconfig
+===================================================================
+--- linux.orig/drivers/mtd/Kconfig
++++ linux/drivers/mtd/Kconfig
+@@ -47,6 +47,16 @@ config MTD_PARTITIONS
          devices. Partitioning on NFTL 'devices' is a different - that's the
          'normal' form of partitioning used on a block device.
  
-+config MTD_SPLIT_ROOTFS
-+      bool "Automatically split rootfs partition for squashfs"
++config MTD_ROOTFS_ROOT_DEV
++      bool "Automatically set 'rootfs' partition to be root filesystem"
++      depends on MTD_PARTITIONS
++      default y
++
++config MTD_ROOTFS_SPLIT
++      bool "Automatically split 'rootfs' partition for squashfs"
 +      depends on MTD_PARTITIONS
 +      default y
 +
  config MTD_REDBOOT_PARTS
        tristate "RedBoot partition table parsing"
        depends on MTD_PARTITIONS
-diff -urN linux-2.6.21.1.old/drivers/mtd/mtdpart.c linux-2.6.21.1.dev/drivers/mtd/mtdpart.c
---- linux-2.6.21.1.old/drivers/mtd/mtdpart.c   2007-04-27 23:49:26.000000000 +0200
-+++ linux-2.6.21.1.dev/drivers/mtd/mtdpart.c   2007-05-26 19:58:42.331519280 +0200
+Index: linux/drivers/mtd/mtdpart.c
+===================================================================
+--- linux.orig/drivers/mtd/mtdpart.c
++++ linux/drivers/mtd/mtdpart.c
 @@ -20,6 +20,8 @@
  #include <linux/mtd/mtd.h>
  #include <linux/mtd/partitions.h>
@@ -25,15 +32,16 @@ diff -urN linux-2.6.21.1.old/drivers/mtd/mtdpart.c linux-2.6.21.1.dev/drivers/mt
  
  /* Our partition linked list */
  static LIST_HEAD(mtd_partitions);
-@@ -308,6 +310,172 @@
+@@ -308,6 +310,265 @@ int del_mtd_partitions(struct mtd_info *
        return 0;
  }
  
 +static u_int32_t cur_offset = 0;
-+static int add_mtd_partition(struct mtd_info *master, const struct mtd_partition *part, int i)
++static int add_one_partition(struct mtd_info *master, const struct mtd_partition *part,
++              int i, struct mtd_part **slp)
 +{
 +      struct mtd_part *slave;
-+      
++
 +      /* allocate the partition structure */
 +      slave = kzalloc (sizeof(*slave), GFP_KERNEL);
 +      if (!slave) {
@@ -54,7 +62,6 @@ diff -urN linux-2.6.21.1.old/drivers/mtd/mtdpart.c linux-2.6.21.1.dev/drivers/mt
 +      slave->mtd.subpage_sft = master->subpage_sft;
 +
 +      slave->mtd.name = part->name;
-+      slave->mtd.bank_size = master->bank_size;
 +      slave->mtd.owner = master->owner;
 +
 +      slave->mtd.read = part_read;
@@ -192,62 +199,118 @@ diff -urN linux-2.6.21.1.old/drivers/mtd/mtdpart.c linux-2.6.21.1.dev/drivers/mt
 +              slave->registered = 1;
 +      }
 +
++      if (slp)
++              *slp = slave;
++
 +      return 0;
 +}
++
++#ifdef CONFIG_MTD_ROOTFS_SPLIT
++#define ROOTFS_SPLIT_NAME "rootfs_data"
++static int split_squashfs(struct mtd_info *master, struct mtd_partition *old,
++              struct mtd_partition **new)
++{
++      struct mtd_partition *part = NULL;
++      int len;
++      char buf[512];
++      struct squashfs_super_block *sb = (struct squashfs_super_block *) buf;
++      int ret;
++
++      ret = master->read(master, old->offset, sizeof(*sb), &len, buf);
++      if (ret) {
++              printk(KERN_ALERT "split_squashfs: error occured while reading "
++                      "from \"%s\"\n", master->name);
++              goto out;
++      }
++
++      if (len != sizeof(*sb)) {
++              printk(KERN_ALERT "split_squashfs: unable to read superblock "
++                      "from \"%s\"\n", master->name);
++              ret=-1;
++              goto out;
++      }
++
++      if (*((u32 *) buf) != SQUASHFS_MAGIC) {
++              printk(KERN_ALERT "split_squasfs: no squashfs found in \"%s\"\n",
++                      master->name);
++              ret=0;
++              goto out;
++      }
++
++      if (sb->bytes_used <= 0) {
++              printk(KERN_ALERT "split_squashfs: squashfs is empty in \"%s\"\n",
++                      master->name);
++              ret=0;
++              goto out;
++      }
++
++      part = kmalloc(sizeof(*part)+sizeof(ROOTFS_SPLIT_NAME)+1, GFP_KERNEL);
++      if (part == NULL) {
++              printk(KERN_INFO "split_squashfs: no memory for partition \"%s\"\n",
++                      ROOTFS_SPLIT_NAME);
++              ret = -ENOMEM;
++              goto out;
++      }
++
++      part->name = (unsigned char *)&part[1];
++      memcpy(part, old, sizeof(*part));
++      strcpy(part->name, ROOTFS_SPLIT_NAME);
++
++      len = (u32) sb->bytes_used;
++      len += (part->offset & 0x000fffff);
++      len +=  (master->erasesize - 1);
++      len &= ~(master->erasesize - 1);
++      len -= (part->offset & 0x000fffff);
++      part->offset += len;
++      part->size -= len;
++
++      ret = 0;
++
++out:
++      *new = part;
++      return ret;
++}
++
++static int split_rootfs_data(struct mtd_info *master, struct mtd_partition *part,
++              int index)
++{
++      struct mtd_partition *dpart;
++      int ret;
++
++      ret = split_squashfs(master, part, &dpart);
++      if (ret)
++              return ret;
++
++      if (dpart == NULL)
++              return 1;
++
++      printk(KERN_INFO "mtd: partition \"%s\" created automatically, ofs=%lX, len=%lX \n",
++              ROOTFS_SPLIT_NAME, dpart->offset, dpart->size);
++
++      ret = add_one_partition(master, dpart, index, NULL);
++      if (ret)
++              kfree(dpart);
++
++      return ret;
++}
++#endif /* CONFIG_MTD_ROOTFS_SPLIT */
 +
  /*
   * This function, given a master MTD object and a partition table, creates
   * and registers slave MTD objects which are bound to the master according to
-@@ -319,170 +487,53 @@
-                      const struct mtd_partition *parts,
+@@ -320,168 +581,31 @@ int add_mtd_partitions(struct mtd_info *
                       int nbparts)
  {
--      struct mtd_part *slave;
+       struct mtd_part *slave;
 -      u_int32_t cur_offset = 0;
 -      int i;
 +      struct mtd_partition *part;
-+      int i, ret = 0;
++      int i, j, ret = 0;
  
        printk (KERN_NOTICE "Creating %d MTD partitions on \"%s\":\n", nbparts, master->name);
  
-       for (i = 0; i < nbparts; i++) {
-+              part = (struct mtd_partition *) &parts[i];
-+              ret = add_mtd_partition(master, part, i);
-+              if (ret)
-+                      return ret;
-+              if (strcmp(part->name, "rootfs") == 0) {
-+#ifdef CONFIG_MTD_SPLIT_ROOTFS
-+                      int len;
-+                      char buf[512];
-+                      struct squashfs_super_block *sb = (struct squashfs_super_block *) buf;
-+#define ROOTFS_SPLIT_NAME "rootfs_data"
-+                      if ((master->read(master, part->offset, sizeof(struct squashfs_super_block), &len, buf) == 0) &&
-+                                      (len == sizeof(struct squashfs_super_block)) &&
-+                                      (*((u32 *) buf) == SQUASHFS_MAGIC) &&
-+                                      (sb->bytes_used > 0)) {
-+
-+                              
-+                              part = kmalloc(sizeof(struct mtd_partition), GFP_KERNEL);
-+                              memcpy(part, &parts[i], sizeof(struct mtd_partition));
-+                              
-+                              part->name = kmalloc(sizeof(ROOTFS_SPLIT_NAME) + 1, GFP_KERNEL);
-+                              strcpy(part->name, ROOTFS_SPLIT_NAME);
-+
-+                              len = (u32) sb->bytes_used;
-+                              len += (part->offset & 0x000fffff);
-+                              len +=  (master->erasesize - 1);
-+                              len &= ~(master->erasesize - 1);
-+                              len -= (part->offset & 0x000fffff);
-+                              part->offset += len;
-+                              part->size -= len;
-+                      
-+                              if (master->erasesize <= part->size)
-+                                      ret = add_mtd_partition(master, part, i + 1);
-+                              else
-+                                      kfree(part->name);
-+                              if (ret)
-+                                      return ret;
+-      for (i = 0; i < nbparts; i++) {
+-
 -              /* allocate the partition structure */
 -              slave = kzalloc (sizeof(*slave), GFP_KERNEL);
 -              if (!slave) {
@@ -268,7 +331,6 @@ diff -urN linux-2.6.21.1.old/drivers/mtd/mtdpart.c linux-2.6.21.1.dev/drivers/mt
 -              slave->mtd.subpage_sft = master->subpage_sft;
 -
 -              slave->mtd.name = parts[i].name;
--              slave->mtd.bank_size = master->bank_size;
 -              slave->mtd.owner = master->owner;
 -
 -              slave->mtd.read = part_read;
@@ -326,8 +388,7 @@ diff -urN linux-2.6.21.1.old/drivers/mtd/mtdpart.c linux-2.6.21.1.dev/drivers/mt
 -                              printk(KERN_NOTICE "Moving partition %d: "
 -                                     "0x%08x -> 0x%08x\n", i,
 -                                     cur_offset, slave->offset);
-+                              kfree(part);
-                       }
+-                      }
 -              }
 -              if (slave->mtd.size == MTDPART_SIZ_FULL)
 -                      slave->mtd.size = master->size - slave->offset;
@@ -392,7 +453,20 @@ diff -urN linux-2.6.21.1.old/drivers/mtd/mtdpart.c linux-2.6.21.1.dev/drivers/mt
 -                                                      offs + slave->offset))
 -                                      slave->mtd.ecc_stats.badblocks++;
 -                              offs += slave->mtd.erasesize;
--                      }
++      for (i = 0, j = 0; i < nbparts; i++) {
++              part = (struct mtd_partition *) &parts[i];
++              ret = add_one_partition(master, part, j, &slave);
++              if (ret)
++                      return ret;
++              j++;
++
++              if (strcmp(part->name, "rootfs") == 0 && slave->registered) {
++#if CONFIG_MTD_ROOTFS_ROOT_DEV
++                      if (ROOT_DEV == 0) {
++                              printk(KERN_NOTICE "mtd: partition \"rootfs\" "
++                                      "set to be root filesystem\n");
++                              ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, slave->mtd.index);
+                       }
 -              }
 -
 -              if(parts[i].mtdp)
@@ -405,8 +479,12 @@ diff -urN linux-2.6.21.1.old/drivers/mtd/mtdpart.c linux-2.6.21.1.dev/drivers/mt
 -                      /* register our partition */
 -                      add_mtd_device(&slave->mtd);
 -                      slave->registered = 1;
-+#endif /* CONFIG_MTD_SPLIT_ROOTFS */
-+                      ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, i);
++#endif
++#if CONFIG_MTD_ROOTFS_SPLIT
++                      ret = split_rootfs_data(master, part, j);
++                      if (ret == 0)
++                              j++;
++#endif
                }
        }
  
index 83c9d4b2a87e1d015d66b4b6423d4ab01ec6589d..3e36514e94ba3cb692812ff13bc9b8fa41b1e5b8 100644 (file)
@@ -129,7 +129,6 @@ CONFIG_MTD_PHYSMAP_START=0xffc00000
 # CONFIG_MTD_REDBOOT_PARTS is not set
 # CONFIG_MTD_ROM is not set
 # CONFIG_MTD_SLRAM is not set
-CONFIG_MTD_SPLIT_ROOTFS=y
 # CONFIG_NATSEMI is not set
 # CONFIG_NE2K_PCI is not set
 # CONFIG_NET_VENDOR_3COM is not set
index c29b715c9bea99ffc108a36d146fb0a9c8cb6957..4d4859778f93cfefff4e668b5a1a67278dfd7051 100644 (file)
@@ -183,7 +183,8 @@ CONFIG_MTD_RDC3210_SIZE=0x400000
 # CONFIG_MTD_ROM is not set
 # CONFIG_MTD_SC520CDP is not set
 # CONFIG_MTD_SLRAM is not set
-# CONFIG_MTD_SPLIT_ROOTFS is not set
+# CONFIG_MTD_ROOTFS_ROOT_DEV is not set
+# CONFIG_MTD_ROOTFS_SPLIT is not set
 # CONFIG_MTD_TS5500 is not set
 # CONFIG_MTRR is not set
 # CONFIG_MVIAC3_2 is not set