lkml.org 
[lkml]   [2006]   [Jun]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 15/20] elevate write count for do_sys_utime() and touch_atime()
    From
    Date


    Signed-off-by: Dave Hansen <haveblue@us.ibm.com>
    ---

    lxc-dave/fs/inode.c | 9 +++++++--
    lxc-dave/fs/open.c | 16 +++++++++++-----
    2 files changed, 18 insertions(+), 7 deletions(-)

    diff -puN fs/inode.c~C-elevate-writers-opens-part2-do_sys_utime fs/inode.c
    --- lxc/fs/inode.c~C-elevate-writers-opens-part2-do_sys_utime 2006-06-27 10:40:33.000000000 -0700
    +++ lxc-dave/fs/inode.c 2006-06-27 10:40:33.000000000 -0700
    @@ -1187,10 +1187,13 @@ void touch_atime(struct vfsmount *mnt, s
    if (IS_RDONLY(inode))
    return;

    + if (!mnt_want_write(mnt))
    + return;
    +
    if ((inode->i_flags & S_NOATIME) ||
    (inode->i_sb->s_flags & MS_NOATIME) ||
    ((inode->i_sb->s_flags & MS_NODIRATIME) && S_ISDIR(inode->i_mode)))
    - return;
    + goto out;

    /*
    * We may have a NULL vfsmount when coming from NFSD
    @@ -1198,13 +1201,15 @@ void touch_atime(struct vfsmount *mnt, s
    if (mnt &&
    ((mnt->mnt_flags & MNT_NOATIME) ||
    ((mnt->mnt_flags & MNT_NODIRATIME) && S_ISDIR(inode->i_mode))))
    - return;
    + goto out;

    now = current_fs_time(inode->i_sb);
    if (!timespec_equal(&inode->i_atime, &now)) {
    inode->i_atime = now;
    mark_inode_dirty_sync(inode);
    }
    +out:
    + mnt_drop_write(mnt);
    }

    EXPORT_SYMBOL(touch_atime);
    diff -puN fs/open.c~C-elevate-writers-opens-part2-do_sys_utime fs/open.c
    --- lxc/fs/open.c~C-elevate-writers-opens-part2-do_sys_utime 2006-06-27 10:40:33.000000000 -0700
    +++ lxc-dave/fs/open.c 2006-06-27 10:40:33.000000000 -0700
    @@ -384,16 +384,20 @@ asmlinkage long sys_utime(char __user *
    goto out;
    inode = nd.dentry->d_inode;

    + error = mnt_want_write(nd.mnt);
    + if (error)
    + goto dput_and_out;
    +
    error = -EROFS;
    if (IS_RDONLY(inode))
    - goto dput_and_out;
    + goto mnt_drop_write_and_out;

    /* Don't worry, the checks are done in inode_change_ok() */
    newattrs.ia_valid = ATTR_CTIME | ATTR_MTIME | ATTR_ATIME;
    if (times) {
    error = -EPERM;
    if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
    - goto dput_and_out;
    + goto mnt_drop_write_and_out;

    error = get_user(newattrs.ia_atime.tv_sec, &times->actime);
    newattrs.ia_atime.tv_nsec = 0;
    @@ -401,21 +405,23 @@ asmlinkage long sys_utime(char __user *
    error = get_user(newattrs.ia_mtime.tv_sec, &times->modtime);
    newattrs.ia_mtime.tv_nsec = 0;
    if (error)
    - goto dput_and_out;
    + goto mnt_drop_write_and_out;

    newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
    } else {
    error = -EACCES;
    if (IS_IMMUTABLE(inode))
    - goto dput_and_out;
    + goto mnt_drop_write_and_out;

    if (current->fsuid != inode->i_uid &&
    (error = vfs_permission(&nd, MAY_WRITE)) != 0)
    - goto dput_and_out;
    + goto mnt_drop_write_and_out;
    }
    mutex_lock(&inode->i_mutex);
    error = notify_change(nd.dentry, &newattrs);
    mutex_unlock(&inode->i_mutex);
    +mnt_drop_write_and_out:
    + mnt_drop_write(nd.mnt);
    dput_and_out:
    path_release(&nd);
    out:
    _
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2006-06-28 00:20    [W:4.532 / U:0.432 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site