Subject: Re: linux-next: manual merge of the vfs-scale tree with the v9fs tree

From: "Aneesh Kumar K. V" <[email-masked]>
Date: Tue, 11 Jan 2011 13:44:47 +0530

On Mon, 10 Jan 2011 15:49:37 -0600, Eric Van Hensbergen <[email-masked]> wrote:
> Hmm...
> 
> I've merged up our for-next patch series with Linus' tree which now
> has the vfs-scalability patches in it.
> Unfortunately, it seems something has been introduced which changes
> underlying assumptions in the v9fs code causing certain operations to
> fail with a segfault in the dentry code.  We are digging into now and
> will keep folks apprised of the situation.  Some quick checks have
> shown that the problem wasn't there in 2.6.37 but are in linus' tree
> as of today.  I'm in the process of bisecting further -- it may not be
> the fault of the concerns below, but I figured I should post and let
> folks know about the problem.
> 
> For what its worth, here's the failure we see:
> sh-2.05b# mount -t 9p 10.0.2.2 /mnt -o port=5670
> [   49.044605] mount used greatest stack depth: 4664 bytes left
> sh-2.05b# ls /mnt
> bin    dev         initrd.img.old  lost+found  n1   opt   selinux  usr
> boot   etc         lib             media       n2   proc  srv      var
> cdrom  home        lib32           mnt         nas  root  sys      vmlinuz
> csrv   initrd.img  lib64           n0          net  sbin  tmp      vmlinuz.old
> sh-2.05b# ls /mnt/tmp
> cscope.9130  error.txt  ns.ericvh.:1  orbit-gdm  pulse-PKdhtXMmr18n
> sh-2.05b# cd /mnt/tmp
> sh-2.05b# ls -l
> total 1
> drwx------    1 501      266594          0 Jan  7 14:54 cscope.9130
> -rw-r--r--    1 501      266594        806 Jan  7 15:03 error.txt
> drwx------    1 501      266594          0 Jan  6 21:19 ns.ericvh.:1
> drwx------    1 114      124             0 Jan  6 21:24 orbit-gdm
> drwx------    1 114      124             0 Jan  6 21:09 pulse-PKdhtXMmr18n
> sh-2.05b# mkdir test
> [   61.764123] ------------[ cut here ]------------
> [   61.765045] kernel BUG at /home/ericvh/src/linux/v9fs-devel/fs/dcache.c:1358!
> [   61.765045] invalid opcode: 0000 [#1] SMP
> [   61.765045] last sysfs file:
> [   61.765045] CPU 0
> [   61.765045] Pid: 853, comm: mkdir Not tainted 2.6.37+ #124 /Bochs
> [   61.765045] RIP: 0010:[<ffffffff8111dda8>]  [<ffffffff8111dda8>]
> d_set_d_op+0xb/0x58
> [   61.765045] RSP: 0000:ffff880016a0bdb8  EFLAGS: 00010282
> [   61.765045] RAX: ffff880016d43440 RBX: ffff880016d4a9c0 RCX: ffff880017b23880
> [   61.765045] RDX: 0000000000000000 RSI: ffffffff81636d40 RDI: ffff880016d4a9c0
> [   61.765045] RBP: ffff880016a0bdb8 R08: 0000000000004000 R09: ffff880016a0bcf8
> [   61.765045] R10: 0000000000000004 R11: ffff880017925d30 R12: ffff880016946d80
> [   61.765045] R13: ffff880016946de0 R14: 0000000000000000 R15: ffff880016a0c400
> [   61.765045] FS:  0000000000000000(0000) GS:ffff880017c00000(0000)
> knlGS:0000000000000000
> [   61.765045] CS:  0010 DS: 002b ES: 002b CR0: 000000008005003b
> [   61.765045] CR2: 00000000f76f23c0 CR3: 0000000016814000 CR4: 00000000000006f0
> [   61.765045] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> [   61.765045] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
> [   61.765045] Process mkdir (pid: 853, threadinfo ffff880016a0a000,
> task ffff88001695a490)
> [   61.765045] Stack:
> [   61.765045]  ffff880016a0be28 ffffffff812071bc ffff880016d43440
> 800001ed00000000
> [   61.765045]  0000000000000000 ffff880016d42fc0 0000000000000000
> ffff880016d4a9f8
> [   61.765045]  0000000000000000 ffff880016d42fc0 ffff880016d4a9c0
> ffff880016a0c400
> [   61.765045] Call Trace:
> [   61.765045]  [<ffffffff812071bc>] v9fs_create+0x21e/0x273
> [   61.765045]  [<ffffffff812075a5>] v9fs_vfs_mkdir+0x77/0x9a
> [   61.765045]  [<ffffffff81117b68>] vfs_mkdir+0x5a/0x96
> [   61.765045]  [<ffffffff81119c7c>] sys_mkdirat+0x91/0xe2
> [   61.765045]  [<ffffffff81119ce0>] sys_mkdir+0x13/0x15
> [   61.765045]  [<ffffffff810599b3>] ia32_sysret+0x0/0x5
> [   61.765045] Code: cc 39 53 20 0f 84 4a ff ff ff eb e5 31 db 48 83
> c4 48 48 89 d8 5b 41 5c 41 5d 41 5e 41 5f c9 c3 48 83 7f 60 00 55 48
> 89 e5 74 04 <0f> 0b eb fe 66 f7 07 00 f0 74 04 0f 0b eb fe 48 85 f6 48
> 89 77
> [   61.765045] RIP  [<ffffffff8111dda8>] d_set_d_op+0xb/0x58
> [   61.765045]  RSP <ffff880016a0bdb8>
> [   61.802265] ---[ end trace af62980550ad7d9c ]---
> Segmentation fault
> 
> 

This should fix

commit 69da74b14b1e6f9a69e02fada08a1df932907d65
Author: Aneesh Kumar K.V <[email-masked]>
Date:   Tue Jan 11 13:42:28 2011 +0530

    fs/9p: Don't set dentry->d_op in create routines
    
    We do set dentry->d_op in lookup even in case of EOENT entries.
    That implies we should have dentry->d_op already set when
    create/mkdir/mknod/link/symlink routines are called
    
    Signed-off-by: Aneesh Kumar K.V <[email-masked]>

diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c
index 3923586..5076eeb 100644
--- a/fs/9p/vfs_inode.c
+++ b/fs/9p/vfs_inode.c
@@ -537,12 +537,6 @@ v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir,
 		P9_DPRINTK(P9_DEBUG_VFS, "inode creation failed %d\n", err);
 		goto error;
 	}
