perf top: Add overwrite fall back
[linux-2.6-microblaze.git] / fs / inode.c
index 03102d6..ef36236 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/buffer_head.h> /* for inode_has_buffers */
 #include <linux/ratelimit.h>
 #include <linux/list_lru.h>
+#include <linux/iversion.h>
 #include <trace/events/writeback.h>
 #include "internal.h"
 
@@ -497,7 +498,6 @@ EXPORT_SYMBOL(__remove_inode_hash);
 
 void clear_inode(struct inode *inode)
 {
-       might_sleep();
        /*
         * We have to cycle tree_lock here because reclaim can be still in the
         * process of removing the last page (in __delete_from_page_cache())
@@ -1634,17 +1634,21 @@ static int relatime_need_update(const struct path *path, struct inode *inode,
 int generic_update_time(struct inode *inode, struct timespec *time, int flags)
 {
        int iflags = I_DIRTY_TIME;
+       bool dirty = false;
 
        if (flags & S_ATIME)
                inode->i_atime = *time;
        if (flags & S_VERSION)
-               inode_inc_iversion(inode);
+               dirty = inode_maybe_inc_iversion(inode, false);
        if (flags & S_CTIME)
                inode->i_ctime = *time;
        if (flags & S_MTIME)
                inode->i_mtime = *time;
+       if ((flags & (S_ATIME | S_CTIME | S_MTIME)) &&
+           !(inode->i_sb->s_flags & SB_LAZYTIME))
+               dirty = true;
 
-       if (!(inode->i_sb->s_flags & SB_LAZYTIME) || (flags & S_VERSION))
+       if (dirty)
                iflags |= I_DIRTY_SYNC;
        __mark_inode_dirty(inode, iflags);
        return 0;
@@ -1863,7 +1867,7 @@ int file_update_time(struct file *file)
        if (!timespec_equal(&inode->i_ctime, &now))
                sync_it |= S_CTIME;
 
-       if (IS_I_VERSION(inode))
+       if (IS_I_VERSION(inode) && inode_iversion_need_inc(inode))
                sync_it |= S_VERSION;
 
        if (!sync_it)