diff options
author | Roy Peled | 2008-11-28 15:57:00 +0100 |
---|---|---|
committer | Karel Zak | 2009-02-04 15:08:20 +0100 |
commit | c17e59b4b31de15ae0d90e31d09cf7ee1cc3ee89 (patch) | |
tree | 805f2737344b01fc02b6b7c61abd78c00252d628 /disk-utils/mkfs.cramfs.c | |
parent | mkfs.cramfs: add endianness support to cramfs tools (diff) | |
download | kernel-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.c | 17 |
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 |