NFS: Convert nfs_attr_generation_counter into an atomic_long
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Tue, 28 Oct 2008 19:21:40 +0000 (15:21 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Tue, 28 Oct 2008 19:21:40 +0000 (15:21 -0400)
The most important property we need from nfs_attr_generation_counter is
monotonicity, which is not guaranteed by the current system of smp memory
barriers. We should convert it to an atomic_long_t, and drop the memory
barriers.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/inode.c

index dc52793ff8f8a06ddf1d89d62d7bb44fb9eee740..d22eb383e1cf80bb8234207e2a681391af802045 100644 (file)
@@ -908,21 +908,16 @@ static int nfs_size_need_update(const struct inode *inode, const struct nfs_fatt
        return nfs_size_to_loff_t(fattr->size) > i_size_read(inode);
 }
 
-static unsigned long nfs_attr_generation_counter;
+static atomic_long_t nfs_attr_generation_counter;
 
 static unsigned long nfs_read_attr_generation_counter(void)
 {
-       smp_rmb();
-       return nfs_attr_generation_counter;
+       return atomic_long_read(&nfs_attr_generation_counter);
 }
 
 unsigned long nfs_inc_attr_generation_counter(void)
 {
-       unsigned long ret;
-       smp_rmb();
-       ret = ++nfs_attr_generation_counter;
-       smp_wmb();
-       return ret;
+       return atomic_long_inc_return(&nfs_attr_generation_counter);
 }
 
 void nfs_fattr_init(struct nfs_fattr *fattr)