diff options
author | Matthew L. Creech <mlcreech@gmail.com> | 2011-05-05 16:33:20 -0400 |
---|---|---|
committer | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2011-05-16 07:12:14 -0400 |
commit | 9f58d3503a1368673609db1962e4a584261b62eb (patch) | |
tree | 9b31f7f6f6c8513d80b5e807f029d225c9be9b25 | |
parent | e11602ea3e43392904db7a579dc990062ebb7151 (diff) |
UBIFS: add a superblock flag for free space fix-up
The 'space_fixup' flag can be set in the superblock of a new filesystem by
mkfs.ubifs to indicate that any eraseblocks with free space remaining should be
fixed-up the first time it's mounted (after which the flag is un-set). This
means that the UBIFS image has been flashed by a "dumb" flasher and the free
space has been actually programmed (writing all 0xFFs), so this free space
cannot be used. UBIFS fixes the free space up by re-writing the contents of all
LEBs with free space using the atomic LEB change UBI operation.
Artem: improved commit message, add some more commentaries to the code.
Signed-off-by: Matthew L. Creech <mlcreech@gmail.com>
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
-rw-r--r-- | fs/ubifs/debug.c | 2 | ||||
-rw-r--r-- | fs/ubifs/sb.c | 1 | ||||
-rw-r--r-- | fs/ubifs/ubifs-media.h | 2 | ||||
-rw-r--r-- | fs/ubifs/ubifs.h | 2 |
4 files changed, 7 insertions, 0 deletions
diff --git a/fs/ubifs/debug.c b/fs/ubifs/debug.c index b5ba2ea5b626..f46d77e9f031 100644 --- a/fs/ubifs/debug.c +++ b/fs/ubifs/debug.c | |||
@@ -316,6 +316,8 @@ void dbg_dump_node(const struct ubifs_info *c, const void *node) | |||
316 | printk(KERN_DEBUG "\tflags %#x\n", sup_flags); | 316 | printk(KERN_DEBUG "\tflags %#x\n", sup_flags); |
317 | printk(KERN_DEBUG "\t big_lpt %u\n", | 317 | printk(KERN_DEBUG "\t big_lpt %u\n", |
318 | !!(sup_flags & UBIFS_FLG_BIGLPT)); | 318 | !!(sup_flags & UBIFS_FLG_BIGLPT)); |
319 | printk(KERN_DEBUG "\t space_fixup %u\n", | ||
320 | !!(sup_flags & UBIFS_FLG_SPACE_FIXUP)); | ||
319 | printk(KERN_DEBUG "\tmin_io_size %u\n", | 321 | printk(KERN_DEBUG "\tmin_io_size %u\n", |
320 | le32_to_cpu(sup->min_io_size)); | 322 | le32_to_cpu(sup->min_io_size)); |
321 | printk(KERN_DEBUG "\tleb_size %u\n", | 323 | printk(KERN_DEBUG "\tleb_size %u\n", |
diff --git a/fs/ubifs/sb.c b/fs/ubifs/sb.c index cad60b51f7c4..93d69289d6f4 100644 --- a/fs/ubifs/sb.c +++ b/fs/ubifs/sb.c | |||
@@ -617,6 +617,7 @@ int ubifs_read_superblock(struct ubifs_info *c) | |||
617 | c->vfs_sb->s_time_gran = le32_to_cpu(sup->time_gran); | 617 | c->vfs_sb->s_time_gran = le32_to_cpu(sup->time_gran); |
618 | memcpy(&c->uuid, &sup->uuid, 16); | 618 | memcpy(&c->uuid, &sup->uuid, 16); |
619 | c->big_lpt = !!(sup_flags & UBIFS_FLG_BIGLPT); | 619 | c->big_lpt = !!(sup_flags & UBIFS_FLG_BIGLPT); |
620 | c->space_fixup = !!(sup_flags & UBIFS_FLG_SPACE_FIXUP); | ||
620 | 621 | ||
621 | /* Automatically increase file system size to the maximum size */ | 622 | /* Automatically increase file system size to the maximum size */ |
622 | c->old_leb_cnt = c->leb_cnt; | 623 | c->old_leb_cnt = c->leb_cnt; |
diff --git a/fs/ubifs/ubifs-media.h b/fs/ubifs/ubifs-media.h index b922f03c31ae..e24380cf46ed 100644 --- a/fs/ubifs/ubifs-media.h +++ b/fs/ubifs/ubifs-media.h | |||
@@ -408,9 +408,11 @@ enum { | |||
408 | * Superblock flags. | 408 | * Superblock flags. |
409 | * | 409 | * |
410 | * UBIFS_FLG_BIGLPT: if "big" LPT model is used if set | 410 | * UBIFS_FLG_BIGLPT: if "big" LPT model is used if set |
411 | * UBIFS_FLG_SPACE_FIXUP: first-mount "fixup" of free space within LEBs needed | ||
411 | */ | 412 | */ |
412 | enum { | 413 | enum { |
413 | UBIFS_FLG_BIGLPT = 0x02, | 414 | UBIFS_FLG_BIGLPT = 0x02, |
415 | UBIFS_FLG_SPACE_FIXUP = 0x04, | ||
414 | }; | 416 | }; |
415 | 417 | ||
416 | /** | 418 | /** |
diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h index a2f9d4e3519f..8e27553e9655 100644 --- a/fs/ubifs/ubifs.h +++ b/fs/ubifs/ubifs.h | |||
@@ -1014,6 +1014,7 @@ struct ubifs_debug_info; | |||
1014 | * @cmt_wq: wait queue to sleep on if the log is full and a commit is running | 1014 | * @cmt_wq: wait queue to sleep on if the log is full and a commit is running |
1015 | * | 1015 | * |
1016 | * @big_lpt: flag that LPT is too big to write whole during commit | 1016 | * @big_lpt: flag that LPT is too big to write whole during commit |
1017 | * @space_fixup: flag indicating that free space in LEBs needs to be cleaned up | ||
1017 | * @no_chk_data_crc: do not check CRCs when reading data nodes (except during | 1018 | * @no_chk_data_crc: do not check CRCs when reading data nodes (except during |
1018 | * recovery) | 1019 | * recovery) |
1019 | * @bulk_read: enable bulk-reads | 1020 | * @bulk_read: enable bulk-reads |
@@ -1253,6 +1254,7 @@ struct ubifs_info { | |||
1253 | wait_queue_head_t cmt_wq; | 1254 | wait_queue_head_t cmt_wq; |
1254 | 1255 | ||
1255 | unsigned int big_lpt:1; | 1256 | unsigned int big_lpt:1; |
1257 | unsigned int space_fixup:1; | ||
1256 | unsigned int no_chk_data_crc:1; | 1258 | unsigned int no_chk_data_crc:1; |
1257 | unsigned int bulk_read:1; | 1259 | unsigned int bulk_read:1; |
1258 | unsigned int default_compr:2; | 1260 | unsigned int default_compr:2; |