[lkml]   [2008]   [Apr]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Subject[LTP/VFS] fcntl SETLEASE fails on ramfs/tmpfs
    Hi folk,

    This days I am digging into this LTP bug reported on our Blackfin test
    machine, but I think it is general for other system.

    And I also found Kumar Gala reported this similar bug before.

    1, when opening and creating a new on ramfs/tmpfs, the dentry->d_count
    will be added one as below:
    ramfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
    |_______struct inode * inode = ramfs_get_inode(dir->i_sb, mode, dev);
    |_______int error = -ENOSPC;

    |_______if (inode) {
    |_______|_______if (dir->i_mode & S_ISGID) {
    |_______|_______|_______inode->i_gid = dir->i_gid;
    |_______|_______|_______if (S_ISDIR(mode))
    |_______|_______|_______|_______inode->i_mode |= S_ISGID;
    |_______|_______d_instantiate(dentry, inode);
    |_______|_______dget(dentry);|__/* Extra count - pin the dentry in core */
    |_______|_______error = 0;
    |_______|_______dir->i_mtime = dir->i_ctime = CURRENT_TIME;
    |_______return error;
    The dget(dentry) call introduces an extra count, why?
    it is the same in tmpfs.

    2, when calling fcntl(fd, F_SETLEASE,F_WRLCK), it will return -EAGAIN
    |_______if ((arg == F_WRLCK)
    |_______ && ((atomic_read(&dentry->d_count) > 1)
    |_______|_______|| (atomic_read(&inode->i_count) > 1)))
    |_______|_______goto out;

    because the dentry->d_count will be 2 not 1. I tested ext2 on Blackfin, it is 1.

    3, so I guess maybe the dget(dentry) of ramfs_mknod is useless. But
    after remove this dget(),
    the ramfs can not be mounted as rootfs at all.

    Is the bug in generic_setlease() or in the ramfs/tmpfs inode create function?

    Of course, simply remove the test '((atomic_read(&dentry->d_count) >
    1)' can workaround this issue.

    Best Regards,
    -Bryan Wu

     \ /
      Last update: 2008-04-29 05:45    [W:0.021 / U:10.564 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site