lkml.org 
[lkml]   [2010]   [Apr]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 06/35] whiteout: Set S_OPAQUE inode flag when creating directories
    Date
    From: Jan Blunck <jblunck@suse.de>

    In case of an union directory we don't want that the directories on lower
    layers of the union "show through". So to prevent that the contents of
    underlying directories magically shows up after a mkdir() we set the S_OPAQUE
    flag if directories are created where a whiteout existed before.

    Signed-off-by: Jan Blunck <jblunck@suse.de>
    Signed-off-by: Valerie Aurora <vaurora@redhat.com>
    ---
    fs/namei.c | 11 ++++++++++-
    include/linux/fs.h | 3 +++
    2 files changed, 13 insertions(+), 1 deletions(-)

    diff --git a/fs/namei.c b/fs/namei.c
    index 010927b..956083a 100644
    --- a/fs/namei.c
    +++ b/fs/namei.c
    @@ -2104,6 +2104,7 @@ SYSCALL_DEFINE3(mknod, const char __user *, filename, int, mode, unsigned, dev)
    int vfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
    {
    int error = may_create(dir, dentry);
    + int opaque = 0;

    if (error)
    return error;
    @@ -2116,9 +2117,17 @@ int vfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
    if (error)
    return error;

    + if (d_is_whiteout(dentry))
    + opaque = 1;
    +
    error = dir->i_op->mkdir(dir, dentry, mode);
    - if (!error)
    + if (!error) {
    fsnotify_mkdir(dir, dentry);
    + if (opaque) {
    + dentry->d_inode->i_flags |= S_OPAQUE;
    + mark_inode_dirty(dentry->d_inode);
    + }
    + }
    return error;
    }

    diff --git a/include/linux/fs.h b/include/linux/fs.h
    index 21102f9..a9f747c 100644
    --- a/include/linux/fs.h
    +++ b/include/linux/fs.h
    @@ -236,6 +236,7 @@ struct inodes_stat_t {
    #define S_NOCMTIME 128 /* Do not update file c/mtime */
    #define S_SWAPFILE 256 /* Do not truncate: swapon got its bmaps */
    #define S_PRIVATE 512 /* Inode is fs-internal */
    +#define S_OPAQUE 1024 /* Directory is opaque */

    /*
    * Note that nosuid etc flags are inode-specific: setting some file-system
    @@ -271,6 +272,8 @@ struct inodes_stat_t {
    #define IS_SWAPFILE(inode) ((inode)->i_flags & S_SWAPFILE)
    #define IS_PRIVATE(inode) ((inode)->i_flags & S_PRIVATE)

    +#define IS_OPAQUE(inode) ((inode)->i_flags & S_OPAQUE)
    +
    /* the read-only stuff doesn't really belong here, but any other place is
    probably as bad and I don't want to create yet another include file. */

    --
    1.6.3.3


    \
     
     \ /
      Last update: 2010-04-16 01:09    [W:4.471 / U:1.160 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site