-
-	if (v9ses->cache)
-		d_set_d_op(dentry, &v9fs_cached_dentry_operations);
-	else
-		d_set_d_op(dentry, &v9fs_dentry_operations);
-
 	d_instantiate(dentry, inode);
 	err = v9fs_fid_add(dentry, fid);
 	if (err < 0)
diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c
index b7f8dcb..8cb1eb8 100644
--- a/fs/9p/vfs_inode_dotl.c
+++ b/fs/9p/vfs_inode_dotl.c
@@ -211,11 +211,6 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, int omode,
 		P9_DPRINTK(P9_DEBUG_VFS, "inode creation failed %d\n", err);
 		goto error;
 	}
-	if (v9ses->cache)
-		dentry->d_op = &v9fs_cached_dentry_operations;
-	else
-		dentry->d_op = &v9fs_dentry_operations;
-
 	d_instantiate(dentry, inode);
 	err = v9fs_fid_add(dentry, fid);
 	if (err < 0)
@@ -312,7 +307,6 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir,
 				err);
 			goto error;
 		}
-		d_set_d_op(dentry, &v9fs_cached_dentry_operations);
 		d_instantiate(dentry, inode);
 		err = v9fs_fid_add(dentry, fid);
 		if (err < 0)
@@ -329,7 +323,6 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir,
 			err = PTR_ERR(inode);
 			goto error;
 		}
-		d_set_d_op(dentry, &v9fs_dentry_operations);
 		d_instantiate(dentry, inode);
 	}
 	/* Now set the ACL based on the default value */
@@ -560,7 +553,6 @@ v9fs_vfs_symlink_dotl(struct inode *dir, struct dentry *dentry,
 					err);
 			goto error;
 		}
-		d_set_d_op(dentry, &v9fs_cached_dentry_operations);
 		d_instantiate(dentry, inode);
 		err = v9fs_fid_add(dentry, fid);
 		if (err < 0)
@@ -573,7 +565,6 @@ v9fs_vfs_symlink_dotl(struct inode *dir, struct dentry *dentry,
 			err = PTR_ERR(inode);
 			goto error;
 		}
-		d_set_d_op(dentry, &v9fs_dentry_operations);
 		d_instantiate(dentry, inode);
 	}
 
@@ -648,8 +639,6 @@ v9fs_vfs_link_dotl(struct dentry *old_dentry, struct inode *dir,
 		 */
 		ihold(old_dentry->d_inode);
 	}
-
-	d_set_d_op(dentry, old_dentry->d_op);
 	d_instantiate(dentry, old_dentry->d_inode);
 
 	return err;
@@ -728,7 +717,6 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, int omode,
 				err);
 			goto error;
 		}
-		d_set_d_op(dentry, &v9fs_cached_dentry_operations);
 		d_instantiate(dentry, inode);
 		err = v9fs_fid_add(dentry, fid);
 		if (err < 0)
@@ -744,7 +732,6 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, int omode,
 			err = PTR_ERR(inode);
 			goto error;
 		}
-		d_set_d_op(dentry, &v9fs_dentry_operations);
 		d_instantiate(dentry, inode);
 	}
 	/* Now set the ACL based on the default value */