From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: stable-review@kernel.org, torvalds@linux-foundation.org,
akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk,
Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Subject: [28/55] UBIFS: fix master node recovery
Date: Fri, 29 Apr 2011 11:55:51 -0700 [thread overview]
Message-ID: <20110429185655.275055344@clark.kroah.org> (raw)
In-Reply-To: <20110429185706.GA12824@kroah.com>
2.6.38-stable review patch. If anyone has any objections, please let us know.
------------------
From: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
commit 6e0d9fd38b750d678bf9fd07db23582f52fafa55 upstream.
This patch fixes the following symptoms:
1. Unmount UBIFS cleanly.
2. Start mounting UBIFS R/W and have a power cut immediately
3. Start mounting UBIFS R/O, this succeeds
4. Try to re-mount UBIFS R/W - this fails immediately or later on,
because UBIFS will write the master node to the flash area
which has been written before.
The analysis of the problem:
1. UBIFS is unmounted cleanly, both copies of the master node are clean.
2. UBIFS is being mounter R/W, starts changing master node copy 1, and
a power cut happens. The copy N1 becomes corrupted.
3. UBIFS is being mounted R/O. It notices the copy N1 is corrupted and
reads copy N2. Copy N2 is clean.
4. Because of R/O mode, UBIFS cannot recover copy 1.
5. The mount code (ubifs_mount()) sees that the master node is clean,
so it decides that no recovery is needed.
6. We are re-mounting R/W. UBIFS believes no recovery is needed and
starts updating the master node, but copy N1 is still corrupted
and was not recovered!
Fix this problem by marking the master node as dirty every time we
recover it and we are in R/O mode. This forces further recovery and
the UBIFS cleans-up the corruptions and recovers the copy N1 when
re-mounting R/W later.
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
fs/ubifs/recovery.c | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
--- a/fs/ubifs/recovery.c
+++ b/fs/ubifs/recovery.c
@@ -300,6 +300,32 @@ int ubifs_recover_master_node(struct ubi
goto out_free;
}
memcpy(c->rcvrd_mst_node, c->mst_node, UBIFS_MST_NODE_SZ);
+
+ /*
+ * We had to recover the master node, which means there was an
+ * unclean reboot. However, it is possible that the master node
+ * is clean at this point, i.e., %UBIFS_MST_DIRTY is not set.
+ * E.g., consider the following chain of events:
+ *
+ * 1. UBIFS was cleanly unmounted, so the master node is clean
+ * 2. UBIFS is being mounted R/W and starts changing the master
+ * node in the first (%UBIFS_MST_LNUM). A power cut happens,
+ * so this LEB ends up with some amount of garbage at the
+ * end.
+ * 3. UBIFS is being mounted R/O. We reach this place and
+ * recover the master node from the second LEB
+ * (%UBIFS_MST_LNUM + 1). But we cannot update the media
+ * because we are being mounted R/O. We have to defer the
+ * operation.
+ * 4. However, this master node (@c->mst_node) is marked as
+ * clean (since the step 1). And if we just return, the
+ * mount code will be confused and won't recover the master
+ * node when it is re-mounter R/W later.
+ *
+ * Thus, to force the recovery by marking the master node as
+ * dirty.
+ */
+ c->mst_node->flags |= cpu_to_le32(UBIFS_MST_DIRTY);
} else {
/* Write the recovered master node */
c->max_sqnum = le64_to_cpu(mst->ch.sqnum) - 1;
next prev parent reply other threads:[~2011-04-29 19:05 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-29 18:57 [00/55] 2.6.38.5-stable review Greg KH
2011-04-29 18:55 ` [01/55] ath9k_hw: fix stopping rx DMA during resets Greg KH
2011-04-29 18:55 ` [02/55] netxen: limit skb frags for non tso packet Greg KH
2011-04-29 18:55 ` [03/55] ath: add missing regdomain pair 0x5c mapping Greg KH
2011-04-29 18:55 ` [04/55] block, blk-sysfs: Fix an err return path in blk_register_queue() Greg KH
2011-04-29 18:55 ` [05/55] p54: Initialize extra_len in p54_tx_80211 Greg KH
2011-04-29 18:55 ` [06/55] qlcnic: limit skb frags for non tso packet Greg KH
2011-04-29 18:55 ` [07/55] nfsd4: fix struct file leak on delegation Greg KH
2011-04-29 18:55 ` [08/55] nfsd4: Fix filp leak Greg KH
2011-04-29 18:55 ` [09/55] virtio: Decrement avail idx on buffer detach Greg KH
2011-04-29 18:55 ` [10/55] x86, gart: Set DISTLBWALKPRB bit always Greg KH
2011-04-29 18:55 ` [11/55] x86, gart: Make sure GART does not map physmem above 1TB Greg KH
2011-04-29 18:55 ` [12/55] intel-iommu: Fix use after release during device attach Greg KH
2011-04-29 18:55 ` [13/55] intel-iommu: Unlink domain from iommu Greg KH
2011-04-29 18:55 ` [14/55] intel-iommu: Fix get_domain_for_dev() error path Greg KH
2011-04-29 18:55 ` [15/55] drm/radeon/kms: pll tweaks for r7xx Greg KH
2011-04-29 18:55 ` [16/55] drm/nouveau: fix notifier memory corruption bug Greg KH
2011-04-29 18:55 ` [17/55] drm/radeon/kms: fix bad shift in atom iio table parser Greg KH
2011-04-29 18:55 ` [18/55] drm/i915: Sanitize the output registers after resume Greg KH
2011-04-29 18:55 ` [19/55] drm/i915/tv: Remember the detected TV type Greg KH
2011-04-29 18:55 ` [20/55] tty/n_gsm: fix bug in CRC calculation for gsm1 mode Greg KH
2011-04-29 18:55 ` [21/55] serial/imx: read cts state only after acking cts change irq Greg KH
2011-04-29 18:55 ` [22/55] ASoC: Fix output PGA enabling in wm_hubs CODECs Greg KH
2011-04-29 18:55 ` [23/55] ASoC: codecs: JZ4740: Fix OOPS Greg KH
2011-04-29 18:55 ` [24/55] ALSA: hda - Add a fix-up for Acer dmic with ALC271x codec Greg KH
2011-04-29 18:55 ` [25/55] ahci: dont enable port irq before handler is registered Greg KH
2011-04-29 18:55 ` [26/55] libata: Implement ATA_FLAG_NO_DIPM and apply it to mcp65 Greg KH
2011-04-29 18:55 ` [27/55] kconfig: Avoid buffer underrun in choice input Greg KH
2011-04-29 18:55 ` Greg KH [this message]
2011-04-29 18:55 ` [29/55] ideapad: read brightness setting on brightness key notify Greg KH
2011-04-29 18:55 ` [30/55] ACPI battery: fribble sysfs files from a resume notifier Greg KH
2011-04-29 18:55 ` [31/55] ath9k_hw: partially revert "fix dma descriptor rx error bit parsing" Greg KH
2011-04-29 18:55 ` [32/55] UBIFS: fix false space checking failure Greg KH
2011-04-29 18:55 ` [33/55] [S390] kvm-390: Let kernel exit SIE instruction on work Greg KH
2011-04-29 18:55 ` [34/55] [S390] pfault: fix token handling Greg KH
2011-04-29 18:55 ` [35/55] ACPI / PM: Avoid infinite recurrence while registering power resources Greg KH
2011-04-29 18:55 ` [36/55] [PARISC] slub: fix panic with DISCONTIGMEM Greg KH
2011-05-02 20:04 ` [Stable-review] " Ben Hutchings
2011-05-02 21:44 ` Michael Schmitz
2011-05-03 22:46 ` David Rientjes
2011-05-03 23:17 ` Ben Hutchings
2011-05-03 23:20 ` James Bottomley
2011-05-03 23:57 ` David Rientjes
2011-04-29 18:56 ` [37/55] [PARISC] set memory ranges in N_NORMAL_MEMORY when onlined Greg KH
2011-04-29 18:56 ` [38/55] [media] FLEXCOP-PCI: fix __xlate_proc_name-warning for flexcop-pci Greg KH
2011-04-29 18:56 ` [39/55] virtio: console: Enable call to hvc_remove() on console port remove Greg KH
2011-04-29 18:56 ` [40/55] oom: use pte pages in OOM score Greg KH
2011-04-29 18:56 ` [41/55] mm: check if PTE is already allocated during page fault Greg KH
2011-04-29 18:56 ` [42/55] mm: thp: fix /dev/zero MAP_PRIVATE and vm_flags cleanups Greg KH
2011-04-29 18:56 ` [43/55] m68k/mm: Set all online nodes in N_NORMAL_MEMORY Greg KH
2011-04-29 18:56 ` [44/55] vfs: avoid large kmalloc()s for the fdtable Greg KH
2011-04-29 18:56 ` [45/55] nfs: dont lose MS_SYNCHRONOUS on remount of noac mount Greg KH
2011-04-29 18:56 ` [46/55] NFSv4.1: Ensure state manager thread dies on last umount Greg KH
2011-04-29 18:56 ` [47/55] um: mdd support for 64 bit atomic operations Greg KH
2011-04-29 18:56 ` [48/55] drm: select FRAMEBUFFER_CONSOLE_PRIMARY if we have FRAMEBUFFER_CONSOLE Greg KH
2011-04-29 18:56 ` [49/55] agp: fix arbitrary kernel memory writes Greg KH
2011-04-29 18:56 ` [50/55] agp: fix OOM and buffer overflow Greg KH
2011-04-29 18:56 ` [51/55] iwlwifi: do not set tx power when channel is changing Greg KH
2011-04-29 18:56 ` [52/55] iwl3945: do not deprecate software scan Greg KH
2011-04-29 18:56 ` [53/55] iwl3945: disable hw scan by default Greg KH
2011-04-29 18:56 ` [54/55] iwlegacy: fix tx_power initialization Greg KH
2011-04-29 18:56 ` [55/55] Input: xen-kbdfront - fix mouse getting stuck after save/restore Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110429185655.275055344@clark.kroah.org \
--to=gregkh@suse.de \
--cc=Artem.Bityutskiy@nokia.com \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=linux-kernel@vger.kernel.org \
--cc=stable-review@kernel.org \
--cc=stable@kernel.org \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®