linux/fs/ubifs
Artem Bityutskiy b50b9f4085 UBIFS: do not free write-buffers when in R/O mode
Currently UBIFS has a small optimization - it frees write-buffers when it is
re-mounted from R/W mode to R/O mode. Of course, when it is mounted R/O, it
does not allocate write-buffers as well.

This optimization is nice but it leads to subtle problems and complications
in recovery, which I can reproduce using the integck test. The symptoms are
that after a power cut the file-system cannot be mounted if we first mount
it R/O, and then re-mount R/W - 'ubifs_rcvry_gc_commit()' prints:

UBIFS error (pid 34456): could not find an empty LEB

Analysis of the  problem.

When mounting R/W, the reply process sets journal heads to buds [1], but
when mounting R/O - it does not do this, because the write-buffers are not
allocated. So 'ubifs_rcvry_gc_commit()' works completely differently for the
same file-system but for the following 2 cases:

1. mounting R/W after a power cut and recover
2. mounting R/O after a power cut, re-mounting R/W and run deferred recovery

In the former case, we have journal heads seeked to the a bud, in the latter
case, they are non-seeked (wbuf->lnum == -1). So in the latter case we do not
try to recover the GC LEB by garbage-collecting to the GC head, but we just
try to find an empty LEB, and there may be no empty LEBs, so we just fail.
On the other hand, in the former case (mount R/W), we are able to make a GC LEB
(@c->gc_lnum) by garbage-collecting.

Thus, let's remove this small nice optimization and always allocate
write-buffers. This should not make too big difference - we have only 3
of them, each of max. write unit size, which is usually 2KiB. So this is
about 6KiB of RAM for the typical case, and only when mounted R/O.

[1]: Note, currently the replay process is setting (seeking) the journal heads
to _some_ buds, not necessarily to the buds which had been the journal heads
before the power cut happened. This will be fixed separately.

Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Cc: stable@kernel.org
2011-05-02 19:23:36 +03:00
..
budget.c Fix common misspellings 2011-03-31 11:26:23 -03:00
commit.c UBIFS: do not read flash unnecessarily 2011-04-05 10:39:40 +03:00
compress.c UBIFS: fix sparse warnings 2008-12-31 14:13:24 +02:00
debug.c UBIFS: fix debugging failure in dbg_check_space_info 2011-04-05 11:07:37 +03:00
debug.h UBIFS: fix compilation warnings when compiling with gcc 4.5 2011-04-13 11:59:09 +03:00
dir.c fs: Remove i_nlink check from file system link callback 2011-03-15 02:21:44 -04:00
file.c UBIFS: fix oops when R/O file-system is fsync'ed 2011-04-13 10:43:32 +03:00
find.c UBIFS: improve find function interface 2009-03-08 13:29:09 +02:00
gc.c UBIFS: introduce new flags for RO mounts 2010-09-19 21:07:58 +03:00
io.c UBIFS: use max_write_size for write-buffers 2011-03-08 10:12:49 +02:00
ioctl.c userns: rename is_owner_or_cap to inode_owner_or_capable 2011-03-23 19:47:13 -07:00
journal.c UBIFS: handle allocation failures in UBIFS write path 2011-03-11 10:52:07 +02:00
Kconfig UBIFS: do not select KALLSYMS_ALL 2011-04-05 10:45:45 +03:00
key.h UBIFS: mark unused key objects as invalid 2010-08-30 10:19:08 +03:00
log.c UBIFS: do not free write-buffers when in R/O mode 2011-05-02 19:23:36 +03:00
lprops.c UBIFS: use GFP_NOFS properly 2011-03-24 16:14:26 +02:00
lpt_commit.c UBIFS: use GFP_NOFS properly 2011-03-24 16:14:26 +02:00
lpt.c UBIFS: fix oops on error path in read_pnode 2011-04-05 10:40:31 +03:00
Makefile
master.c UBIFS: introduce new flags for RO mounts 2010-09-19 21:07:58 +03:00
misc.h UBIFS: introduce new flags for RO mounts 2010-09-19 21:07:58 +03:00
orphan.c UBIFS: use GFP_NOFS properly 2011-03-24 16:14:26 +02:00
recovery.c UBIFS: fix master node recovery 2011-04-21 15:27:21 +03:00
replay.c UBIFS: do not allocate unneeded scan buffer 2010-10-21 11:15:19 +03:00
sb.c UBIFS: introduce new flags for RO mounts 2010-09-19 21:07:58 +03:00
scan.c UBIFS: remove double semicolon 2011-02-06 15:08:02 +02:00
shrinker.c UBIFS: introduce new flags for RO mounts 2010-09-19 21:07:58 +03:00
super.c UBIFS: do not free write-buffers when in R/O mode 2011-05-02 19:23:36 +03:00
tnc_commit.c UBIFS: do not print scary error messages needlessly 2009-09-10 12:06:47 +03:00
tnc_misc.c UBIFS: correct key comparison 2008-09-30 11:12:57 +03:00
tnc.c UBIFS: introduce mounting flag 2011-01-17 23:24:30 +02:00
ubifs-media.h UBIFS: define journal head numbers in ubifs-media.h 2009-09-15 14:45:35 +03:00
ubifs.h UBIFS: handle allocation failures in UBIFS write path 2011-03-11 10:52:07 +02:00
xattr.c fs: export empty_aops 2011-04-05 23:51:48 +02:00