lkml.org 
[lkml]   [2011]   [Apr]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] [89/106] NFS: nfs_wcc_update_inode() should set nfsi->attr_gencount
    Date
    2.6.35-longterm review patch.  If anyone has any objections, please let me know.

    ------------------
    From: Trond Myklebust <Trond.Myklebust@netapp.com>

    commit 27dc1cd3ad9300f81e1219e5fc305d91d85353f8 upstream.

    If the call to nfs_wcc_update_inode() results in an attribute update, we
    need to ensure that the inode's attr_gencount gets bumped too, otherwise
    we are not protected against races with other GETATTR calls.

    Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
    Signed-off-by: Andi Kleen <ak@linux.intel.com>

    ---
    fs/nfs/inode.c | 26 +++++++++++++++++---------
    1 file changed, 17 insertions(+), 9 deletions(-)

    Index: linux-2.6.35.y/fs/nfs/inode.c
    ===================================================================
    --- linux-2.6.35.y.orig/fs/nfs/inode.c
    +++ linux-2.6.35.y/fs/nfs/inode.c
    @@ -811,9 +811,10 @@ out:
    return ret;
    }

    -static void nfs_wcc_update_inode(struct inode *inode, struct nfs_fattr *fattr)
    +static unsigned long nfs_wcc_update_inode(struct inode *inode, struct nfs_fattr *fattr)
    {
    struct nfs_inode *nfsi = NFS_I(inode);
    + unsigned long ret = 0;

    if ((fattr->valid & NFS_ATTR_FATTR_PRECHANGE)
    && (fattr->valid & NFS_ATTR_FATTR_CHANGE)
    @@ -821,25 +822,32 @@ static void nfs_wcc_update_inode(struct
    nfsi->change_attr = fattr->change_attr;
    if (S_ISDIR(inode->i_mode))
    nfsi->cache_validity |= NFS_INO_INVALID_DATA;
    + ret |= NFS_INO_INVALID_ATTR;
    }
    /* If we have atomic WCC data, we may update some attributes */
    if ((fattr->valid & NFS_ATTR_FATTR_PRECTIME)
    && (fattr->valid & NFS_ATTR_FATTR_CTIME)
    - && timespec_equal(&inode->i_ctime, &fattr->pre_ctime))
    - memcpy(&inode->i_ctime, &fattr->ctime, sizeof(inode->i_ctime));
    + && timespec_equal(&inode->i_ctime, &fattr->pre_ctime)) {
    + memcpy(&inode->i_ctime, &fattr->ctime, sizeof(inode->i_ctime));
    + ret |= NFS_INO_INVALID_ATTR;
    + }

    if ((fattr->valid & NFS_ATTR_FATTR_PREMTIME)
    && (fattr->valid & NFS_ATTR_FATTR_MTIME)
    && timespec_equal(&inode->i_mtime, &fattr->pre_mtime)) {
    - memcpy(&inode->i_mtime, &fattr->mtime, sizeof(inode->i_mtime));
    - if (S_ISDIR(inode->i_mode))
    - nfsi->cache_validity |= NFS_INO_INVALID_DATA;
    + memcpy(&inode->i_mtime, &fattr->mtime, sizeof(inode->i_mtime));
    + if (S_ISDIR(inode->i_mode))
    + nfsi->cache_validity |= NFS_INO_INVALID_DATA;
    + ret |= NFS_INO_INVALID_ATTR;
    }
    if ((fattr->valid & NFS_ATTR_FATTR_PRESIZE)
    && (fattr->valid & NFS_ATTR_FATTR_SIZE)
    && i_size_read(inode) == nfs_size_to_loff_t(fattr->pre_size)
    - && nfsi->npages == 0)
    - i_size_write(inode, nfs_size_to_loff_t(fattr->size));
    + && nfsi->npages == 0) {
    + i_size_write(inode, nfs_size_to_loff_t(fattr->size));
    + ret |= NFS_INO_INVALID_ATTR;
    + }
    + return ret;
    }

    /**
    @@ -1153,7 +1161,7 @@ static int nfs_update_inode(struct inode
    | NFS_INO_REVAL_PAGECACHE);

    /* Do atomic weak cache consistency updates */
    - nfs_wcc_update_inode(inode, fattr);
    + invalid |= nfs_wcc_update_inode(inode, fattr);

    /* More cache consistency checks */
    if (fattr->valid & NFS_ATTR_FATTR_CHANGE) {

    \
     
     \ /
      Last update: 2011-04-26 23:23    [W:0.021 / U:0.616 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site