From: KOSAKI Motohiro Date: 2011-08-08T19:43:33+09:00 Subject: [ruby-core:38845] Re: [Ruby 1.9 - Bug #5135] Ruby 1.9.3-preview1 tests fails in Fedora Rawhide > $ rpm -q kernel > kernel-2.6.38.8-35.fc15.x86_64 > > I am running on BTRFS filesystem. > [pos=0, name=.] > [pos=2, name=..] > [pos=2, name=a] BTRFS *IS* buggy. ".." and "a" have the same offset. Sigh. Of course, POSIX and linux vfs require every dir entry have unique offset. The following function in btrfs is wrong. ----------------------------------------------------------------------------------- static int btrfs_real_readdir(struct file *filp, void *dirent, filldir_t filldir) { (snip) /* FIXME, use a real flag for deciding about the key type */ if (root->fs_info->tree_root == root) key_type = BTRFS_DIR_ITEM_KEY; /* special case for "." */ if (filp->f_pos == 0) { over = filldir(dirent, ".", 1, 1, btrfs_ino(inode), DT_DIR); if (over) return 0; filp->f_pos = 1; } /* special case for .., just use the back ref */ if (filp->f_pos == 1) { u64 pino = parent_ino(filp->f_path.dentry); over = filldir(dirent, "..", 2, 2, pino, DT_DIR); /// HERE if (over) return 0; filp->f_pos = 2; } -------------------------------------------------------------------------------- The correct parameter is over = filldir(dirent, "..", 2, 1, pino, DT_DIR); If doubt, please read procfs code. fs/proc/base.c ---------------------------------------------------------------------------------- static int proc_readfd_common(struct file * filp, void * dirent, filldir_t filldir, instantiate_t instantiate) { (snip) switch (fd) { case 0: if (filldir(dirent, ".", 1, 0, inode->i_ino, DT_DIR) < \ 0) goto out; filp->f_pos++; case 1: ino = parent_ino(dentry); if (filldir(dirent, "..", 2, 1, ino, DT_DIR) < 0) goto out; filp->f_pos++; ---------------------------------------------------------------------------------- Thus, I'd like to switch this discussion to LKML. I'll make a patch soon. See you again if you subscribe LKML. > Btw I have tried the build on Koji (official Fedora build system) and this two errors did not appeared there, but unfortunately there are others. > x86_64: http://koji.fedoraproject.org/koji/getfile?taskID=3257666&name=build.log > i686: http://koji.fedoraproject.org/koji/getfile?taskID=3257667&name=build.log > > Interestingly, there appear again the bug fixed by Nobu in http://redmine.ruby-lang.org/projects/ruby-19/repository/revisions/32848 I'm sure it's unrelated.