Commit e6adbbcd authored by Daniel Quinlan's avatar Daniel Quinlan Committed by Linus Torvalds

[PATCH] cramfs updates for 2.5.6-pre2

Documentation/filesystems/cramfs.txt
  - remove comment about ROM size limit
  - fix up magic
  - update location of tools

fs/cramfs/README
  - add note about sorted directory entries
  - mkcramfs compile-time DO_HOLES option replaced by run-time -z option
  - update tools section
  - add note about PAGE_CACHE_SIZE possibly changing on arm and ia64

fs/cramfs/inode.c
  - statfs->f_namelen = CRAMFS_MAXPATHLEN

include/linux/cramfs_fs.h
  - add CRAMFS_MAXPATHLEN (252)
  - clarify CRAMFS_SUPPORTED_FLAGS definition

scripts/cramfs
  - directory removed, the cramfs user-space tools are now located at
    <http://sourceforge.net/projects/cramfs/>.
parent 6282c8d3
...@@ -10,7 +10,7 @@ diskspace than traditional filesystems. ...@@ -10,7 +10,7 @@ diskspace than traditional filesystems.
You can't write to a cramfs filesystem (making it compressible and You can't write to a cramfs filesystem (making it compressible and
compact also makes it _very_ hard to update on-the-fly), so you have to compact also makes it _very_ hard to update on-the-fly), so you have to
create the disk image with the "mkcramfs" utility in scripts/cramfs. create the disk image with the "mkcramfs" utility.
Usage Notes Usage Notes
...@@ -19,9 +19,7 @@ Usage Notes ...@@ -19,9 +19,7 @@ Usage Notes
File sizes are limited to less than 16MB. File sizes are limited to less than 16MB.
Maximum filesystem size is a little over 256MB. (The last file on the Maximum filesystem size is a little over 256MB. (The last file on the
filesystem is allowed to extend past 256MB.) (Comments in mkcramfs.c filesystem is allowed to extend past 256MB.)
suggest that ROM sizes may be limited to 64MB, though that's not a
limitation in cramfs code.)
Only the low 8 bits of gid are stored. The current version of Only the low 8 bits of gid are stored. The current version of
mkcramfs simply truncates to 8 bits, which is a potential security mkcramfs simply truncates to 8 bits, which is a potential security
...@@ -48,18 +46,28 @@ mind the filesystem becoming unreadable to future kernels. ...@@ -48,18 +46,28 @@ mind the filesystem becoming unreadable to future kernels.
For /usr/share/magic For /usr/share/magic
------------------ --------------------
0 long 0x28cd3d45 Linux cramfs 0 ulelong 0x28cd3d45 Linux cramfs offset 0
>4 long x size %d >4 ulelong x size %d
>8 long x flags 0x%x >8 ulelong x flags 0x%x
>12 long x future 0x%x >12 ulelong x future 0x%x
>16 string >\0 signature "%.16s" >16 string >\0 signature "%.16s"
>32 long x fsid.crc 0x%x >32 ulelong x fsid.crc 0x%x
>36 long x fsid.edition %d >36 ulelong x fsid.edition %d
>40 long x fsid.blocks %d >40 ulelong x fsid.blocks %d
>44 long x fsid.files %d >44 ulelong x fsid.files %d
>48 string >\0 name "%.16s" >48 string >\0 name "%.16s"
512 ulelong 0x28cd3d45 Linux cramfs offset 512
>516 ulelong x size %d
>520 ulelong x flags 0x%x
>524 ulelong x future 0x%x
>528 string >\0 signature "%.16s"
>544 ulelong x fsid.crc 0x%x
>548 ulelong x fsid.edition %d
>552 ulelong x fsid.blocks %d
>556 ulelong x fsid.files %d
>560 string >\0 name "%.16s"
Hacker Notes Hacker Notes
......
...@@ -6,8 +6,8 @@ a bit looser, e.g. it doesn't care if the <file_data> items are ...@@ -6,8 +6,8 @@ a bit looser, e.g. it doesn't care if the <file_data> items are
swapped around (though it does care that directory entries (inodes) in swapped around (though it does care that directory entries (inodes) in
a given directory are contiguous, as this is used by readdir). a given directory are contiguous, as this is used by readdir).
All data is in host-endian format; neither mkcramfs nor the kernel All data is currently in host-endian format; neither mkcramfs nor the
ever do swabbing. (See section `Block Size' below.) kernel ever do swabbing. (See section `Block Size' below.)
<filesystem>: <filesystem>:
<superblock> <superblock>
...@@ -29,6 +29,10 @@ same order as `ls -AUR' (but without the /^\..*:$/ directory header ...@@ -29,6 +29,10 @@ same order as `ls -AUR' (but without the /^\..*:$/ directory header
lines); put another way, the same order as `find -type d -exec lines); put another way, the same order as `find -type d -exec
ls -AU1 {} \;'. ls -AU1 {} \;'.
Beginning in 2.4.7, directory entries are sorted. This optimization
allows cramfs_lookup to return more quickly when a filename does not
exist, speeds up user-space directory sorts, etc.
<data>: <data>:
One <file_data> for each file that's either a symlink or a One <file_data> for each file that's either a symlink or a
regular file of non-zero st_size. regular file of non-zero st_size.
...@@ -63,17 +67,15 @@ Holes ...@@ -63,17 +67,15 @@ Holes
This kernel supports cramfs holes (i.e. [efficient representation of] This kernel supports cramfs holes (i.e. [efficient representation of]
blocks in uncompressed data consisting entirely of NUL bytes), but by blocks in uncompressed data consisting entirely of NUL bytes), but by
default mkcramfs doesn't test for & create holes, since cramfs in default mkcramfs doesn't test for & create holes, since cramfs in
kernels up to at least 2.3.39 didn't support holes. Compile mkcramfs kernels up to at least 2.3.39 didn't support holes. Run mkcramfs
with -DDO_HOLES if you want it to create files that can have holes in with -z if you want it to create files that can have holes in them.
them.
Tools Tools
----- -----
If you're hacking on cramfs, you might find useful some tools for The cramfs user-space tools, including mkcramfs and cramfsck, are
testing cramfs at <http://cvs.bofh.asn.au/cramfs/>, including a located at <http://sourceforge.net/projects/cramfs/>.
rudimentary fsck for cramfs.
Future Development Future Development
...@@ -103,8 +105,8 @@ require the least amount of change: just change `#define ...@@ -103,8 +105,8 @@ require the least amount of change: just change `#define
PAGE_CACHE_SIZE (4096)' to `#include <asm/page.h>'. The disadvantage PAGE_CACHE_SIZE (4096)' to `#include <asm/page.h>'. The disadvantage
is that the generated cramfs cannot always be shared between different is that the generated cramfs cannot always be shared between different
kernels, not even necessarily kernels of the same architecture if kernels, not even necessarily kernels of the same architecture if
PAGE_CACHE_SIZE is subject to change between kernel versions. PAGE_CACHE_SIZE is subject to change between kernel versions
(currently possible with arm and ia64).
The remaining options try to make cramfs more sharable. The remaining options try to make cramfs more sharable.
......
...@@ -117,7 +117,7 @@ static void *cramfs_read(struct super_block *sb, unsigned int offset, unsigned i ...@@ -117,7 +117,7 @@ static void *cramfs_read(struct super_block *sb, unsigned int offset, unsigned i
unsigned i, blocknr, buffer, unread; unsigned i, blocknr, buffer, unread;
unsigned long devsize; unsigned long devsize;
unsigned int major, minor; unsigned int major, minor;
char *data; char *data;
if (!len) if (!len)
...@@ -187,7 +187,7 @@ static void *cramfs_read(struct super_block *sb, unsigned int offset, unsigned i ...@@ -187,7 +187,7 @@ static void *cramfs_read(struct super_block *sb, unsigned int offset, unsigned i
} }
return read_buffers[buffer] + offset; return read_buffers[buffer] + offset;
} }
static int cramfs_fill_super(struct super_block *sb, void *data, int silent) static int cramfs_fill_super(struct super_block *sb, void *data, int silent)
{ {
...@@ -266,7 +266,7 @@ static int cramfs_statfs(struct super_block *sb, struct statfs *buf) ...@@ -266,7 +266,7 @@ static int cramfs_statfs(struct super_block *sb, struct statfs *buf)
buf->f_bavail = 0; buf->f_bavail = 0;
buf->f_files = sb->CRAMFS_SB_FILES; buf->f_files = sb->CRAMFS_SB_FILES;
buf->f_ffree = 0; buf->f_ffree = 0;
buf->f_namelen = 255; buf->f_namelen = CRAMFS_MAXPATHLEN;
return 0; return 0;
} }
...@@ -476,4 +476,3 @@ static void __exit exit_cramfs_fs(void) ...@@ -476,4 +476,3 @@ static void __exit exit_cramfs_fs(void)
module_init(init_cramfs_fs) module_init(init_cramfs_fs)
module_exit(exit_cramfs_fs) module_exit(exit_cramfs_fs)
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -23,6 +23,12 @@ typedef unsigned int u32; ...@@ -23,6 +23,12 @@ typedef unsigned int u32;
#define CRAMFS_NAMELEN_WIDTH 6 #define CRAMFS_NAMELEN_WIDTH 6
#define CRAMFS_OFFSET_WIDTH 26 #define CRAMFS_OFFSET_WIDTH 26
/*
* Since inode.namelen is a unsigned 6-bit number, the maximum cramfs
* path length is 63 << 2 = 252.
*/
#define CRAMFS_MAXPATHLEN (((1 << CRAMFS_NAMELEN_WIDTH) - 1) << 2)
/* /*
* Reasonably terse representation of the inode data. * Reasonably terse representation of the inode data.
*/ */
...@@ -52,14 +58,14 @@ struct cramfs_info { ...@@ -52,14 +58,14 @@ struct cramfs_info {
* Superblock information at the beginning of the FS. * Superblock information at the beginning of the FS.
*/ */
struct cramfs_super { struct cramfs_super {
u32 magic; /* 0x28cd3d45 - random number */ u32 magic; /* 0x28cd3d45 - random number */
u32 size; /* length in bytes */ u32 size; /* length in bytes */
u32 flags; /* 0 */ u32 flags; /* feature flags */
u32 future; /* 0 */ u32 future; /* reserved for future use */
u8 signature[16]; /* "Compressed ROMFS" */ u8 signature[16]; /* "Compressed ROMFS" */
struct cramfs_info fsid; /* unique filesystem info */ struct cramfs_info fsid; /* unique filesystem info */
u8 name[16]; /* user-defined name */ u8 name[16]; /* user-defined name */
struct cramfs_inode root; /* Root inode data */ struct cramfs_inode root; /* root inode data */
}; };
/* /*
...@@ -79,7 +85,10 @@ struct cramfs_super { ...@@ -79,7 +85,10 @@ struct cramfs_super {
* if (flags & ~CRAMFS_SUPPORTED_FLAGS). Maybe that should be * if (flags & ~CRAMFS_SUPPORTED_FLAGS). Maybe that should be
* changed to test super.future instead. * changed to test super.future instead.
*/ */
#define CRAMFS_SUPPORTED_FLAGS (0x7ff) #define CRAMFS_SUPPORTED_FLAGS ( 0x000000ff \
| CRAMFS_FLAG_HOLES \
| CRAMFS_FLAG_WRONG_SIGNATURE \
| CRAMFS_FLAG_SHIFTED_ROOT_OFFSET )
/* Uncompression interfaces to the underlying zlib */ /* Uncompression interfaces to the underlying zlib */
int cramfs_uncompress_block(void *dst, int dstlen, void *src, int srclen); int cramfs_uncompress_block(void *dst, int dstlen, void *src, int srclen);
......
CC = gcc
CFLAGS = -W -Wall -O2 -g
CPPFLAGS = -I../../include
LDLIBS = -lz
PROGS = mkcramfs cramfsck
all: $(PROGS)
distclean clean:
rm -f $(PROGS)
.PHONY: all clean
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment