OSDN Git Service

Merge tag 'v6.6-vfs.ctime' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[tomoyo/tomoyo-test1.git] / fs / btrfs / inode.c
index aa090b0..4e987fe 100644 (file)
@@ -3917,8 +3917,8 @@ static int btrfs_read_locked_inode(struct inode *inode,
        inode->i_mtime.tv_sec = btrfs_timespec_sec(leaf, &inode_item->mtime);
        inode->i_mtime.tv_nsec = btrfs_timespec_nsec(leaf, &inode_item->mtime);
 
-       inode->i_ctime.tv_sec = btrfs_timespec_sec(leaf, &inode_item->ctime);
-       inode->i_ctime.tv_nsec = btrfs_timespec_nsec(leaf, &inode_item->ctime);
+       inode_set_ctime(inode, btrfs_timespec_sec(leaf, &inode_item->ctime),
+                       btrfs_timespec_nsec(leaf, &inode_item->ctime));
 
        BTRFS_I(inode)->i_otime.tv_sec =
                btrfs_timespec_sec(leaf, &inode_item->otime);
@@ -4089,9 +4089,9 @@ static void fill_inode_item(struct btrfs_trans_handle *trans,
                                      inode->i_mtime.tv_nsec);
 
        btrfs_set_token_timespec_sec(&token, &item->ctime,
-                                    inode->i_ctime.tv_sec);
+                                    inode_get_ctime(inode).tv_sec);
        btrfs_set_token_timespec_nsec(&token, &item->ctime,
-                                     inode->i_ctime.tv_nsec);
+                                     inode_get_ctime(inode).tv_nsec);
 
        btrfs_set_token_timespec_sec(&token, &item->otime,
                                     BTRFS_I(inode)->i_otime.tv_sec);
@@ -4289,9 +4289,8 @@ err:
        btrfs_i_size_write(dir, dir->vfs_inode.i_size - name->len * 2);
        inode_inc_iversion(&inode->vfs_inode);
        inode_inc_iversion(&dir->vfs_inode);
-       inode->vfs_inode.i_ctime = current_time(&inode->vfs_inode);
-       dir->vfs_inode.i_mtime = inode->vfs_inode.i_ctime;
-       dir->vfs_inode.i_ctime = inode->vfs_inode.i_ctime;
+       inode_set_ctime_current(&inode->vfs_inode);
+       dir->vfs_inode.i_mtime = inode_set_ctime_current(&dir->vfs_inode);
        ret = btrfs_update_inode(trans, root, dir);
 out:
        return ret;
