diff mbox

[xfstests,v4,8/8] overlay: accessing stacked overlayfs files

Message ID 1487842966-30986-9-git-send-email-xzhou@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Murphy Zhou Feb. 23, 2017, 9:42 a.m. UTC
Lower dir comes from another overlayfs dir, then
accessing files in it should work.

CC: Miklos Szeredi <mszeredi@redhat.com>
Signed-off-by: Xiong Zhou <xzhou@redhat.com>
---
 tests/overlay/029     | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/overlay/029.out |   5 +++
 tests/overlay/group   |   1 +
 3 files changed, 106 insertions(+)
 create mode 100755 tests/overlay/029
 create mode 100644 tests/overlay/029.out

Comments

Amir Goldstein March 3, 2017, 8:19 a.m. UTC | #1
On Thu, Feb 23, 2017 at 11:42 AM, Xiong Zhou <xzhou@redhat.com> wrote:
> Lower dir comes from another overlayfs dir, then
> accessing files in it should work.
>
> CC: Miklos Szeredi <mszeredi@redhat.com>
> Signed-off-by: Xiong Zhou <xzhou@redhat.com>
> ---

FYI, this test triggers a false positive lockdep splat.
I did not notice it earlier, because I carry a fix patch that Miklos
did not pick up yet.

The fix patch is here:
http://www.spinics.net/lists/linux-unionfs/msg01428.html

