get_fuse_inode(inode)->i_time = 0;
 }
 
+/**
+ * Mark the attributes as stale due to an atime change.  Avoid the invalidate if
+ * atime is not used.
+ */
+void fuse_invalidate_atime(struct inode *inode)
+{
+       if (!IS_RDONLY(inode))
+               fuse_invalidate_attr(inode);
+}
+
 /*
  * Just mark the entry as stale, so that a next attempt to look it up
  * will result in a new lookup call to userspace
        }
 
        __free_page(page);
-       fuse_invalidate_attr(inode); /* atime changed */
+       fuse_invalidate_atime(inode);
        return err;
 }
 
                link[req->out.args[0].size] = '\0';
  out:
        fuse_put_request(fc, req);
-       fuse_invalidate_attr(inode); /* atime changed */
+       fuse_invalidate_atime(inode);
        return link;
 }
 
 
                SetPageUptodate(page);
        }
 
-       fuse_invalidate_attr(inode); /* atime changed */
+       fuse_invalidate_atime(inode);
  out:
        unlock_page(page);
        return err;
                        fuse_read_update_size(inode, pos,
                                              req->misc.read.attr_ver);
                }
-               fuse_invalidate_attr(inode); /* atime changed */
+               fuse_invalidate_atime(inode);
        }
 
        for (i = 0; i < req->num_pages; i++) {
 
 
 void fuse_invalidate_entry_cache(struct dentry *entry);
 
+void fuse_invalidate_atime(struct inode *inode);
+
 /**
  * Acquire reference to fuse_conn
  */