@@ -4464,8 +4463,7 @@ static int btrfs_unlink_subvol(struct btrfs_trans_handle *trans,
 
        btrfs_i_size_write(dir, dir->vfs_inode.i_size - fname.disk_name.len * 2);
        inode_inc_iversion(&dir->vfs_inode);
-       dir->vfs_inode.i_mtime = current_time(&dir->vfs_inode);
-       dir->vfs_inode.i_ctime = dir->vfs_inode.i_mtime;
+       dir->vfs_inode.i_mtime = inode_set_ctime_current(&dir->vfs_inode);
        ret = btrfs_update_inode_fallback(trans, root, dir);
        if (ret)
                btrfs_abort_transaction(trans, ret);
@@ -5115,8 +5113,7 @@ static int btrfs_setsize(struct inode *inode, struct iattr *attr)
        if (newsize != oldsize) {
                inode_inc_iversion(inode);
                if (!(mask & (ATTR_CTIME | ATTR_MTIME))) {
-                       inode->i_mtime = current_time(inode);
-                       inode->i_ctime = inode->i_mtime;
+                       inode->i_mtime = inode_set_ctime_current(inode);
                }
        }
 
@@ -5760,9 +5757,8 @@ static struct inode *new_simple_dir(struct super_block *s,
        inode->i_opflags &= ~IOP_XATTR;
        inode->i_fop = &simple_dir_operations;
        inode->i_mode = S_IFDIR | S_IRUGO | S_IWUSR | S_IXUGO;
-       inode->i_mtime = current_time(inode);
+       inode->i_mtime = inode_set_ctime_current(inode);
        inode->i_atime = inode->i_mtime;
-       inode->i_ctime = inode->i_mtime;
        BTRFS_I(inode)->i_otime = inode->i_mtime;
 
        return inode;
@@ -6165,8 +6161,7 @@ static int btrfs_dirty_inode(struct btrfs_inode *inode)
  * This is a copy of file_update_time.  We need this so we can return error on
  * ENOSPC for updating the inode in the case of file write and mmap writes.
  */
-static int btrfs_update_time(struct inode *inode, struct timespec64 *now,
-                            int flags)
+static int btrfs_update_time(struct inode *inode, int flags)
 {
        struct btrfs_root *root = BTRFS_I(inode)->root;
        bool dirty = flags & ~S_VERSION;
@@ -6174,14 +6169,7 @@ static int btrfs_update_time(struct inode *inode, struct timespec64 *now,
        if (btrfs_root_readonly(root))
                return -EROFS;
 
-       if (flags & S_VERSION)
-               dirty |= inode_maybe_inc_iversion(inode, dirty);
-       if (flags & S_CTIME)
-               inode->i_ctime = *now;
-       if (flags & S_MTIME)
-               inode->i_mtime = *now;
-       if (flags & S_ATIME)
-               inode->i_atime = *now;
+       dirty = inode_update_timestamps(inode, flags);
        return dirty ? btrfs_dirty_inode(BTRFS_I(inode)) : 0;
 }
 
@@ -6429,9 +6417,8 @@ int btrfs_create_new_inode(struct btrfs_trans_handle *trans,
                goto discard;
        }
 
-       inode->i_mtime = current_time(inode);
+       inode->i_mtime = inode_set_ctime_current(inode);
        inode->i_atime = inode->i_mtime;
-       inode->i_ctime = inode->i_mtime;
        BTRFS_I(inode)->i_otime = inode->i_mtime;
 
        /*
@@ -6596,12 +6583,10 @@ int btrfs_add_link(struct btrfs_trans_handle *trans,
         * log replay procedure is responsible for setting them to their correct
         * values (the ones it had when the fsync was done).
         */
-       if (!test_bit(BTRFS_FS_LOG_RECOVERING, &root->fs_info->flags)) {
-               struct timespec64 now = current_time(&parent_inode->vfs_inode);
+       if (!test_bit(BTRFS_FS_LOG_RECOVERING, &root->fs_info->flags))
+               parent_inode->vfs_inode.i_mtime =
+                       inode_set_ctime_current(&parent_inode->vfs_inode);
 
-               parent_inode->vfs_inode.i_mtime = now;
-               parent_inode->vfs_inode.i_ctime = now;
-       }
        ret = btrfs_update_inode(trans, root, parent_inode);
        if (ret)
                btrfs_abort_transaction(trans, ret);
@@ -6741,7 +6726,7 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir,
        BTRFS_I(inode)->dir_index = 0ULL;
        inc_nlink(inode);
        inode_inc_iversion(inode);
-       inode->i_ctime = current_time(inode);
+       inode_set_ctime_current(inode);
        ihold(inode);
        set_bit(BTRFS_INODE_COPY_EVERYTHING, &BTRFS_I(inode)->runtime_flags);
 
@@ -8807,7 +8792,7 @@ static int btrfs_getattr(struct mnt_idmap *idmap,
                                  STATX_ATTR_IMMUTABLE |
                                  STATX_ATTR_NODUMP);
 
-       generic_fillattr(idmap, inode, stat);
+       generic_fillattr(idmap, request_mask, inode, stat);
        stat->dev = BTRFS_I(inode)->root->anon_dev;
 
        spin_lock(&BTRFS_I(inode)->lock);
@@ -8831,7 +8816,6 @@ static int btrfs_rename_exchange(struct inode *old_dir,
        struct btrfs_root *dest = BTRFS_I(new_dir)->root;
        struct inode *new_inode = new_dentry->d_inode;
        struct inode *old_inode = old_dentry->d_inode;
-       struct timespec64 ctime = current_time(old_inode);
        struct btrfs_rename_ctx old_rename_ctx;
        struct btrfs_rename_ctx new_rename_ctx;
        u64 old_ino = btrfs_ino(BTRFS_I(old_inode));
@@ -8962,12 +8946,7 @@ static int btrfs_rename_exchange(struct inode *old_dir,
        inode_inc_iversion(new_dir);
        inode_inc_iversion(old_inode);
        inode_inc_iversion(new_inode);
-       old_dir->i_mtime = ctime;
-       old_dir->i_ctime = ctime;
-       new_dir->i_mtime = ctime;
-       new_dir->i_ctime = ctime;
-       old_inode->i_ctime = ctime;
-       new_inode->i_ctime = ctime;
+       simple_rename_timestamp(old_dir, old_dentry, new_dir, new_dentry);
 
        if (old_dentry->d_parent != new_dentry->d_parent) {
                btrfs_record_unlink_dir(trans, BTRFS_I(old_dir),
@@ -9231,11 +9210,7 @@ static int btrfs_rename(struct mnt_idmap *idmap,
        inode_inc_iversion(old_dir);
        inode_inc_iversion(new_dir);
        inode_inc_iversion(old_inode);
-       old_dir->i_mtime = current_time(old_dir);
-       old_dir->i_ctime = old_dir->i_mtime;
-       new_dir->i_mtime = old_dir->i_mtime;
-       new_dir->i_ctime = old_dir->i_mtime;
-       old_inode->i_ctime = old_dir->i_mtime;
+       simple_rename_timestamp(old_dir, old_dentry, new_dir, new_dentry);
 
        if (old_dentry->d_parent != new_dentry->d_parent)
                btrfs_record_unlink_dir(trans, BTRFS_I(old_dir),
@@ -9257,7 +9232,6 @@ static int btrfs_rename(struct mnt_idmap *idmap,
 
        if (new_inode) {
                inode_inc_iversion(new_inode);
-               new_inode->i_ctime = current_time(new_inode);
                if (unlikely(btrfs_ino(BTRFS_I(new_inode)) ==
                             BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) {
                        ret = btrfs_unlink_subvol(trans, BTRFS_I(new_dir), new_dentry);
@@ -9797,7 +9771,7 @@ next:
                *alloc_hint = ins.objectid + ins.offset;
 
                inode_inc_iversion(inode);
-               inode->i_ctime = current_time(inode);
+               inode_set_ctime_current(inode);
                BTRFS_I(inode)->flags |= BTRFS_INODE_PREALLOC;
                if (!(mode & FALLOC_FL_KEEP_SIZE) &&
                    (actual_len > inode->i_size) &&