lkml.org 
[lkml]   [2010]   [Dec]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[082/127] fuse: fix attributes after open(O_TRUNC)
    2.6.32-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Ken Sumrall <ksumrall@android.com>

    commit a0822c55779d9319939eac69f00bb729ea9d23da upstream.

    The attribute cache for a file was not being cleared when a file is opened
    with O_TRUNC.

    If the filesystem's open operation truncates the file ("atomic_o_trunc"
    feature flag is set) then the kernel should invalidate the cached st_mtime
    and st_ctime attributes.

    Also i_size should be explicitly be set to zero as it is used sometimes
    without refreshing the cache.

    Signed-off-by: Ken Sumrall <ksumrall@android.com>
    Cc: Anfei <anfei.zhou@gmail.com>
    Cc: "Anand V. Avati" <avati@gluster.com>
    Signed-off-by: Miklos Szeredi <miklos@szeredi.hu>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    fs/fuse/file.c | 10 ++++++++++
    1 file changed, 10 insertions(+)

    --- a/fs/fuse/file.c
    +++ b/fs/fuse/file.c
    @@ -134,6 +134,7 @@ EXPORT_SYMBOL_GPL(fuse_do_open);
    void fuse_finish_open(struct inode *inode, struct file *file)
    {
    struct fuse_file *ff = file->private_data;
    + struct fuse_conn *fc = get_fuse_conn(inode);

    if (ff->open_flags & FOPEN_DIRECT_IO)
    file->f_op = &fuse_direct_io_file_operations;
    @@ -141,6 +142,15 @@ void fuse_finish_open(struct inode *inod
    invalidate_inode_pages2(inode->i_mapping);
    if (ff->open_flags & FOPEN_NONSEEKABLE)
    nonseekable_open(inode, file);
    + if (fc->atomic_o_trunc && (file->f_flags & O_TRUNC)) {
    + struct fuse_inode *fi = get_fuse_inode(inode);
    +
    + spin_lock(&fc->lock);
    + fi->attr_version = ++fc->attr_version;
    + i_size_write(inode, 0);
    + spin_unlock(&fc->lock);
    + fuse_invalidate_attr(inode);
    + }
    }

    int fuse_open_common(struct inode *inode, struct file *file, bool isdir)



    \
     
     \ /
      Last update: 2010-12-08 01:59    [W:0.020 / U:149.848 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site