summaryrefslogtreecommitdiffstats
path: root/disk-utils/mkfs.cramfs.c
diff options
context:
space:
mode:
authorRoy Peled2008-11-28 15:57:00 +0100
committerKarel Zak2009-02-04 15:08:20 +0100
commitc17e59b4b31de15ae0d90e31d09cf7ee1cc3ee89 (patch)
tree805f2737344b01fc02b6b7c61abd78c00252d628 /disk-utils/mkfs.cramfs.c
parentmkfs.cramfs: add endianness support to cramfs tools (diff)
downloadkernel-qcow2-util-linux-c17e59b4b31de15ae0d90e31d09cf7ee1cc3ee89.tar.gz
kernel-qcow2-util-linux-c17e59b4b31de15ae0d90e31d09cf7ee1cc3ee89.tar.xz
kernel-qcow2-util-linux-c17e59b4b31de15ae0d90e31d09cf7ee1cc3ee89.zip
mkfs.cramfs: lower memory requirements for layouts with duplicate files
mkfs.cramfs allocates memory based on a calculated upper-bound of required filesystem size. If there are duplicate files or hard links, the current implementation unnecessarily increases the upper-bound per each copy of the file, even though cramfs does not store copies of contents of identical files. This patch improves the calculation of fslen_ub, the upper bound of required filesystem size, by making the upper bound aware of duplicate files. This is very helpful for layouts that hold a lot of hard links, which are seen as duplicate files by mkfs.cramfs. For example, this drastically reduces the memory requirements for creating a standard Busybox layout. Signed-off-by: Roy Peled <the.roy.peled@gmail.com>
Diffstat (limited to 'disk-utils/mkfs.cramfs.c')
-rw-r--r--disk-utils/mkfs.cramfs.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/disk-utils/mkfs.cramfs.c b/disk-utils/mkfs.cramfs.c
index 5ac2c5b97..fbb4327e5 100644
--- a/disk-utils/mkfs.cramfs.c
+++ b/disk-utils/mkfs.cramfs.c
@@ -247,7 +247,7 @@ identical_file(struct entry *e1, struct entry *e2){
*/
#define MAX_INPUT_NAMELEN 255
-static int find_identical_file(struct entry *orig, struct entry *new)
+static int find_identical_file(struct entry *orig, struct entry *new, loff_t *fslen_ub)
{
if (orig == new)
return 1;
@@ -264,19 +264,20 @@ static int find_identical_file(struct entry *orig, struct entry *new)
!memcmp(orig->md5sum, new->md5sum, 16) &&
identical_file(orig, new)) {
new->same = orig;
+ *fslen_ub -= new->size;
return 1;
}
}
- return find_identical_file(orig->child, new) ||
- find_identical_file(orig->next, new);
+ return find_identical_file(orig->child, new, fslen_ub) ||
+ find_identical_file(orig->next, new, fslen_ub);
}
-static void eliminate_doubles(struct entry *root, struct entry *orig) {
+static void eliminate_doubles(struct entry *root, struct entry *orig, loff_t *fslen_ub) {
if (orig) {
if (orig->size && orig->path)
- find_identical_file(root,orig);
- eliminate_doubles(root,orig->child);
- eliminate_doubles(root,orig->next);
+ find_identical_file(root,orig, fslen_ub);
+ eliminate_doubles(root,orig->child, fslen_ub);
+ eliminate_doubles(root,orig->next, fslen_ub);
}
}
@@ -859,7 +860,7 @@ int main(int argc, char **argv)
}
/* find duplicate files */
- eliminate_doubles(root_entry,root_entry);
+ eliminate_doubles(root_entry,root_entry, &fslen_ub);
/* TODO: Why do we use a private/anonymous mapping here
followed by a write below, instead of just a shared mapping