Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[cascardo/linux.git] / fs / inode.c
index 7d03759..88110fd 100644 (file)
@@ -1686,7 +1686,7 @@ bool __atime_needs_update(const struct path *path, struct inode *inode,
        if ((mnt->mnt_flags & MNT_NODIRATIME) && S_ISDIR(inode->i_mode))
                return false;
 
-       now = current_fs_time(inode->i_sb);
+       now = current_time(inode);
 
        if (!relatime_need_update(path, inode, now, rcu))
                return false;
@@ -1720,7 +1720,7 @@ void touch_atime(const struct path *path)
         * We may also fail on filesystems that have the ability to make parts
         * of the fs read only, e.g. subvolumes in Btrfs.
         */
-       now = current_fs_time(inode->i_sb);
+       now = current_time(inode);
        update_time(inode, &now, S_ATIME);
        __mnt_drop_write(mnt);
 skip_update:
@@ -1843,7 +1843,7 @@ int file_update_time(struct file *file)
        if (IS_NOCMTIME(inode))
                return 0;
 
-       now = current_fs_time(inode->i_sb);
+       now = current_time(inode);
        if (!timespec_equal(&inode->i_mtime, &now))
                sync_it = S_MTIME;
 
@@ -2099,3 +2099,26 @@ void inode_nohighmem(struct inode *inode)
        mapping_set_gfp_mask(inode->i_mapping, GFP_USER);
 }
 EXPORT_SYMBOL(inode_nohighmem);
+
+/**
+ * current_time - Return FS time
+ * @inode: inode.
+ *
+ * Return the current time truncated to the time granularity supported by
+ * the fs.
+ *
+ * Note that inode and inode->sb cannot be NULL.
+ * Otherwise, the function warns and returns time without truncation.
+ */
+struct timespec current_time(struct inode *inode)
+{
+       struct timespec now = current_kernel_time();
+
+       if (unlikely(!inode->i_sb)) {
+               WARN(1, "current_time() called with uninitialized super_block in the inode");
+               return now;
+       }
+
+       return timespec_trunc(now, inode->i_sb->s_time_gran);
+}
+EXPORT_SYMBOL(current_time);