Hi again,

I've just fixed the issue here. The cause was that the inode passed to
unionfs_lower_inode() was no longer valid, so it had nothing to do
with UnionFS code itself. Thanks for your attention anyways.

Lucas


On 3/10/08, Lucas C. Villa Real <[EMAIL PROTECTED]> wrote:
> Hi Erez,
>
>  I've just tested this with UnionFS 2.2.4 in 2.6.24.3, and the problem
>  still persists. Do you have any pointers on this question?
>
>  Thanks,
>
> Lucas
>
>
>
>  ---------- Forwarded message ----------
>  From: Lucas C. Villa Real <[EMAIL PROTECTED]>
>  Date: Fri, Feb 22, 2008 at 12:53 AM
>  Subject: unionfs_lower_dentry returns NULL
>  To: [EMAIL PROTECTED]
>
>
>  Hello guys,
>
>   I'm debugging a problem that appeared after an upgrade from UnionFS
>   2.1.9 applied in a Linux 2.6.23.8 kernel to UnionFS 2.2.3 in a 2.6.24
>   one. We at GoboLinux have a complement to the kernel named GoboHide,
>   which allows one to hide dentries from userspace applications. The
>   interface basically works through ioctls, where the dentry's inode
>   number and the superblock which describes the mount point from a given
>   path are stored in a list, which is later consulted at filldir, rmdir
>   and unlink operations in the VFS. The inode number is taken right from
>   userspace based on the information stored in the st_ino member in
>   struct stat.
>
>   Normal filesystems (ext2, reiserfs, jffs2, etc) doesn't require any
>   special treatment: the inode numbers got from fstat() will match with
>   the ones stored in their struct inode, and the comparison with the
>   numbers stored in the gobohide list are straight forward. UnionFS,
>   however, seems to store that in a different way -- the numbers read in
>   fstat().st_ino are actually found in the UnionFS lower_dentry array.
>
>   So far, the following code was being used to translate an inode number
>   in GoboHide:
>
>   ino_t gobolinux_translate_inode_nr(struct inode *inode)
>   {
>    ino_t ino = inode->i_ino;
>   #ifdef CONFIG_UNION_FS
>    if (inode->i_sb->s_op == &unionfs_sops) {
>            /* we must take the inode number from the underlying filesystem */
>            struct inode *lower_inode = unionfs_lower_inode(inode);
>            ino = lower_inode->i_ino;
>    }
>   #endif
>    return ino;
>   }
>
>   Since the switch to UnionFS 2.2.3, however, unionfs_lower_inode()
>   returns NULL in some situations (vfs_rmdir). Since I'm not closed to
>   UnionFS development, I'm not sure if this NULL pointer is coming from
>   a bug or from a feature, so I'd really appreciate any pointers or
>   suggestions in how to better handle with this situation.
>
>   I'm attaching the GoboHide patch, just in case you want to test and
>   reproduce the bug there. You'll also need a small userspace tool which
>   can be downloaded from here:
>   http://gobolinux.org/download/gobohide/GoboHide-0.13.tar.bz2
>
>   The steps to reproduce are pretty simple:
>   $ mount -t unionfs -o dirs=/some/dir=rw:/another/dir=ro none /mnt/unionfs
>   $ cd /mnt/unionfs
>   $ cp -a /path/to/some_directory .
>   $ gobohide -h some_directory
>   $ gobohide -l
>   $ rm -rf some_directory
>
>   At this point you should get an oops coming from the unexpected NULL
>   pointer received from unionfs_lower_dentry (tested with a populated
>   directory, but this shouldn't make a difference). The expected
>   behavior would be to have some_directory removed from the filesystem
>   tree and from the gobohide list (gobohide -l should not list it
>   afterwards).
>
>   Many thanks in advance, and once again thanks for your work on UnionFS!
>
>   --
>   Lucas
>   powered by /dev/dsp
>
>
_______________________________________________
unionfs mailing list: http://unionfs.filesystems.org/
unionfs@mail.fsl.cs.sunysb.edu
http://www.fsl.cs.sunysb.edu/mailman/listinfo/unionfs

Reply via email to