]> xenbits.xensource.com Git - people/julieng/freebsd.git/commitdiff
makefs: introduce a new option to specify what to round the resulting
authoradrian <adrian@FreeBSD.org>
Tue, 13 Oct 2015 02:32:15 +0000 (02:32 +0000)
committeradrian <adrian@FreeBSD.org>
Tue, 13 Oct 2015 02:32:15 +0000 (02:32 +0000)
image up to.

From ticket:

While trying to run FreeBSD/mips on some device having very small flash media,
one is forced to compress file system with mkulzma(8) utility. It is desirable
to specify small UFS block/fragment sizes like 4096/512 bytes for makefs(8)
and big compression block size like 65535 bytes to mkulzma at the same time.
Then one obtains very good comression ratios (like 75% and more) but faces
the following problem.

geom_uncompress kernel module reports GEOM provider size rounded up to its
compression block size. Generally, this changes original media size and now
it fails to match the size of embedded UFS file system that leads to other
problems, f.e. geom_label kernel module does not like this and skips the
file system while tasting the GEOM and looking for UFS label.

This makes it impossible to refer to the file system using known UFS label
instead of something like /dev/map/rootfs.uncompress.

The following patch introduces new command line option "-r roundup" for makefs
that makes it round up the image to specified block size. Hence, geom_uncompress
does not change GEOM media size for images rounded that way and geom_label
accepts such GEOMs just fine.

With the patch applied, one can use following commands:

$ makefs -t ffs -r 65536 -o bsize=4096,fsize=512,label=flash optimization=space fs.img fs
$ mkulzma -s 65536 -o fs.img.ulzma fs.img

PR: bin/203707
Submitted by: <eugen@grosbein.net>

usr.sbin/makefs/ffs.c
usr.sbin/makefs/makefs.8
usr.sbin/makefs/makefs.c
usr.sbin/makefs/makefs.h

index 1647d8f2268fd24238dde134c199c19791c7ba1b..dd97c012dceadd10846420aa3b0460c023245cd7 100644 (file)
@@ -418,6 +418,10 @@ ffs_validate(const char *dir, fsnode *root, fsinfo_t *fsopts)
                /* round up to the next block */
        fsopts->size = roundup(fsopts->size, ffs_opts->bsize);
 
+               /* round up to requested block size, if any */
+       if (fsopts->roundup > 0)
+               fsopts->size = roundup(fsopts->size, fsopts->roundup);
+
                /* calculate density if necessary */
        if (ffs_opts->density == -1)
                ffs_opts->density = fsopts->size / fsopts->inodes + 1;
index 91ab2048718d19c307f4490fb24578484f6ec10d..025066d293f6855bc9f5d717c804cd233d02b57a 100644 (file)
@@ -53,6 +53,7 @@
 .Op Fl m Ar maximum-size
 .Op Fl N Ar userdb-dir
 .Op Fl o Ar fs-options
+.Op Fl r Ar roundup
 .Op Fl S Ar sector-size
 .Op Fl s Ar image-size
 .Op Fl t Ar fs-type
@@ -195,6 +196,9 @@ Deprecated.
 See the
 .Fl Z
 flag.
+.It Fl r Ar roundup
+Round the image up to specified block size that should be multiple
+of block size.
 .It Fl S Ar sector-size
 Set the file system sector size to
 .Ar sector-size .
index bf10034f00d1d1c6cb50a45dff2033dece5387e8..5e419ccb0d89b66982838f479d99b2c1828d2dc5 100644 (file)
@@ -113,7 +113,7 @@ main(int argc, char *argv[])
        start_time.tv_sec = start.tv_sec;
        start_time.tv_nsec = start.tv_usec * 1000;
 
-       while ((ch = getopt(argc, argv, "B:b:Dd:f:F:M:m:N:o:ps:S:t:xZ")) != -1) {
+       while ((ch = getopt(argc, argv, "B:b:Dd:f:F:M:m:N:o:pr:s:S:t:xZ")) != -1) {
                switch (ch) {
 
                case 'B':
@@ -209,6 +209,12 @@ main(int argc, char *argv[])
                        fsoptions.sparse = 1;
                        break;
 
+               case 'r':
+                       /* Round image size up to specified block size */
+                       fsoptions.roundup =
+                           strsuftoll("roundup", optarg, 0, LLONG_MAX);
+                       break;
+
                case 's':
                        fsoptions.minsize = fsoptions.maxsize =
                            strsuftoll("size", optarg, 1LL, LLONG_MAX);
@@ -359,9 +365,9 @@ usage(void)
        prog = getprogname();
        fprintf(stderr,
 "usage: %s [-t fs-type] [-o fs-options] [-d debug-mask] [-B endian]\n"
-"\t[-S sector-size] [-M minimum-size] [-m maximum-size] [-s image-size]\n"
-"\t[-b free-blocks] [-f free-files] [-F mtree-specfile] [-xZ]\n"
-"\t[-N userdb-dir] image-file directory | manifest [extra-directory ...]\n",
+"\t[-S sector-size] [-M minimum-size] [-m maximum-size] [-r roundup ]\n"
+"\t[-s image-size] [-b free-blocks] [-f free-files] [-F mtree-specfile]\n"
+"\t[-xZ] [-N userdb-dir] image-file directory | manifest [extra-directory ...]\n",
            prog);
        exit(1);
 }
index 5ab04446c6871683492fd03403586de79b916e7c..ba80f74519a49b8494b147d517657e762e3809eb 100644 (file)
@@ -130,6 +130,7 @@ typedef struct {
        int     needswap;       /* non-zero if byte swapping needed */
        int     sectorsize;     /* sector size */
        int     sparse;         /* sparse image, don't fill it with zeros */
+       off_t   roundup;        /* round image size up to this value */
 
        void    *fs_specific;   /* File system specific additions. */
 } fsinfo_t;