All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ben Hutchings <ben@decadent.org.uk>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: akpm@linux-foundation.org,
	"Linus Torvalds" <torvalds@linux-foundation.org>,
	"Ryusuke Konishi" <konishi.ryusuke@lab.ntt.co.jp>,
	"Anthony Doggett" <Anthony2486@interfaces.org.uk>,
	"Vyacheslav Dubeyko" <slava@dubeyko.com>
Subject: [66/94] nilfs2: fix issue of nilfs_set_page_dirty() for page at EOF boundary
Date: Tue, 28 May 2013 04:49:53 +0100	[thread overview]
Message-ID: <lsq.1369712993.736993733@decadent.org.uk> (raw)
In-Reply-To: <lsq.1369712992.755341692@decadent.org.uk>

3.2.46-rc1 review patch.  If anyone has any objections, please let me know.

------------------

From: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>

commit 136e8770cd5d1fe38b3c613100dd6dc4db6d4fa6 upstream.

nilfs2: fix issue of nilfs_set_page_dirty for page at EOF boundary

DESCRIPTION:
 There are use-cases when NILFS2 file system (formatted with block size
lesser than 4 KB) can be remounted in RO mode because of encountering of
"broken bmap" issue.

The issue was reported by Anthony Doggett <Anthony2486@interfaces.org.uk>:
 "The machine I've been trialling nilfs on is running Debian Testing,
  Linux version 3.2.0-4-686-pae (debian-kernel@lists.debian.org) (gcc
  version 4.6.3 (Debian 4.6.3-14) ) #1 SMP Debian 3.2.35-2), but I've
  also reproduced it (identically) with Debian Unstable amd64 and Debian
  Experimental (using the 3.8-trunk kernel).  The problematic partitions
  were formatted with "mkfs.nilfs2 -b 1024 -B 8192"."

SYMPTOMS:
(1) System log contains error messages likewise:

    [63102.496756] nilfs_direct_assign: invalid pointer: 0
    [63102.496786] NILFS error (device dm-17): nilfs_bmap_assign: broken bmap (inode number=28)
    [63102.496798]
    [63102.524403] Remounting filesystem read-only

(2) The NILFS2 file system is remounted in RO mode.

REPRODUSING PATH:
(1) Create volume group with name "unencrypted" by means of vgcreate utility.
(2) Run script (prepared by Anthony Doggett <Anthony2486@interfaces.org.uk>):

----------------[BEGIN SCRIPT]--------------------

VG=unencrypted
lvcreate --size 2G --name ntest $VG
mkfs.nilfs2 -b 1024 -B 8192 /dev/mapper/$VG-ntest
mkdir /var/tmp/n
mkdir /var/tmp/n/ntest
mount /dev/mapper/$VG-ntest /var/tmp/n/ntest
mkdir /var/tmp/n/ntest/thedir
cd /var/tmp/n/ntest/thedir
sleep 2
date
darcs init
sleep 2
dmesg|tail -n 5
date
darcs whatsnew || true
date
sleep 2
dmesg|tail -n 5
----------------[END SCRIPT]--------------------

REPRODUCIBILITY: 100%

