JFFS2
From Wikipedia, the free encyclopedia
This article may contain improper references to self-published sources. Please help improve it by removing references to unreliable sources where they are used inappropriately. (May 2008) |
The introduction to this article provides insufficient context for those unfamiliar with the subject. Please help improve the article with a good introductory style. |
Journalling Flash File System version 2 or JFFS2 is a log-structured file system for use in flash memory devices.[1] It is the successor to JFFS. JFFS2 has been included in the Linux kernel since the 2.4.10 release. JFFS2 is also available for Open Firmware, the eCos RTOS and the RedBoot bootloader.
The new LogFS filesystem is aimed to replace JFFS2 for most uses, but focuses more on large devices (> 64 MB - 512 MB), see also UBIFS and YAFFS.
Contents |
[edit] Features
JFFS2 introduced:
- Support for NAND flash devices. This involved a considerable amount of work as NAND devices have a sequential I/O interface and cannot be memory-mapped for reading.
- Hard links. This was not possible in JFFS because of limitations in the on-disk format.
- Compression. Three algorithms are available: zlib, rubin and rtime.
- Better performance. JFFS treated the disk as a purely circular log. This generated a great deal of unnecessary I/O. The garbage collection algorithm in JFFS2 makes this mostly unnecessary.
[edit] Design
As with JFFS, changes to files and directories are "logged" to flash in nodes, of which there are two types:
- inodes: a header with file metadata, followed by a payload of file data (if any). Compressed payloads are limited to one page.
- dirent nodes: directory entries each holding a name and an inode number. Hard links are represented as different names with the same inode number. The special inode number 0 represents an unlink.
As with JFFS, nodes start out as valid when they are created, and become obsolete when a newer version has been created elsewhere.
Unlike JFFS, however, there is no circular log. Instead, JFFS2 deals in blocks, a unit the same size as the erase segment of the flash medium. Blocks are filled, one at a time, with nodes from bottom up. A clean block is one that contains only valid nodes. A dirty block contains at least one obsolete node. A free block contains no nodes.
The garbage collector runs in the background, turning dirty blocks into free blocks. It does this by copying valid nodes to a new block and skipping obsolete ones. That done, it erases the dirty block and tags it with a special marker designating it as a free block (to prevent confusion if power is lost during an erase operation).
To make wear-levelling more even and prevent erasures from being too concentrated on mostly-static file systems, the garbage collector will occasionally also consume clean blocks.
[edit] Disadvantages
- All nodes must still be scanned at mount time. This is slow and is becoming an increasingly serious problem as flash devices scale upward into the terabyte range.
- Writing many small blocks of data can even lead to negative compression rates, so it is essential for applications to use large write buffers.
- There is no practical way to tell how much usable free space is left on a device since this depends both on how well additional data can be compressed, and the writing sequence.
[edit] See also
[edit] External links
- Red Hat JFFS2 site
- JFFS: The Journalling Flash File System by David Woodhouse (PDF)
- JFFS2 official mailing list