On Mon, Oct 12, 2015 at 10:01 AM, Zheng Liu <gnehzuil.liu@xxxxxxxxx> wrote: > From: Zheng Liu <wenqing.lz@xxxxxxxxxx> > > This patch makes overlayfs count subdirs to get the correct link count > because 9pfs needs this. Otherwise, we will get a warning message from > inc_nlink() because inode->i_nlink == 0 and inode->i_state w/o > I_LINKABLE flag in a virtualization environment. The warning message > looks like as below. > > ------------[ cut here ]------------ > WARNING: CPU: 0 PID: 27343 at ../fs/inode.c:330 inc_nlink+0x32/0x50() > Modules linked in: > CPU: 0 PID: 27343 Comm: mkdir Tainted: G W 4.1.6+ #1 > ffffffff81540a0e ffff88046b103da8 ffffffff8120d849 ffff88046b103db8 > ffffffff8120d897 ffff88046b103df8 ffffffff81044bbd ffff88046b2a0403 > ffff88046b936d68 0000000000000000 ffff88046b936d68 ffff88046b2a9300 > Call Trace: > [<ffffffff8120d849>] __dump_stack+0x19/0x20 > [<ffffffff8120d897>] dump_stack+0x47/0x60 > [<ffffffff81044bbd>] warn_slowpath_common+0xad/0xe0 > [<ffffffff81044c0a>] warn_slowpath_null+0x1a/0x20 > [<ffffffff8117caa2>] inc_nlink+0x32/0x50 > [<ffffffff811d3c89>] v9fs_vfs_mkdir_dotl+0x269/0x2b0 > [<ffffffff8116f9a9>] vfs_mkdir+0x89/0xd0 > [<ffffffff81173912>] SyS_mkdirat+0x82/0xd0 > [<ffffffff8116dae9>] SyS_mkdir+0x19/0x20 > [<ffffffff813b29d7>] system_call_fastpath+0x12/0x6a > ---[ end trace dd0930847ec4e6d2 ]--- > > The root cause is that overlayfs doesn't count subdirs and it reports > a wrong link count. From the output of stat(1) we can seen that the > 'Links' of a directory is 1, but at least it should be 2. When creating > a directory in 9pfs, the parent directory's inode->i_nlink is 0 and a > WARN_ON will be triggered. I don't see how the above two statements have anything to do with each other. And the "fix" is obviously wrong (and not tested), since it still won't count the subdirectories. > This warning can be reproduced by the following steps. > > [In host os] > 1. build a ROOTFS for booting up a vm using 9pfs > 2. mount -t overlay -olowerdir=${lower},upperdir=${upper},workdir={work} none ${ROOTFS}/mnt > 3. run a vm using 9pfs > e.g. http://www.linux-kvm.org/page/9p_virtio > [In guest os] > 4. cd /mnt > 5. mkdir 1 > 6. rm -rf 1; mkdir 1 In the stack trace above I don'[t see overlayfs calls. So apparently the mkdir goes directly to the 9p filesystem. So where's overlayfs in all this? Thanks, Miklos > > Cc: Miklos Szeredi <miklos@xxxxxxxxxx> > Signed-off-by: Zheng Liu <wenqing.lz@xxxxxxxxxx> > --- > fs/overlayfs/dir.c | 8 -------- > 1 file changed, 8 deletions(-) > > diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c > index 692ceda..fbeb841 100644 > --- a/fs/overlayfs/dir.c > +++ b/fs/overlayfs/dir.c > @@ -147,14 +147,6 @@ static int ovl_dir_getattr(struct vfsmount *mnt, struct dentry *dentry, > stat->dev = dentry->d_sb->s_dev; > stat->ino = dentry->d_inode->i_ino; > > - /* > - * It's probably not worth it to count subdirs to get the > - * correct link count. nlink=1 seems to pacify 'find' and > - * other utilities. > - */ > - if (OVL_TYPE_MERGE(type)) > - stat->nlink = 1; > - > return 0; > } > > -- > 2.4.0.rc3.3.g6eb1401 > -- To unsubscribe from this list: send the line "unsubscribe linux-unionfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html