INVESTIGATION:
As it was discovered, the issue takes place during segment
construction after executing such sequence of user-space operations:

  open("_darcs/index", O_RDWR|O_CREAT|O_NOCTTY, 0666) = 7
  fstat(7, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
  ftruncate(7, 60)

The error message "NILFS error (device dm-17): nilfs_bmap_assign: broken
bmap (inode number=28)" takes place because of trying to get block
number for third block of the file with logical offset #3072 bytes.  As
it is possible to see from above output, the file has 60 bytes of the
whole size.  So, it is enough one block (1 KB in size) allocation for
the whole file.  Trying to operate with several blocks instead of one
takes place because of discovering several dirty buffers for this file
in nilfs_segctor_scan_file() method.

The root cause of this issue is in nilfs_set_page_dirty function which
is called just before writing to an mmapped page.

When nilfs_page_mkwrite function handles a page at EOF boundary, it
fills hole blocks only inside EOF through __block_page_mkwrite().

The __block_page_mkwrite() function calls set_page_dirty() after filling
hole blocks, thus nilfs_set_page_dirty function (=
a_ops->set_page_dirty) is called.  However, the current implementation
of nilfs_set_page_dirty() wrongly marks all buffers dirty even for page
at EOF boundary.

As a result, buffers outside EOF are inconsistently marked dirty and
queued for write even though they are not mapped with nilfs_get_block
function.

FIX:
This modifies nilfs_set_page_dirty() not to mark hole blocks dirty.

Thanks to Vyacheslav Dubeyko for his effort on analysis and proposals
for this issue.

Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
Reported-by: Anthony Doggett <Anthony2486@interfaces.org.uk>
Reported-by: Vyacheslav Dubeyko <slava@dubeyko.com>
Cc: Vyacheslav Dubeyko <slava@dubeyko.com>
Tested-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
---
 fs/nilfs2/inode.c |   27 +++++++++++++++++++++++----
 1 file changed, 23 insertions(+), 4 deletions(-)

--- a/fs/nilfs2/inode.c
+++ b/fs/nilfs2/inode.c
@@ -195,13 +195,32 @@ static int nilfs_writepage(struct page *
 
 static int nilfs_set_page_dirty(struct page *page)
 {
-	int ret = __set_page_dirty_buffers(page);
+	int ret = __set_page_dirty_nobuffers(page);
 
-	if (ret) {
+	if (page_has_buffers(page)) {
 		struct inode *inode = page->mapping->host;
-		unsigned nr_dirty = 1 << (PAGE_SHIFT - inode->i_blkbits);
+		unsigned nr_dirty = 0;
+		struct buffer_head *bh, *head;
 
-		nilfs_set_file_dirty(inode, nr_dirty);
+		/*
+		 * This page is locked by callers, and no other thread
+		 * concurrently marks its buffers dirty since they are
+		 * only dirtied through routines in fs/buffer.c in
+		 * which call sites of mark_buffer_dirty are protected
+		 * by page lock.
+		 */
+		bh = head = page_buffers(page);
+		do {
+			/* Do not mark hole blocks dirty */
+			if (buffer_dirty(bh) || !buffer_mapped(bh))
+				continue;
+
+			set_buffer_dirty(bh);
+			nr_dirty++;
+		} while (bh = bh->b_this_page, bh != head);
+
+		if (nr_dirty)
+			nilfs_set_file_dirty(inode, nr_dirty);
 	}
 	return ret;
 }


  parent reply	other threads:[~2013-05-28  3:56 UTC|newest]

Thread overview: 101+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-28  3:49 [00/94] 3.2.46-rc1 review Ben Hutchings
2013-05-28  3:49 ` [59/94] fat: fix possible overflow for fat_clusters Ben Hutchings
2013-05-28  3:49 ` [51/94] ARM: plat-orion: Fix num_resources and id for ge10 and ge11 Ben Hutchings
2013-05-28  3:49 ` [82/94] net_sched: act_ipt forward compat with xtables Ben Hutchings
2013-05-28  3:49 ` [70/94] xhci: Don't warn on empty ring for suspended devices Ben Hutchings
2013-05-28  3:49 ` Ben Hutchings [this message]
2013-05-28  3:49 ` [53/94] TTY: Fix tty miss restart after we turn off flow-control Ben Hutchings
2013-05-28  3:49 ` [87/94] if_cablemodem.h: Add parenthesis around ioctl macros Ben Hutchings
2013-05-28  3:49 ` [08/94] ath9k: fix key allocation error handling for powersave keys Ben Hutchings
2013-05-28  3:49 ` [26/94] tick: Cleanup NOHZ per cpu data on cpu down Ben Hutchings
2013-05-28  3:49 ` [33/94] powerpc/pseries: Fix partition migration hang in stop_topology_update Ben Hutchings
2013-05-28  3:49 ` [21/94] cifs: only set ops for inodes in I_NEW state Ben Hutchings
2013-05-28  3:49 ` [49/94] btrfs: don't stop searching after encountering the wrong item Ben Hutchings
2013-05-28  3:49 ` [68/94] ocfs2: goto out_unlock if ocfs2_get_clusters_nocache() failed in ocfs2_fiemap() Ben Hutchings
2013-05-28  3:49 ` [54/94] sunrpc: clarify comments on rpc_make_runnable Ben Hutchings
2013-05-28 10:14   ` Jeff Layton
2013-05-28 10:41     ` Luis Henriques
2013-05-28 10:48       ` Jeff Layton
2013-05-28  3:49 ` [17/94] B43: Handle DMA RX descriptor underrun Ben Hutchings
2013-05-28  3:49 ` [14/94] ALSA: HDA: Fix Oops caused by dereference NULL pointer Ben Hutchings
2013-05-28  3:49 ` [44/94] usb: option: Add Telewell TW-LTE 4G Ben Hutchings
2013-05-28  3:49 ` [58/94] ACPI / video: Add "Asus UL30A" to ACPI video detect blacklist Ben Hutchings
2013-05-28  3:49 ` [65/94] drivers/block/brd.c: fix brd_lookup_page() race Ben Hutchings
2013-05-28  3:49 ` [40/94] usermodehelper: check subprocess_info->path != NULL Ben Hutchings
2013-05-28  3:49 ` [38/94] USB: UHCI: fix for suspend of virtual HP controller Ben Hutchings
2013-05-28  3:49 ` [31/94] Kirkwood: Enable PCIe port 1 on QNAP TS-11x/TS-21x Ben Hutchings
2013-05-28  3:49 ` [92/94] [media] mantis: fix silly crash case Ben Hutchings
2013-05-28  3:49 ` [50/94] virtio_console: fix uapi header Ben Hutchings
2013-05-28  3:49 ` [81/94] 3c509.c: call SET_NETDEV_DEV for all device types (ISA/ISAPnP/EISA) Ben Hutchings
2013-05-28  3:49   ` Ben Hutchings
2013-05-28  3:49 ` [43/94] USB: reset resume quirk needed by a hub Ben Hutchings
2013-05-28  3:49 ` [83/94] bridge: fix race with topology change timer Ben Hutchings
2013-05-28  3:49 ` [37/94] USB: xHCI: override bogus bulk wMaxPacketSize values Ben Hutchings
2013-05-28  3:49 ` [90/94] xfrm6: release dev before returning error Ben Hutchings
2013-05-28  3:49   ` Ben Hutchings
2013-05-28  3:49 ` [94/94] um: Serve io_remap_pfn_range() Ben Hutchings
2013-05-28  3:49 ` [10/94] net/eth/ibmveth: Fixup retrieval of MAC address Ben Hutchings
2013-05-28  3:49 ` [56/94] perf: net_dropmonitor: Fix trace parameter order Ben Hutchings
2013-05-28  3:49 ` [76/94] x86, efivars: firmware bug workarounds should be in platform code Ben Hutchings
2013-05-28  3:49 ` [30/94] hwmon: fix error return code in abituguru_probe() Ben Hutchings
2013-05-28  3:49 ` [19/94] mwifiex: fix memory leak issue when driver unload Ben Hutchings
2013-05-28  3:49 ` [42/94] ipmi: ipmi_devintf: compat_ioctl method fails to take ipmi_mutex Ben Hutchings
2013-05-28  3:49 ` [52/94] USB: cxacru: potential underflow in cxacru_cm_get_array() Ben Hutchings
2013-05-28  3:49 ` [80/94] tcp: force a dst refcount when prequeue packet Ben Hutchings
2013-05-28  3:49 ` [22/94] hp_accel: Ignore the error from lis3lv02d_poweron() at resume Ben Hutchings
2013-05-28  3:49 ` [11/94] ext4: limit group search loop for non-extent files Ben Hutchings
2013-05-28  3:49 ` [13/94] autofs - remove autofs dentry mount check Ben Hutchings
2013-05-28  3:49 ` [29/94] staging: vt6656: use free_netdev instead of kfree Ben Hutchings
2013-05-28  3:49 ` [24/94] dm snapshot: fix error return code in snapshot_ctr Ben Hutchings
2013-05-28  3:49 ` [35/94] timer: Don't reinitialize the cpu base lock during CPU_UP_PREPARE Ben Hutchings
2013-05-28  3:49 ` [09/94] nfsd4: don't allow owner override on 4.1 CLAIM_FH opens Ben Hutchings
2013-05-28  3:49 ` [88/94] macvlan: fix passthru mode race between dev removal and rx path Ben Hutchings
2013-05-28  3:49 ` [91/94] drivers/rtc/rtc-pcf2123.c: fix error return code in pcf2123_probe() Ben Hutchings
2013-05-28  3:49 ` [20/94] mwifiex: fix setting of multicast filter Ben Hutchings
2013-05-28  3:49 ` [74/94] pch_dma: Use GFP_ATOMIC because called from interrupt context Ben Hutchings
2013-05-28  3:49 ` [85/94] 3c59x: fix freeing nonexistent resource on driver unload Ben Hutchings
2013-05-28  3:49 ` [46/94] USB: option: add device IDs for Dell 5804 (Novatel E371) WWAN card Ben Hutchings
2013-05-28  3:49 ` [89/94] ipv6: do not clear pinet6 field Ben Hutchings
2013-05-28  3:49 ` [12/94] xen/vcpu/pvhvm: Fix vcpu hotplugging hanging Ben Hutchings
2013-05-28  3:49 ` [67/94] random: fix accounting race condition with lockless irq entropy_count update Ben Hutchings
2013-05-28  3:49 ` [71/94] sched/debug: Limit sd->*_idx range on sysctl Ben Hutchings
2013-05-28  3:49 ` [77/94] efi: Export efi_query_variable_store() for efivars.ko Ben Hutchings
2013-05-28  3:49 ` [27/94] ACPI / EC: Restart transaction even when the IBF flag set Ben Hutchings
2013-05-28  3:49 ` [72/94] sched/debug: Fix sd->*_idx limit range avoiding overflow Ben Hutchings
2013-05-28  3:49 ` [23/94] KVM: VMX: fix halt emulation while emulating invalid guest sate Ben Hutchings
2013-05-28  3:49 ` [02/94] mmc: at91/avr32/atmel-mci: fix DMA-channel leak on module unload Ben Hutchings
2013-05-28  3:49 ` [03/94] mmc: core: Fix bit width test failing on old eMMC cards Ben Hutchings
2013-05-28  3:49 ` [69/94] mm/pagewalk.c: walk_page_range should avoid VM_PFNMAP areas Ben Hutchings
2013-05-28  3:49 ` [41/94] drivers/char/ipmi: memcpy, need additional 2 bytes to avoid memory overflow Ben Hutchings
2013-05-28  3:49 ` [62/94] rapidio/tsi721: fix bug in MSI interrupt handling Ben Hutchings
2013-05-28  3:49 ` [60/94] wait: fix false timeouts when using wait_event_timeout() Ben Hutchings
2013-05-28  3:49 ` [84/94] packet: tpacket_v3: do not trigger bug() on wrong header status Ben Hutchings
2013-05-28  3:49 ` [75/94] drbd: fix for deadlock when using automatic split-brain-recovery Ben Hutchings
2013-05-28  3:49 ` [48/94] USB: ftdi_sio: Add support for Newport CONEX motor drivers Ben Hutchings
2013-05-28  3:49 ` [47/94] i2c: designware: always clear interrupts before enabling them Ben Hutchings
2013-05-28  3:49 ` [57/94] perf: net_dropmonitor: Fix symbol-relative addresses Ben Hutchings
2013-05-28  3:49 ` [63/94] mm compaction: fix of improper cache flush in migration code Ben Hutchings
2013-05-28  3:49 ` [55/94] SUNRPC: Prevent an rpc_task wakeup race Ben Hutchings
2013-05-28  3:49 ` [16/94] ACPICA: Fix possible buffer overflow during a field unit read operation Ben Hutchings
2013-05-28  3:49 ` [39/94] tracing: Fix leaks of filter preds Ben Hutchings
2013-05-28  3:49 ` [07/94] ASoC: wm8994: missing break in wm8994_aif3_hw_params() Ben Hutchings
2013-05-28  3:49 ` [15/94] iscsi-target: Fix processing of OOO commands Ben Hutchings
2013-05-28  3:49 ` [34/94] powerpc: Bring all threads online prior to migration/hibernation Ben Hutchings
2013-05-28  3:49 ` [45/94] USB: Blacklisted Cinterion's PLxx WWAN Interface Ben Hutchings
2013-05-28  3:49 ` [01/94] Revert "drm/i915: Fix detection of base of stolen memory" Ben Hutchings
2013-05-28  3:49 ` [64/94] mm/THP: use pmd_populate() to update the pmd with pgtable_t pointer Ben Hutchings
2013-05-28  3:49 ` [78/94] x86,efi: Check max_size only if it is non-zero Ben Hutchings
2013-05-28  3:49 ` [86/94] 3c59x: fix PCI resource management Ben Hutchings
2013-05-28  3:49 ` [79/94] x86,efi: Implement efi_no_storage_paranoia parameter Ben Hutchings
2013-05-28  3:49 ` [18/94] mwifiex: clear is_suspended flag when interrupt is received early Ben Hutchings
2013-05-28  3:49 ` [06/94] x86: Eliminate irq_mis_count counted in arch_irq_stat Ben Hutchings
2013-05-28  3:49 ` [05/94] mmc: atmel-mci: pio hang on block errors Ben Hutchings
2013-05-28  3:49 ` [73/94] ipvs: ip_vs_sip_fill_param() BUG: bad check of return value Ben Hutchings
2013-05-28  3:49 ` [04/94] mfd: adp5520: Restore mode bits on resume Ben Hutchings
2013-05-28  3:49 ` [25/94] dm bufio: avoid a possible __vmalloc deadlock Ben Hutchings
2013-05-28  3:49 ` [93/94] staging: comedi: prevent auto-unconfig of manually configured devices Ben Hutchings
2013-05-28  3:49 ` [28/94] drm/radeon: check incoming cliprects pointer Ben Hutchings
2013-05-28  3:49 ` [61/94] mm: mmu_notifier: re-fix freed page still mapped in secondary MMU Ben Hutchings
2013-05-28  3:49 ` [32/94] avr32: fix relocation check for signed 18-bit offset Ben Hutchings
2013-05-28  3:49 ` [36/94] tg3: Skip powering down function 0 on certain serdes devices Ben Hutchings
2013-05-28  4:25 ` [00/94] 3.2.46-rc1 review Ben Hutchings

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=lsq.1369712993.736993733@decadent.org.uk \
    --to=ben@decadent.org.uk \
    --cc=Anthony2486@interfaces.org.uk \
    --cc=akpm@linux-foundation.org \
    --cc=konishi.ryusuke@lab.ntt.co.jp \
    --cc=linux-kernel@vger.kernel.org \
    --cc=slava@dubeyko.com \
    --cc=stable@vger.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.