overlay/029 [08:14:06]
=============================================
[ INFO: possible recursive locking detected ]
4.9.0-debug-12264-g60ae0f1 #426 Not tainted
---------------------------------------------
cat/3367 is trying to acquire lock:
 (&sb->s_type->i_mutex_key#15){.+.+.+}, at: [<ffffffff81217858>]
lookup_slow+0x81/0x185

but task is already holding lock:
 (&sb->s_type->i_mutex_key#15){.+.+.+}, at: [<ffffffff8121b955>]
do_last+0x179/0x608

other info that might help us debug this:
 Possible unsafe locking scenario:

       CPU0
       ----
  lock(&sb->s_type->i_mutex_key#15);
  lock(&sb->s_type->i_mutex_key#15);

 *** DEADLOCK ***

 May be due to missing lock nesting notation

1 lock held by cat/3367:
 #0:  (&sb->s_type->i_mutex_key#15){.+.+.+}, at: [<ffffffff8121b955>]
do_last+0x179/0x608

stack backtrace:
CPU: 0 PID: 3367 Comm: cat Not tainted 4.9.0-debug-12264-g60ae0f1 #426
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS
Ubuntu-1.8.2-1ubuntu1 04/01/2014
Call Trace:
 dump_stack+0x85/0xbe
 __lock_acquire+0x1082/0x153f
 ? mark_held_locks+0x5e/0x74
 lock_acquire+0x13b/0x1d6
 ? lock_acquire+0x13b/0x1d6
 ? lookup_slow+0x81/0x185
 down_read+0x43/0x9a
 ? lookup_slow+0x81/0x185
 lookup_slow+0x81/0x185
 lookup_one_len_unlocked+0xca/0xdc
 ovl_lookup_single+0x30/0x2c6
 ? ovl_lookup+0x158/0x414
 ovl_lookup_layer+0x46/0x137
 ovl_lookup+0x1b5/0x414
 ? __d_lookup+0x22a/0x23c
 lookup_open+0x44c/0x622
 ? lookup_open+0x44c/0x622
 ? rwsem_down_read_failed+0x25/0x164
 do_last+0x196/0x608
 ? path_init+0x2d9/0x681
 path_openat+0x285/0x30c
 ? __might_fault+0x37/0x84
 do_filp_open+0x4d/0xa3
 ? sched_clock+0x9/0xd
 ? __alloc_fd+0x1af/0x1c1
 ? _raw_spin_unlock+0x27/0x31
 do_sys_open+0x13c/0x1cb
 ? do_sys_open+0x13c/0x1cb
 SyS_open+0x1e/0x20
 entry_SYSCALL_64_fastpath+0x1f/0xc2
RIP: 0033:0x7f253e9d7960
RSP: 002b:00007fff5caeba48 EFLAGS: 00000246 ORIG_RAX: 0000000000000002
RAX: ffffffffffffffda RBX: 00007fff5caebca8 RCX: 00007f253e9d7960
RDX: 0000000000020000 RSI: 0000000000000000 RDI: 00007fff5caee235
RBP: 0000000000001000 R08: 0000000000000000 R09: 0000000000000000
R10: 00007fff5caeb810 R11: 0000000000000246 R12: 00000000004025a6
R13: 00007fff5caebca0 R14: 0000000000000000 R15: 0000000000000000
 [08:14:07] 1s
--
To unsubscribe from this list: send the line "unsubscribe fstests" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/tests/overlay/029 b/tests/overlay/029
new file mode 100755
index 0000000..902a84c
--- /dev/null
+++ b/tests/overlay/029
@@ -0,0 +1,100 @@ 
+#! /bin/bash
+# FS QA Test 029
+#
+# There are dirs/files in lower dir and upper dir before
+# mounting overlayfs. After mounting, use dir in overlayfs
+# mountpoint as lowerdir to mount another overlayfs, then
+# access old files through the second overlayfs. It was
+# not working, kernel commit below fixed it.
+#
+# c4fcfc1619ea ovl: fix d_real() for stacked fs
+#
+# This reproducer was originally written by
+#     Miklos Szeredi <mszeredi@redhat.com>
+#
+#-----------------------------------------------------------------------
+# Copyright (c) 2017 Red Hat Inc.  All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write the Free Software Foundation,
+# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#-----------------------------------------------------------------------
+#
+
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1	# failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+	cd /
+	$UMOUNT_PROG $tmp/mnt
+	rm -rf $tmp
+	rm -f $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+
+# Modify as appropriate.
+_supported_fs overlay
+_supported_os Linux
+_require_scratch
+
+# Remove all files from previous tests
+_scratch_mkfs
+
+# Preparing files
+upperdir=$SCRATCH_DEV/$OVERLAY_UPPER_DIR
+lowerdir=$SCRATCH_DEV/$OVERLAY_LOWER_DIR
+mkdir -p $upperdir/up
+echo foo > $upperdir/up/foo
+mkdir -p $lowerdir/low
+echo bar > $lowerdir/low/bar
+
+# mount overlay in SCRATCH_MNT
+_scratch_mount
+
+mkdir -p $tmp/{upper,mnt,work}
+# mount overlay again using upper dir from SCRATCH_MNT dir
+_overlay_mount_dirs $SCRATCH_MNT/up $tmp/{upper,work} \
+  overlay $tmp/mnt
+# accessing file in the second mount
+cat $tmp/mnt/foo
+$UMOUNT_PROG $tmp/mnt
+
+# mount overlay again using lower dir from SCRATCH_MNT dir
+_overlay_mount_dirs $SCRATCH_MNT/low $tmp/{upper,work} \
+  overlay $tmp/mnt
+cat $tmp/mnt/bar
+$UMOUNT_PROG $tmp/mnt
+
+# mount overlay again using SCRATCH_MNT dir
+_overlay_mount_dirs $SCRATCH_MNT/ $tmp/{upper,work} \
+  overlay $tmp/mnt
+cat $tmp/mnt/up/foo
+cat $tmp/mnt/low/bar
+
+# success, all done
+status=0
+exit
diff --git a/tests/overlay/029.out b/tests/overlay/029.out
new file mode 100644
index 0000000..e7f192c
--- /dev/null
+++ b/tests/overlay/029.out
@@ -0,0 +1,5 @@ 
+QA output created by 029
+foo
+bar
+foo
+bar
diff --git a/tests/overlay/group b/tests/overlay/group
index cf058fc..7e72a30 100644
--- a/tests/overlay/group
+++ b/tests/overlay/group
@@ -31,3 +31,4 @@ 
 026 auto attr quick
 027 auto quick perms
 028 auto copyup quick
+029 auto quick