v6.6-vfs.ctime
-----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQRAhzRXHqcMeLMyaSiRxhvAZXjcogUCZOXTKAAKCRCRxhvAZXjc oifJAQCzi/p+AdQu8LA/0XvR7fTwaq64ZDCibU4BISuLGT2kEgEAuGbuoFZa0rs2 XYD/s4+gi64p9Z01MmXm2XO1pu3GPg0= =eJz5 -----END PGP SIGNATURE----- Merge tag 'v6.6-vfs.ctime' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs Pull vfs timestamp updates from Christian Brauner: "This adds VFS support for multi-grain timestamps and converts tmpfs, xfs, ext4, and btrfs to use them. This carries acks from all relevant filesystems. The VFS always uses coarse-grained timestamps when updating the ctime and mtime after a change. This has the benefit of allowing filesystems to optimize away a lot of metadata updates, down to around 1 per jiffy, even when a file is under heavy writes. Unfortunately, this has always been an issue when we're exporting via NFSv3, which relies on timestamps to validate caches. A lot of changes can happen in a jiffy, so timestamps aren't sufficient to help the client decide to invalidate the cache. Even with NFSv4, a lot of exported filesystems don't properly support a change attribute and are subject to the same problems with timestamp granularity. Other applications have similar issues with timestamps (e.g., backup applications). If we were to always use fine-grained timestamps, that would improve the situation, but that becomes rather expensive, as the underlying filesystem would have to log a lot more metadata updates. This introduces fine-grained timestamps that are used when they are actively queried. This uses the 31st bit of the ctime tv_nsec field to indicate that something has queried the inode for the mtime or ctime. When this flag is set, on the next mtime or ctime update, the kernel will fetch a fine-grained timestamp instead of the usual coarse-grained one. As POSIX generally mandates that when the mtime changes, the ctime must also change the kernel always stores normalized ctime values, so only the first 30 bits of the tv_nsec field are ever used. Filesytems can opt into this behavior by setting the FS_MGTIME flag in the fstype. Filesystems that don't set this flag will continue to use coarse-grained timestamps. Various preparatory changes, fixes and cleanups are included: - Fixup all relevant places where POSIX requires updating ctime together with mtime. This is a wide-range of places and all maintainers provided necessary Acks. - Add new accessors for inode->i_ctime directly and change all callers to rely on them. Plain accesses to inode->i_ctime are now gone and it is accordingly rename to inode->__i_ctime and commented as requiring accessors. - Extend generic_fillattr() to pass in a request mask mirroring in a sense the statx() uapi. This allows callers to pass in a request mask to only get a subset of attributes filled in. - Rework timestamp updates so it's possible to drop the @now parameter the update_time() inode operation and associated helpers. - Add inode_update_timestamps() and convert all filesystems to it removing a bunch of open-coding" * tag 'v6.6-vfs.ctime' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs: (107 commits) btrfs: convert to multigrain timestamps ext4: switch to multigrain timestamps xfs: switch to multigrain timestamps tmpfs: add support for multigrain timestamps fs: add infrastructure for multigrain timestamps fs: drop the timespec64 argument from update_time xfs: have xfs_vn_update_time gets its own timestamp fat: make fat_update_time get its own timestamp fat: remove i_version handling from fat_update_time ubifs: have ubifs_update_time use inode_update_timestamps btrfs: have it use inode_update_timestamps fs: drop the timespec64 arg from generic_update_time fs: pass the request_mask to generic_fillattr fs: remove silly warning from current_time gfs2: fix timestamp handling on quota inodes fs: rename i_ctime field to __i_ctime selinux: convert to ctime accessor functions security: convert to ctime accessor functions apparmor: convert to ctime accessor functions sunrpc: convert to ctime accessor functions ...
This commit is contained in:
commit
615e95831e
|
@ -86,7 +86,7 @@ spufs_new_inode(struct super_block *sb, umode_t mode)
|
|||
inode->i_mode = mode;
|
||||
inode->i_uid = current_fsuid();
|
||||
inode->i_gid = current_fsgid();
|
||||
inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_atime = inode->i_mtime = inode_set_ctime_current(inode);
|
||||
out:
|
||||
return inode;
|
||||
}
|
||||
|
|
|
@ -53,7 +53,7 @@ static void hypfs_update_update(struct super_block *sb)
|
|||
struct inode *inode = d_inode(sb_info->update_file);
|
||||
|
||||
sb_info->last_update = ktime_get_seconds();
|
||||
inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_atime = inode->i_mtime = inode_set_ctime_current(inode);
|
||||
}
|
||||
|
||||
/* directory tree removal functions */
|
||||
|
@ -101,7 +101,7 @@ static struct inode *hypfs_make_inode(struct super_block *sb, umode_t mode)
|
|||
ret->i_mode = mode;
|
||||
ret->i_uid = hypfs_info->uid;
|
||||
ret->i_gid = hypfs_info->gid;
|
||||
ret->i_atime = ret->i_mtime = ret->i_ctime = current_time(ret);
|
||||
ret->i_atime = ret->i_mtime = inode_set_ctime_current(ret);
|
||||
if (S_ISDIR(mode))
|
||||
set_nlink(ret, 2);
|
||||
}
|
||||
|
|
|
@ -153,7 +153,7 @@ static int binderfs_binder_device_create(struct inode *ref_inode,
|
|||
goto err;
|
||||
|
||||
inode->i_ino = minor + INODE_OFFSET;
|
||||
inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode->i_atime = inode_set_ctime_current(inode);
|
||||
init_special_inode(inode, S_IFCHR | 0600,
|
||||
MKDEV(MAJOR(binderfs_dev), minor));
|
||||
inode->i_fop = &binder_fops;
|
||||
|
@ -432,7 +432,7 @@ static int binderfs_binder_ctl_create(struct super_block *sb)
|
|||
}
|
||||
|
||||
inode->i_ino = SECOND_INODE;
|
||||
inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode->i_atime = inode_set_ctime_current(inode);
|
||||
init_special_inode(inode, S_IFCHR | 0600,
|
||||
MKDEV(MAJOR(binderfs_dev), minor));
|
||||
inode->i_fop = &binder_ctl_fops;
|
||||
|
@ -474,7 +474,7 @@ static struct inode *binderfs_make_inode(struct super_block *sb, int mode)
|
|||
if (ret) {
|
||||
ret->i_ino = iunique(sb, BINDERFS_MAX_MINOR + INODE_OFFSET);
|
||||
ret->i_mode = mode;
|
||||
ret->i_atime = ret->i_mtime = ret->i_ctime = current_time(ret);
|
||||
ret->i_atime = ret->i_mtime = inode_set_ctime_current(ret);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
@ -703,7 +703,7 @@ static int binderfs_fill_super(struct super_block *sb, struct fs_context *fc)
|
|||
inode->i_ino = FIRST_INODE;
|
||||
inode->i_fop = &simple_dir_operations;
|
||||
inode->i_mode = S_IFDIR | 0755;
|
||||
inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode->i_atime = inode_set_ctime_current(inode);
|
||||
inode->i_op = &binderfs_dir_inode_operations;
|
||||
set_nlink(inode, 2);
|
||||
|
||||
|
|
|
@ -64,9 +64,8 @@ static int qibfs_mknod(struct inode *dir, struct dentry *dentry,
|
|||
inode->i_uid = GLOBAL_ROOT_UID;
|
||||
inode->i_gid = GLOBAL_ROOT_GID;
|
||||
inode->i_blocks = 0;
|
||||
inode->i_atime = current_time(inode);
|
||||
inode->i_atime = inode_set_ctime_current(inode);
|
||||
inode->i_mtime = inode->i_atime;
|
||||
inode->i_ctime = inode->i_atime;
|
||||
inode->i_private = data;
|
||||
if (S_ISDIR(mode)) {
|
||||
inode->i_op = &simple_dir_inode_operations;
|
||||
|
|
|
@ -139,7 +139,7 @@ static struct inode *ibmasmfs_make_inode(struct super_block *sb, int mode)
|
|||
if (ret) {
|
||||
ret->i_ino = get_next_ino();
|
||||
ret->i_mode = mode;
|
||||
ret->i_atime = ret->i_mtime = ret->i_ctime = current_time(ret);
|
||||
ret->i_atime = ret->i_mtime = inode_set_ctime_current(ret);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -1124,7 +1124,7 @@ static ssize_t ibmvmc_write(struct file *file, const char *buffer,
|
|||
goto out;
|
||||
|
||||
inode = file_inode(file);
|
||||
inode->i_mtime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
mark_inode_dirty(inode);
|
||||
|
||||
dev_dbg(adapter->dev, "write: file = 0x%lx, count = 0x%lx\n",
|
||||
|
|
|
@ -2642,21 +2642,21 @@ static long usbdev_do_ioctl(struct file *file, unsigned int cmd,
|
|||
snoop(&dev->dev, "%s: CONTROL\n", __func__);
|
||||
ret = proc_control(ps, p);
|
||||
if (ret >= 0)
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
break;
|
||||
|
||||
case USBDEVFS_BULK:
|
||||
snoop(&dev->dev, "%s: BULK\n", __func__);
|
||||
ret = proc_bulk(ps, p);
|
||||
if (ret >= 0)
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
break;
|
||||
|
||||
case USBDEVFS_RESETEP:
|
||||
snoop(&dev->dev, "%s: RESETEP\n", __func__);
|
||||
ret = proc_resetep(ps, p);
|
||||
if (ret >= 0)
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
break;
|
||||
|
||||
case USBDEVFS_RESET:
|
||||
|
@ -2668,7 +2668,7 @@ static long usbdev_do_ioctl(struct file *file, unsigned int cmd,
|
|||
snoop(&dev->dev, "%s: CLEAR_HALT\n", __func__);
|
||||
ret = proc_clearhalt(ps, p);
|
||||
if (ret >= 0)
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
break;
|
||||
|
||||
case USBDEVFS_GETDRIVER:
|
||||
|
@ -2695,7 +2695,7 @@ static long usbdev_do_ioctl(struct file *file, unsigned int cmd,
|
|||
snoop(&dev->dev, "%s: SUBMITURB\n", __func__);
|
||||
ret = proc_submiturb(ps, p);
|
||||
if (ret >= 0)
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
|
@ -2703,14 +2703,14 @@ static long usbdev_do_ioctl(struct file *file, unsigned int cmd,
|
|||
snoop(&dev->dev, "%s: CONTROL32\n", __func__);
|
||||
ret = proc_control_compat(ps, p);
|
||||
if (ret >= 0)
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
break;
|
||||
|
||||
case USBDEVFS_BULK32:
|
||||
snoop(&dev->dev, "%s: BULK32\n", __func__);
|
||||
ret = proc_bulk_compat(ps, p);
|
||||
if (ret >= 0)
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
break;
|
||||
|
||||
case USBDEVFS_DISCSIGNAL32:
|
||||
|
@ -2722,7 +2722,7 @@ static long usbdev_do_ioctl(struct file *file, unsigned int cmd,
|
|||
snoop(&dev->dev, "%s: SUBMITURB32\n", __func__);
|
||||
ret = proc_submiturb_compat(ps, p);
|
||||
if (ret >= 0)
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
break;
|
||||
|
||||
case USBDEVFS_IOCTL32:
|
||||
|
|
|
@ -1377,7 +1377,7 @@ ffs_sb_make_inode(struct super_block *sb, void *data,
|
|||
inode = new_inode(sb);
|
||||
|
||||
if (inode) {
|
||||
struct timespec64 ts = current_time(inode);
|
||||
struct timespec64 ts = inode_set_ctime_current(inode);
|
||||
|
||||
inode->i_ino = get_next_ino();
|
||||
inode->i_mode = perms->mode;
|
||||
|
@ -1385,7 +1385,6 @@ ffs_sb_make_inode(struct super_block *sb, void *data,
|
|||
inode->i_gid = perms->gid;
|
||||
inode->i_atime = ts;
|
||||
inode->i_mtime = ts;
|
||||
inode->i_ctime = ts;
|
||||
inode->i_private = data;
|
||||
if (fops)
|
||||
inode->i_fop = fops;
|
||||
|
|
|
@ -1969,8 +1969,7 @@ gadgetfs_make_inode (struct super_block *sb,
|
|||
inode->i_mode = mode;
|
||||
inode->i_uid = make_kuid(&init_user_ns, default_uid);
|
||||
inode->i_gid = make_kgid(&init_user_ns, default_gid);
|
||||
inode->i_atime = inode->i_mtime = inode->i_ctime
|
||||
= current_time(inode);
|
||||
inode->i_atime = inode->i_mtime = inode_set_ctime_current(inode);
|
||||
inode->i_private = data;
|
||||
inode->i_fop = fops;
|
||||
}
|
||||
|
|
|
@ -260,7 +260,7 @@ int v9fs_init_inode(struct v9fs_session_info *v9ses,
|
|||
inode_init_owner(&nop_mnt_idmap, inode, NULL, mode);
|
||||
inode->i_blocks = 0;
|
||||
inode->i_rdev = rdev;
|
||||
inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_atime = inode->i_mtime = inode_set_ctime_current(inode);
|
||||
inode->i_mapping->a_ops = &v9fs_addr_operations;
|
||||
inode->i_private = NULL;
|
||||
|
||||
|
@ -1011,7 +1011,7 @@ v9fs_vfs_getattr(struct mnt_idmap *idmap, const struct path *path,
|
|||
p9_debug(P9_DEBUG_VFS, "dentry: %p\n", dentry);
|
||||
v9ses = v9fs_dentry2v9ses(dentry);
|
||||
if (v9ses->cache & (CACHE_META|CACHE_LOOSE)) {
|
||||
generic_fillattr(&nop_mnt_idmap, inode, stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
|
||||
return 0;
|
||||
} else if (v9ses->cache & CACHE_WRITEBACK) {
|
||||
if (S_ISREG(inode->i_mode)) {
|
||||
|
@ -1032,7 +1032,7 @@ v9fs_vfs_getattr(struct mnt_idmap *idmap, const struct path *path,
|
|||
return PTR_ERR(st);
|
||||
|
||||
v9fs_stat2inode(st, d_inode(dentry), dentry->d_sb, 0);
|
||||
generic_fillattr(&nop_mnt_idmap, d_inode(dentry), stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, d_inode(dentry), stat);
|
||||
|
||||
p9stat_free(st);
|
||||
kfree(st);
|
||||
|
@ -1152,7 +1152,7 @@ v9fs_stat2inode(struct p9_wstat *stat, struct inode *inode,
|
|||
|
||||
inode->i_atime.tv_sec = stat->atime;
|
||||
inode->i_mtime.tv_sec = stat->mtime;
|
||||
inode->i_ctime.tv_sec = stat->mtime;
|
||||
inode_set_ctime(inode, stat->mtime, 0);
|
||||
|
||||
inode->i_uid = v9ses->dfltuid;
|
||||
inode->i_gid = v9ses->dfltgid;
|
||||
|
|
|
@ -450,7 +450,7 @@ v9fs_vfs_getattr_dotl(struct mnt_idmap *idmap,
|
|||
p9_debug(P9_DEBUG_VFS, "dentry: %p\n", dentry);
|
||||
v9ses = v9fs_dentry2v9ses(dentry);
|
||||
if (v9ses->cache & (CACHE_META|CACHE_LOOSE)) {
|
||||
generic_fillattr(&nop_mnt_idmap, inode, stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
|
||||
return 0;
|
||||
} else if (v9ses->cache) {
|
||||
if (S_ISREG(inode->i_mode)) {
|
||||
|
@ -475,7 +475,7 @@ v9fs_vfs_getattr_dotl(struct mnt_idmap *idmap,
|
|||
return PTR_ERR(st);
|
||||
|
||||
v9fs_stat2inode_dotl(st, d_inode(dentry), 0);
|
||||
generic_fillattr(&nop_mnt_idmap, d_inode(dentry), stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, d_inode(dentry), stat);
|
||||
/* Change block size to what the server returned */
|
||||
stat->blksize = st->st_blksize;
|
||||
|
||||
|
@ -645,8 +645,8 @@ v9fs_stat2inode_dotl(struct p9_stat_dotl *stat, struct inode *inode,
|
|||
inode->i_atime.tv_nsec = stat->st_atime_nsec;
|
||||
inode->i_mtime.tv_sec = stat->st_mtime_sec;
|
||||
inode->i_mtime.tv_nsec = stat->st_mtime_nsec;
|
||||
inode->i_ctime.tv_sec = stat->st_ctime_sec;
|
||||
inode->i_ctime.tv_nsec = stat->st_ctime_nsec;
|
||||
inode_set_ctime(inode, stat->st_ctime_sec,
|
||||
stat->st_ctime_nsec);
|
||||
inode->i_uid = stat->st_uid;
|
||||
inode->i_gid = stat->st_gid;
|
||||
set_nlink(inode, stat->st_nlink);
|
||||
|
@ -668,8 +668,8 @@ v9fs_stat2inode_dotl(struct p9_stat_dotl *stat, struct inode *inode,
|
|||
inode->i_mtime.tv_nsec = stat->st_mtime_nsec;
|
||||
}
|
||||
if (stat->st_result_mask & P9_STATS_CTIME) {
|
||||
inode->i_ctime.tv_sec = stat->st_ctime_sec;
|
||||
inode->i_ctime.tv_nsec = stat->st_ctime_nsec;
|
||||
inode_set_ctime(inode, stat->st_ctime_sec,
|
||||
stat->st_ctime_nsec);
|
||||
}
|
||||
if (stat->st_result_mask & P9_STATS_UID)
|
||||
inode->i_uid = stat->st_uid;
|
||||
|
|
|
@ -270,7 +270,7 @@ adfs_iget(struct super_block *sb, struct object_info *obj)
|
|||
inode->i_mode = adfs_atts2mode(sb, inode);
|
||||
adfs_adfs2unix_time(&inode->i_mtime, inode);
|
||||
inode->i_atime = inode->i_mtime;
|
||||
inode->i_ctime = inode->i_mtime;
|
||||
inode_set_ctime_to_ts(inode, inode->i_mtime);
|
||||
|
||||
if (S_ISDIR(inode->i_mode)) {
|
||||
inode->i_op = &adfs_dir_inode_operations;
|
||||
|
@ -331,7 +331,7 @@ adfs_notify_change(struct mnt_idmap *idmap, struct dentry *dentry,
|
|||
if (ia_valid & ATTR_ATIME)
|
||||
inode->i_atime = attr->ia_atime;
|
||||
if (ia_valid & ATTR_CTIME)
|
||||
inode->i_ctime = attr->ia_ctime;
|
||||
inode_set_ctime_to_ts(inode, attr->ia_ctime);
|
||||
if (ia_valid & ATTR_MODE) {
|
||||
ADFS_I(inode)->attr = adfs_mode2atts(sb, inode, attr->ia_mode);
|
||||
inode->i_mode = adfs_atts2mode(sb, inode);
|
||||
|
|
|
@ -60,7 +60,7 @@ affs_insert_hash(struct inode *dir, struct buffer_head *bh)
|
|||
mark_buffer_dirty_inode(dir_bh, dir);
|
||||
affs_brelse(dir_bh);
|
||||
|
||||
dir->i_mtime = dir->i_ctime = current_time(dir);
|
||||
dir->i_mtime = inode_set_ctime_current(dir);
|
||||
inode_inc_iversion(dir);
|
||||
mark_inode_dirty(dir);
|
||||
|
||||
|
@ -114,7 +114,7 @@ affs_remove_hash(struct inode *dir, struct buffer_head *rem_bh)
|
|||
|
||||
affs_brelse(bh);
|
||||
|
||||
dir->i_mtime = dir->i_ctime = current_time(dir);
|
||||
dir->i_mtime = inode_set_ctime_current(dir);
|
||||
inode_inc_iversion(dir);
|
||||
mark_inode_dirty(dir);
|
||||
|
||||
|
@ -315,7 +315,7 @@ affs_remove_header(struct dentry *dentry)
|
|||
else
|
||||
clear_nlink(inode);
|
||||
affs_unlock_link(inode);
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
mark_inode_dirty(inode);
|
||||
|
||||
done:
|
||||
|
|
|
@ -149,13 +149,13 @@ struct inode *affs_iget(struct super_block *sb, unsigned long ino)
|
|||
break;
|
||||
}
|
||||
|
||||
inode->i_mtime.tv_sec = inode->i_atime.tv_sec = inode->i_ctime.tv_sec
|
||||
= (be32_to_cpu(tail->change.days) * 86400LL +
|
||||
be32_to_cpu(tail->change.mins) * 60 +
|
||||
be32_to_cpu(tail->change.ticks) / 50 +
|
||||
AFFS_EPOCH_DELTA) +
|
||||
sys_tz.tz_minuteswest * 60;
|
||||
inode->i_mtime.tv_nsec = inode->i_ctime.tv_nsec = inode->i_atime.tv_nsec = 0;
|
||||
inode->i_mtime.tv_sec = inode->i_atime.tv_sec =
|
||||
inode_set_ctime(inode,
|
||||
(be32_to_cpu(tail->change.days) * 86400LL +
|
||||
be32_to_cpu(tail->change.mins) * 60 +
|
||||
be32_to_cpu(tail->change.ticks) / 50 + AFFS_EPOCH_DELTA)
|
||||
+ sys_tz.tz_minuteswest * 60, 0).tv_sec;
|
||||
inode->i_mtime.tv_nsec = inode->i_atime.tv_nsec = 0;
|
||||
affs_brelse(bh);
|
||||
unlock_new_inode(inode);
|
||||
return inode;
|
||||
|
@ -314,7 +314,7 @@ affs_new_inode(struct inode *dir)
|
|||
inode->i_gid = current_fsgid();
|
||||
inode->i_ino = block;
|
||||
set_nlink(inode, 1);
|
||||
inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode->i_atime = inode_set_ctime_current(inode);
|
||||
atomic_set(&AFFS_I(inode)->i_opencnt, 0);
|
||||
AFFS_I(inode)->i_blkcnt = 0;
|
||||
AFFS_I(inode)->i_lc = NULL;
|
||||
|
|
|
@ -88,7 +88,7 @@ struct inode *afs_iget_pseudo_dir(struct super_block *sb, bool root)
|
|||
set_nlink(inode, 2);
|
||||
inode->i_uid = GLOBAL_ROOT_UID;
|
||||
inode->i_gid = GLOBAL_ROOT_GID;
|
||||
inode->i_ctime = inode->i_atime = inode->i_mtime = current_time(inode);
|
||||
inode->i_atime = inode->i_mtime = inode_set_ctime_current(inode);
|
||||
inode->i_blocks = 0;
|
||||
inode->i_generation = 0;
|
||||
|
||||
|
|
|
@ -90,7 +90,7 @@ static int afs_inode_init_from_status(struct afs_operation *op,
|
|||
vnode->status = *status;
|
||||
|
||||
t = status->mtime_client;
|
||||
inode->i_ctime = t;
|
||||
inode_set_ctime_to_ts(inode, t);
|
||||
inode->i_mtime = t;
|
||||
inode->i_atime = t;
|
||||
inode->i_flags |= S_NOATIME;
|
||||
|
@ -206,7 +206,7 @@ static void afs_apply_status(struct afs_operation *op,
|
|||
t = status->mtime_client;
|
||||
inode->i_mtime = t;
|
||||
if (vp->update_ctime)
|
||||
inode->i_ctime = op->ctime;
|
||||
inode_set_ctime_to_ts(inode, op->ctime);
|
||||
|
||||
if (vnode->status.data_version != status->data_version)
|
||||
data_changed = true;
|
||||
|
@ -252,7 +252,7 @@ static void afs_apply_status(struct afs_operation *op,
|
|||
vnode->netfs.remote_i_size = status->size;
|
||||
if (change_size) {
|
||||
afs_set_i_size(vnode, status->size);
|
||||
inode->i_ctime = t;
|
||||
inode_set_ctime_to_ts(inode, t);
|
||||
inode->i_atime = t;
|
||||
}
|
||||
}
|
||||
|
@ -773,7 +773,7 @@ int afs_getattr(struct mnt_idmap *idmap, const struct path *path,
|
|||
|
||||
do {
|
||||
read_seqbegin_or_lock(&vnode->cb_lock, &seq);
|
||||
generic_fillattr(&nop_mnt_idmap, inode, stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
|
||||
if (test_bit(AFS_VNODE_SILLY_DELETED, &vnode->flags) &&
|
||||
stat->nlink > 0)
|
||||
stat->nlink -= 1;
|
||||
|
|
|
@ -312,7 +312,7 @@ void setattr_copy(struct mnt_idmap *idmap, struct inode *inode,
|
|||
if (ia_valid & ATTR_MTIME)
|
||||
inode->i_mtime = attr->ia_mtime;
|
||||
if (ia_valid & ATTR_CTIME)
|
||||
inode->i_ctime = attr->ia_ctime;
|
||||
inode_set_ctime_to_ts(inode, attr->ia_ctime);
|
||||
if (ia_valid & ATTR_MODE) {
|
||||
umode_t mode = attr->ia_mode;
|
||||
if (!in_group_or_capable(idmap, inode,
|
||||
|
|
|
@ -370,7 +370,7 @@ struct inode *autofs_get_inode(struct super_block *sb, umode_t mode)
|
|||
inode->i_uid = d_inode(sb->s_root)->i_uid;
|
||||
inode->i_gid = d_inode(sb->s_root)->i_gid;
|
||||
}
|
||||
inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_atime = inode->i_mtime = inode_set_ctime_current(inode);
|
||||
inode->i_ino = get_next_ino();
|
||||
|
||||
if (S_ISDIR(mode)) {
|
||||
|
|
|
@ -600,7 +600,7 @@ static int autofs_dir_symlink(struct mnt_idmap *idmap,
|
|||
p_ino = autofs_dentry_ino(dentry->d_parent);
|
||||
p_ino->count++;
|
||||
|
||||
dir->i_mtime = dir->i_ctime = current_time(dir);
|
||||
dir->i_mtime = inode_set_ctime_current(dir);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -633,7 +633,7 @@ static int autofs_dir_unlink(struct inode *dir, struct dentry *dentry)
|
|||
d_inode(dentry)->i_size = 0;
|
||||
clear_nlink(d_inode(dentry));
|
||||
|
||||
dir->i_mtime = dir->i_ctime = current_time(dir);
|
||||
dir->i_mtime = inode_set_ctime_current(dir);
|
||||
|
||||
spin_lock(&sbi->lookup_lock);
|
||||
__autofs_add_expiring(dentry);
|
||||
|
@ -749,7 +749,7 @@ static int autofs_dir_mkdir(struct mnt_idmap *idmap,
|
|||
p_ino = autofs_dentry_ino(dentry->d_parent);
|
||||
p_ino->count++;
|
||||
inc_nlink(dir);
|
||||
dir->i_mtime = dir->i_ctime = current_time(dir);
|
||||
dir->i_mtime = inode_set_ctime_current(dir);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -133,8 +133,7 @@ static int bad_inode_fiemap(struct inode *inode,
|
|||
return -EIO;
|
||||
}
|
||||
|
||||
static int bad_inode_update_time(struct inode *inode, struct timespec64 *time,
|
||||
int flags)
|
||||
static int bad_inode_update_time(struct inode *inode, int flags)
|
||||
{
|
||||
return -EIO;
|
||||
}
|
||||
|
@ -209,8 +208,7 @@ void make_bad_inode(struct inode *inode)
|
|||
remove_inode_hash(inode);
|
||||
|
||||
inode->i_mode = S_IFREG;
|
||||
inode->i_atime = inode->i_mtime = inode->i_ctime =
|
||||
current_time(inode);
|
||||
inode->i_atime = inode->i_mtime = inode_set_ctime_current(inode);
|
||||
inode->i_op = &bad_inode_ops;
|
||||
inode->i_opflags &= ~IOP_XATTR;
|
||||
inode->i_fop = &bad_file_ops;
|
||||
|
|
|
@ -363,7 +363,7 @@ static struct inode *befs_iget(struct super_block *sb, unsigned long ino)
|
|||
inode->i_mtime.tv_sec =
|
||||
fs64_to_cpu(sb, raw_inode->last_modified_time) >> 16;
|
||||
inode->i_mtime.tv_nsec = 0; /* lower 16 bits are not a time */
|
||||
inode->i_ctime = inode->i_mtime;
|
||||
inode_set_ctime_to_ts(inode, inode->i_mtime);
|
||||
inode->i_atime = inode->i_mtime;
|
||||
|
||||
befs_ino->i_inode_num = fsrun_to_cpu(sb, raw_inode->inode_num);
|
||||
|
|
16
fs/bfs/dir.c
16
fs/bfs/dir.c
|
@ -97,7 +97,7 @@ static int bfs_create(struct mnt_idmap *idmap, struct inode *dir,
|
|||
set_bit(ino, info->si_imap);
|
||||
info->si_freei--;
|
||||
inode_init_owner(&nop_mnt_idmap, inode, dir, mode);
|
||||
inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode->i_atime = inode_set_ctime_current(inode);
|
||||
inode->i_blocks = 0;
|
||||
inode->i_op = &bfs_file_inops;
|
||||
inode->i_fop = &bfs_file_operations;
|
||||
|
@ -158,7 +158,7 @@ static int bfs_link(struct dentry *old, struct inode *dir,
|
|||
return err;
|
||||
}
|
||||
inc_nlink(inode);
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
mark_inode_dirty(inode);
|
||||
ihold(inode);
|
||||
d_instantiate(new, inode);
|
||||
|
@ -187,9 +187,9 @@ static int bfs_unlink(struct inode *dir, struct dentry *dentry)
|
|||
}
|
||||
de->ino = 0;
|
||||
mark_buffer_dirty_inode(bh, dir);
|
||||
dir->i_ctime = dir->i_mtime = current_time(dir);
|
||||
dir->i_mtime = inode_set_ctime_current(dir);
|
||||
mark_inode_dirty(dir);
|
||||
inode->i_ctime = dir->i_ctime;
|
||||
inode_set_ctime_to_ts(inode, inode_get_ctime(dir));
|
||||
inode_dec_link_count(inode);
|
||||
error = 0;
|
||||
|
||||
|
@ -240,10 +240,10 @@ static int bfs_rename(struct mnt_idmap *idmap, struct inode *old_dir,
|
|||
goto end_rename;
|
||||
}
|
||||
old_de->ino = 0;
|
||||
old_dir->i_ctime = old_dir->i_mtime = current_time(old_dir);
|
||||
old_dir->i_mtime = inode_set_ctime_current(old_dir);
|
||||
mark_inode_dirty(old_dir);
|
||||
if (new_inode) {
|
||||
new_inode->i_ctime = current_time(new_inode);
|
||||
inode_set_ctime_current(new_inode);
|
||||
inode_dec_link_count(new_inode);
|
||||
}
|
||||
mark_buffer_dirty_inode(old_bh, old_dir);
|
||||
|
@ -292,9 +292,9 @@ static int bfs_add_entry(struct inode *dir, const struct qstr *child, int ino)
|
|||
pos = (block - sblock) * BFS_BSIZE + off;
|
||||
if (pos >= dir->i_size) {
|
||||
dir->i_size += BFS_DIRENT_SIZE;
|
||||
dir->i_ctime = current_time(dir);
|
||||
inode_set_ctime_current(dir);
|
||||
}
|
||||
dir->i_mtime = current_time(dir);
|
||||
dir->i_mtime = inode_set_ctime_current(dir);
|
||||
mark_inode_dirty(dir);
|
||||
de->ino = cpu_to_le16((u16)ino);
|
||||
for (i = 0; i < BFS_NAMELEN; i++)
|
||||
|
|
|
@ -82,10 +82,9 @@ struct inode *bfs_iget(struct super_block *sb, unsigned long ino)
|
|||
inode->i_blocks = BFS_FILEBLOCKS(di);
|
||||
inode->i_atime.tv_sec = le32_to_cpu(di->i_atime);
|
||||
inode->i_mtime.tv_sec = le32_to_cpu(di->i_mtime);
|
||||
inode->i_ctime.tv_sec = le32_to_cpu(di->i_ctime);
|
||||
inode_set_ctime(inode, le32_to_cpu(di->i_ctime), 0);
|
||||
inode->i_atime.tv_nsec = 0;
|
||||
inode->i_mtime.tv_nsec = 0;
|
||||
inode->i_ctime.tv_nsec = 0;
|
||||
|
||||
brelse(bh);
|
||||
unlock_new_inode(inode);
|
||||
|
@ -143,7 +142,7 @@ static int bfs_write_inode(struct inode *inode, struct writeback_control *wbc)
|
|||
di->i_nlink = cpu_to_le32(inode->i_nlink);
|
||||
di->i_atime = cpu_to_le32(inode->i_atime.tv_sec);
|
||||
di->i_mtime = cpu_to_le32(inode->i_mtime.tv_sec);
|
||||
di->i_ctime = cpu_to_le32(inode->i_ctime.tv_sec);
|
||||
di->i_ctime = cpu_to_le32(inode_get_ctime(inode).tv_sec);
|
||||
i_sblock = BFS_I(inode)->i_sblock;
|
||||
di->i_sblock = cpu_to_le32(i_sblock);
|
||||
di->i_eblock = cpu_to_le32(BFS_I(inode)->i_eblock);
|
||||
|
|
|
@ -547,8 +547,7 @@ static struct inode *bm_get_inode(struct super_block *sb, int mode)
|
|||
if (inode) {
|
||||
inode->i_ino = get_next_ino();
|
||||
inode->i_mode = mode;
|
||||
inode->i_atime = inode->i_mtime = inode->i_ctime =
|
||||
current_time(inode);
|
||||
inode->i_atime = inode->i_mtime = inode_set_ctime_current(inode);
|
||||
}
|
||||
return inode;
|
||||
}
|
||||
|
|
|
@ -1809,9 +1809,9 @@ static void fill_stack_inode_item(struct btrfs_trans_handle *trans,
|
|||
inode->i_mtime.tv_nsec);
|
||||
|
||||
btrfs_set_stack_timespec_sec(&inode_item->ctime,
|
||||
inode->i_ctime.tv_sec);
|
||||
inode_get_ctime(inode).tv_sec);
|
||||
btrfs_set_stack_timespec_nsec(&inode_item->ctime,
|
||||
inode->i_ctime.tv_nsec);
|
||||
inode_get_ctime(inode).tv_nsec);
|
||||
|
||||
btrfs_set_stack_timespec_sec(&inode_item->otime,
|
||||
BTRFS_I(inode)->i_otime.tv_sec);
|
||||
|
@ -1862,8 +1862,8 @@ int btrfs_fill_inode(struct inode *inode, u32 *rdev)
|
|||
inode->i_mtime.tv_sec = btrfs_stack_timespec_sec(&inode_item->mtime);
|
||||
inode->i_mtime.tv_nsec = btrfs_stack_timespec_nsec(&inode_item->mtime);
|
||||
|
||||
inode->i_ctime.tv_sec = btrfs_stack_timespec_sec(&inode_item->ctime);
|
||||
inode->i_ctime.tv_nsec = btrfs_stack_timespec_nsec(&inode_item->ctime);
|
||||
inode_set_ctime(inode, btrfs_stack_timespec_sec(&inode_item->ctime),
|
||||
btrfs_stack_timespec_nsec(&inode_item->ctime));
|
||||
|
||||
BTRFS_I(inode)->i_otime.tv_sec =
|
||||
btrfs_stack_timespec_sec(&inode_item->otime);
|
||||
|
|
|
@ -1106,24 +1106,6 @@ void btrfs_check_nocow_unlock(struct btrfs_inode *inode)
|
|||
btrfs_drew_write_unlock(&inode->root->snapshot_lock);
|
||||
}
|
||||
|
||||
static void update_time_for_write(struct inode *inode)
|
||||
{
|
||||
struct timespec64 now;
|
||||
|
||||
if (IS_NOCMTIME(inode))
|
||||
return;
|
||||
|
||||
now = current_time(inode);
|
||||
if (!timespec64_equal(&inode->i_mtime, &now))
|
||||
inode->i_mtime = now;
|
||||
|
||||
if (!timespec64_equal(&inode->i_ctime, &now))
|
||||
inode->i_ctime = now;
|
||||
|
||||
if (IS_I_VERSION(inode))
|
||||
inode_inc_iversion(inode);
|
||||
}
|
||||
|
||||
static int btrfs_write_check(struct kiocb *iocb, struct iov_iter *from,
|
||||
size_t count)
|
||||
{
|
||||
|
@ -1155,7 +1137,10 @@ static int btrfs_write_check(struct kiocb *iocb, struct iov_iter *from,
|
|||
* need to start yet another transaction to update the inode as we will
|
||||
* update the inode when we finish writing whatever data we write.
|
||||
*/
|
||||
update_time_for_write(inode);
|
||||
if (!IS_NOCMTIME(inode)) {
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
inode_inc_iversion(inode);
|
||||
}
|
||||
|
||||
start_pos = round_down(pos, fs_info->sectorsize);
|
||||
oldsize = i_size_read(inode);
|
||||
|
@ -2459,10 +2444,8 @@ int btrfs_replace_file_extents(struct btrfs_inode *inode,
|
|||
*/
|
||||
inode_inc_iversion(&inode->vfs_inode);
|
||||
|
||||
if (!extent_info || extent_info->update_times) {
|
||||
inode->vfs_inode.i_mtime = current_time(&inode->vfs_inode);
|
||||
inode->vfs_inode.i_ctime = inode->vfs_inode.i_mtime;
|
||||
}
|
||||
if (!extent_info || extent_info->update_times)
|
||||
inode->vfs_inode.i_mtime = inode_set_ctime_current(&inode->vfs_inode);
|
||||
|
||||
ret = btrfs_update_inode(trans, root, inode);
|
||||
if (ret)
|
||||
|
@ -2703,8 +2686,7 @@ static int btrfs_punch_hole(struct file *file, loff_t offset, loff_t len)
|
|||
|
||||
ASSERT(trans != NULL);
|
||||
inode_inc_iversion(inode);
|
||||
inode->i_mtime = current_time(inode);
|
||||
inode->i_ctime = inode->i_mtime;
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
ret = btrfs_update_inode(trans, root, BTRFS_I(inode));
|
||||
updated_inode = true;
|
||||
btrfs_end_transaction(trans);
|
||||
|
@ -2721,11 +2703,10 @@ out_only_mutex:
|
|||
* for detecting, at fsync time, if the inode isn't yet in the
|
||||
* log tree or it's there but not up to date.
|
||||
*/
|
||||
struct timespec64 now = current_time(inode);
|
||||
struct timespec64 now = inode_set_ctime_current(inode);
|
||||
|
||||
inode_inc_iversion(inode);
|
||||
inode->i_mtime = now;
|
||||
inode->i_ctime = now;
|
||||
trans = btrfs_start_transaction(root, 1);
|
||||
if (IS_ERR(trans)) {
|
||||
ret = PTR_ERR(trans);
|
||||
|
@ -2796,7 +2777,7 @@ static int btrfs_fallocate_update_isize(struct inode *inode,
|
|||
if (IS_ERR(trans))
|
||||
return PTR_ERR(trans);
|
||||
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
i_size_write(inode, end);
|
||||
btrfs_inode_safe_disk_i_size_write(BTRFS_I(inode), 0);
|
||||
ret = btrfs_update_inode(trans, root, BTRFS_I(inode));
|
||||
|
|
|
@ -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) &&
|
||||
|
|
|
@ -384,7 +384,7 @@ update_flags:
|
|||
binode->flags = binode_flags;
|
||||
btrfs_sync_inode_flags_to_i_flags(inode);
|
||||
inode_inc_iversion(inode);
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
ret = btrfs_update_inode(trans, root, BTRFS_I(inode));
|
||||
|
||||
out_end_trans:
|
||||
|
|
|
@ -30,8 +30,7 @@ static int clone_finish_inode_update(struct btrfs_trans_handle *trans,
|
|||
|
||||
inode_inc_iversion(inode);
|
||||
if (!no_time_update) {
|
||||
inode->i_mtime = current_time(inode);
|
||||
inode->i_ctime = inode->i_mtime;
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
}
|
||||
/*
|
||||
* We round up to the block size at eof when determining which
|
||||
|
|
|
@ -2144,7 +2144,7 @@ static struct file_system_type btrfs_fs_type = {
|
|||
.name = "btrfs",
|
||||
.mount = btrfs_mount,
|
||||
.kill_sb = btrfs_kill_super,
|
||||
.fs_flags = FS_REQUIRES_DEV | FS_BINARY_MOUNTDATA,
|
||||
.fs_flags = FS_REQUIRES_DEV | FS_BINARY_MOUNTDATA | FS_MGTIME,
|
||||
};
|
||||
|
||||
static struct file_system_type btrfs_root_fs_type = {
|
||||
|
@ -2152,7 +2152,8 @@ static struct file_system_type btrfs_root_fs_type = {
|
|||
.name = "btrfs",
|
||||
.mount = btrfs_mount_root,
|
||||
.kill_sb = btrfs_kill_super,
|
||||
.fs_flags = FS_REQUIRES_DEV | FS_BINARY_MOUNTDATA | FS_ALLOW_IDMAP,
|
||||
.fs_flags = FS_REQUIRES_DEV | FS_BINARY_MOUNTDATA |
|
||||
FS_ALLOW_IDMAP | FS_MGTIME,
|
||||
};
|
||||
|
||||
MODULE_ALIAS_FS("btrfs");
|
||||
|
|
|
@ -1837,8 +1837,7 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans,
|
|||
|
||||
btrfs_i_size_write(BTRFS_I(parent_inode), parent_inode->i_size +
|
||||
fname.disk_name.len * 2);
|
||||
parent_inode->i_mtime = current_time(parent_inode);
|
||||
parent_inode->i_ctime = parent_inode->i_mtime;
|
||||
parent_inode->i_mtime = inode_set_ctime_current(parent_inode);
|
||||
ret = btrfs_update_inode_fallback(trans, parent_root, BTRFS_I(parent_inode));
|
||||
if (ret) {
|
||||
btrfs_abort_transaction(trans, ret);
|
||||
|
|
|
@ -4148,9 +4148,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);
|
||||
|
||||
/*
|
||||
* We do not need to set the nbytes field, in fact during a fast fsync
|
||||
|
|
|
@ -1917,15 +1917,13 @@ out:
|
|||
static void update_dev_time(const char *device_path)
|
||||
{
|
||||
struct path path;
|
||||
struct timespec64 now;
|
||||
int ret;
|
||||
|
||||
ret = kern_path(device_path, LOOKUP_FOLLOW, &path);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
now = current_time(d_inode(path.dentry));
|
||||
inode_update_time(d_inode(path.dentry), &now, S_MTIME | S_CTIME | S_VERSION);
|
||||
inode_update_time(d_inode(path.dentry), S_MTIME | S_CTIME | S_VERSION);
|
||||
path_put(&path);
|
||||
}
|
||||
|
||||
|
|
|
@ -264,7 +264,7 @@ int btrfs_setxattr_trans(struct inode *inode, const char *name,
|
|||
goto out;
|
||||
|
||||
inode_inc_iversion(inode);
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
ret = btrfs_update_inode(trans, root, BTRFS_I(inode));
|
||||
if (ret)
|
||||
btrfs_abort_transaction(trans, ret);
|
||||
|
@ -407,7 +407,7 @@ static int btrfs_xattr_handler_set_prop(const struct xattr_handler *handler,
|
|||
ret = btrfs_set_prop(trans, inode, name, value, size, flags);
|
||||
if (!ret) {
|
||||
inode_inc_iversion(inode);
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
ret = btrfs_update_inode(trans, root, BTRFS_I(inode));
|
||||
if (ret)
|
||||
btrfs_abort_transaction(trans, ret);
|
||||
|
|
|
@ -93,7 +93,7 @@ int ceph_set_acl(struct mnt_idmap *idmap, struct dentry *dentry,
|
|||
char *value = NULL;
|
||||
struct iattr newattrs;
|
||||
struct inode *inode = d_inode(dentry);
|
||||
struct timespec64 old_ctime = inode->i_ctime;
|
||||
struct timespec64 old_ctime = inode_get_ctime(inode);
|
||||
umode_t new_mode = inode->i_mode, old_mode = inode->i_mode;
|
||||
|
||||
if (ceph_snap(inode) != CEPH_NOSNAP) {
|
||||
|
|
|
@ -1400,7 +1400,7 @@ static void __prep_cap(struct cap_msg_args *arg, struct ceph_cap *cap,
|
|||
|
||||
arg->mtime = inode->i_mtime;
|
||||
arg->atime = inode->i_atime;
|
||||
arg->ctime = inode->i_ctime;
|
||||
arg->ctime = inode_get_ctime(inode);
|
||||
arg->btime = ci->i_btime;
|
||||
arg->change_attr = inode_peek_iversion_raw(inode);
|
||||
|
||||
|
|
|
@ -100,7 +100,7 @@ struct inode *ceph_get_snapdir(struct inode *parent)
|
|||
inode->i_uid = parent->i_uid;
|
||||
inode->i_gid = parent->i_gid;
|
||||
inode->i_mtime = parent->i_mtime;
|
||||
inode->i_ctime = parent->i_ctime;
|
||||
inode_set_ctime_to_ts(inode, inode_get_ctime(parent));
|
||||
inode->i_atime = parent->i_atime;
|
||||
ci->i_rbytes = 0;
|
||||
ci->i_btime = ceph_inode(parent)->i_btime;
|
||||
|
@ -688,6 +688,7 @@ void ceph_fill_file_time(struct inode *inode, int issued,
|
|||
struct timespec64 *mtime, struct timespec64 *atime)
|
||||
{
|
||||
struct ceph_inode_info *ci = ceph_inode(inode);
|
||||
struct timespec64 ictime = inode_get_ctime(inode);
|
||||
int warn = 0;
|
||||
|
||||
if (issued & (CEPH_CAP_FILE_EXCL|
|
||||
|
@ -696,11 +697,11 @@ void ceph_fill_file_time(struct inode *inode, int issued,
|
|||
CEPH_CAP_AUTH_EXCL|
|
||||
CEPH_CAP_XATTR_EXCL)) {
|
||||
if (ci->i_version == 0 ||
|
||||
timespec64_compare(ctime, &inode->i_ctime) > 0) {
|
||||
timespec64_compare(ctime, &ictime) > 0) {
|
||||
dout("ctime %lld.%09ld -> %lld.%09ld inc w/ cap\n",
|
||||
inode->i_ctime.tv_sec, inode->i_ctime.tv_nsec,
|
||||
ictime.tv_sec, ictime.tv_nsec,
|
||||
ctime->tv_sec, ctime->tv_nsec);
|
||||
inode->i_ctime = *ctime;
|
||||
inode_set_ctime_to_ts(inode, *ctime);
|
||||
}
|
||||
if (ci->i_version == 0 ||
|
||||
ceph_seq_cmp(time_warp_seq, ci->i_time_warp_seq) > 0) {
|
||||
|
@ -738,7 +739,7 @@ void ceph_fill_file_time(struct inode *inode, int issued,
|
|||
} else {
|
||||
/* we have no write|excl caps; whatever the MDS says is true */
|
||||
if (ceph_seq_cmp(time_warp_seq, ci->i_time_warp_seq) >= 0) {
|
||||
inode->i_ctime = *ctime;
|
||||
inode_set_ctime_to_ts(inode, *ctime);
|
||||
inode->i_mtime = *mtime;
|
||||
inode->i_atime = *atime;
|
||||
ci->i_time_warp_seq = time_warp_seq;
|
||||
|
@ -2166,7 +2167,8 @@ int __ceph_setattr(struct inode *inode, struct iattr *attr)
|
|||
bool only = (ia_valid & (ATTR_SIZE|ATTR_MTIME|ATTR_ATIME|
|
||||
ATTR_MODE|ATTR_UID|ATTR_GID)) == 0;
|
||||
dout("setattr %p ctime %lld.%ld -> %lld.%ld (%s)\n", inode,
|
||||
inode->i_ctime.tv_sec, inode->i_ctime.tv_nsec,
|
||||
inode_get_ctime(inode).tv_sec,
|
||||
inode_get_ctime(inode).tv_nsec,
|
||||
attr->ia_ctime.tv_sec, attr->ia_ctime.tv_nsec,
|
||||
only ? "ctime only" : "ignored");
|
||||
if (only) {
|
||||
|
@ -2191,7 +2193,7 @@ int __ceph_setattr(struct inode *inode, struct iattr *attr)
|
|||
if (dirtied) {
|
||||
inode_dirty_flags = __ceph_mark_dirty_caps(ci, dirtied,
|
||||
&prealloc_cf);
|
||||
inode->i_ctime = attr->ia_ctime;
|
||||
inode_set_ctime_to_ts(inode, attr->ia_ctime);
|
||||
inode_inc_iversion_raw(inode);
|
||||
}
|
||||
|
||||
|
@ -2465,7 +2467,7 @@ int ceph_getattr(struct mnt_idmap *idmap, const struct path *path,
|
|||
return err;
|
||||
}
|
||||
|
||||
generic_fillattr(&nop_mnt_idmap, inode, stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
|
||||
stat->ino = ceph_present_inode(inode);
|
||||
|
||||
/*
|
||||
|
|
|
@ -660,7 +660,7 @@ int __ceph_finish_cap_snap(struct ceph_inode_info *ci,
|
|||
capsnap->size = i_size_read(inode);
|
||||
capsnap->mtime = inode->i_mtime;
|
||||
capsnap->atime = inode->i_atime;
|
||||
capsnap->ctime = inode->i_ctime;
|
||||
capsnap->ctime = inode_get_ctime(inode);
|
||||
capsnap->btime = ci->i_btime;
|
||||
capsnap->change_attr = inode_peek_iversion_raw(inode);
|
||||
capsnap->time_warp_seq = ci->i_time_warp_seq;
|
||||
|
|
|
@ -1238,7 +1238,7 @@ retry:
|
|||
dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL,
|
||||
&prealloc_cf);
|
||||
ci->i_xattrs.dirty = true;
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
}
|
||||
|
||||
spin_unlock(&ci->i_ceph_lock);
|
||||
|
|
|
@ -127,7 +127,8 @@ void coda_vattr_to_iattr(struct inode *inode, struct coda_vattr *attr)
|
|||
if (attr->va_mtime.tv_sec != -1)
|
||||
inode->i_mtime = coda_to_timespec64(attr->va_mtime);
|
||||
if (attr->va_ctime.tv_sec != -1)
|
||||
inode->i_ctime = coda_to_timespec64(attr->va_ctime);
|
||||
inode_set_ctime_to_ts(inode,
|
||||
coda_to_timespec64(attr->va_ctime));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -111,7 +111,7 @@ static inline void coda_dir_update_mtime(struct inode *dir)
|
|||
/* optimistically we can also act as if our nose bleeds. The
|
||||
* granularity of the mtime is coarse anyways so we might actually be
|
||||
* right most of the time. Note: we only do this for directories. */
|
||||
dir->i_mtime = dir->i_ctime = current_time(dir);
|
||||
dir->i_mtime = inode_set_ctime_current(dir);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -84,7 +84,7 @@ coda_file_write_iter(struct kiocb *iocb, struct iov_iter *to)
|
|||
ret = vfs_iter_write(cfi->cfi_container, to, &iocb->ki_pos, 0);
|
||||
coda_inode->i_size = file_inode(host_file)->i_size;
|
||||
coda_inode->i_blocks = (coda_inode->i_size + 511) >> 9;
|
||||
coda_inode->i_mtime = coda_inode->i_ctime = current_time(coda_inode);
|
||||
coda_inode->i_mtime = inode_set_ctime_current(coda_inode);
|
||||
inode_unlock(coda_inode);
|
||||
file_end_write(host_file);
|
||||
|
||||
|
|
|
@ -256,7 +256,8 @@ int coda_getattr(struct mnt_idmap *idmap, const struct path *path,
|
|||
{
|
||||
int err = coda_revalidate_inode(d_inode(path->dentry));
|
||||
if (!err)
|
||||
generic_fillattr(&nop_mnt_idmap, d_inode(path->dentry), stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask,
|
||||
d_inode(path->dentry), stat);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -269,7 +270,7 @@ int coda_setattr(struct mnt_idmap *idmap, struct dentry *de,
|
|||
|
||||
memset(&vattr, 0, sizeof(vattr));
|
||||
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
coda_iattr_to_vattr(iattr, &vattr);
|
||||
vattr.va_type = C_VNON; /* cannot set type */
|
||||
|
||||
|
|
|
@ -88,8 +88,7 @@ int configfs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
|
|||
static inline void set_default_inode_attr(struct inode * inode, umode_t mode)
|
||||
{
|
||||
inode->i_mode = mode;
|
||||
inode->i_atime = inode->i_mtime =
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode->i_atime = inode->i_mtime = inode_set_ctime_current(inode);
|
||||
}
|
||||
|
||||
static inline void set_inode_attr(struct inode * inode, struct iattr * iattr)
|
||||
|
@ -99,7 +98,7 @@ static inline void set_inode_attr(struct inode * inode, struct iattr * iattr)
|
|||
inode->i_gid = iattr->ia_gid;
|
||||
inode->i_atime = iattr->ia_atime;
|
||||
inode->i_mtime = iattr->ia_mtime;
|
||||
inode->i_ctime = iattr->ia_ctime;
|
||||
inode_set_ctime_to_ts(inode, iattr->ia_ctime);
|
||||
}
|
||||
|
||||
struct inode *configfs_new_inode(umode_t mode, struct configfs_dirent *sd,
|
||||
|
@ -172,7 +171,7 @@ struct inode *configfs_create(struct dentry *dentry, umode_t mode)
|
|||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
p_inode = d_inode(dentry->d_parent);
|
||||
p_inode->i_mtime = p_inode->i_ctime = current_time(p_inode);
|
||||
p_inode->i_mtime = inode_set_ctime_current(p_inode);
|
||||
configfs_set_inode_lock_class(sd, inode);
|
||||
return inode;
|
||||
}
|
||||
|
|
|
@ -133,7 +133,8 @@ static struct inode *get_cramfs_inode(struct super_block *sb,
|
|||
}
|
||||
|
||||
/* Struct copy intentional */
|
||||
inode->i_mtime = inode->i_atime = inode->i_ctime = zerotime;
|
||||
inode->i_mtime = inode->i_atime = inode_set_ctime_to_ts(inode,
|
||||
zerotime);
|
||||
/* inode->i_nlink is left 1 - arguably wrong for directories,
|
||||
but it's the best we can do without reading the directory
|
||||
contents. 1 yields the right result in GNU find, even
|
||||
|
|
|
@ -72,8 +72,7 @@ static struct inode *debugfs_get_inode(struct super_block *sb)
|
|||
struct inode *inode = new_inode(sb);
|
||||
if (inode) {
|
||||
inode->i_ino = get_next_ino();
|
||||
inode->i_atime = inode->i_mtime =
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode->i_atime = inode->i_mtime = inode_set_ctime_current(inode);
|
||||
}
|
||||
return inode;
|
||||
}
|
||||
|
|
|
@ -338,7 +338,7 @@ static int mknod_ptmx(struct super_block *sb)
|
|||
}
|
||||
|
||||
inode->i_ino = 2;
|
||||
inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode->i_atime = inode_set_ctime_current(inode);
|
||||
|
||||
mode = S_IFCHR|opts->ptmxmode;
|
||||
init_special_inode(inode, mode, MKDEV(TTYAUX_MAJOR, 2));
|
||||
|
@ -451,7 +451,7 @@ devpts_fill_super(struct super_block *s, void *data, int silent)
|
|||
if (!inode)
|
||||
goto fail;
|
||||
inode->i_ino = 1;
|
||||
inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode->i_atime = inode_set_ctime_current(inode);
|
||||
inode->i_mode = S_IFDIR | S_IRUGO | S_IXUGO | S_IWUSR;
|
||||
inode->i_op = &simple_dir_inode_operations;
|
||||
inode->i_fop = &simple_dir_operations;
|
||||
|
@ -560,7 +560,7 @@ struct dentry *devpts_pty_new(struct pts_fs_info *fsi, int index, void *priv)
|
|||
inode->i_ino = index + 3;
|
||||
inode->i_uid = opts->setuid ? opts->uid : current_fsuid();
|
||||
inode->i_gid = opts->setgid ? opts->gid : current_fsgid();
|
||||
inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode->i_atime = inode_set_ctime_current(inode);
|
||||
init_special_inode(inode, S_IFCHR|opts->mode, MKDEV(UNIX98_PTY_SLAVE_MAJOR, index));
|
||||
|
||||
sprintf(s, "%d", index);
|
||||
|
|
|
@ -148,7 +148,7 @@ static int ecryptfs_do_unlink(struct inode *dir, struct dentry *dentry,
|
|||
}
|
||||
fsstack_copy_attr_times(dir, lower_dir);
|
||||
set_nlink(inode, ecryptfs_inode_to_lower(inode)->i_nlink);
|
||||
inode->i_ctime = dir->i_ctime;
|
||||
inode_set_ctime_to_ts(inode, inode_get_ctime(dir));
|
||||
out_unlock:
|
||||
dput(lower_dentry);
|
||||
inode_unlock(lower_dir);
|
||||
|
@ -982,7 +982,7 @@ static int ecryptfs_getattr_link(struct mnt_idmap *idmap,
|
|||
|
||||
mount_crypt_stat = &ecryptfs_superblock_to_private(
|
||||
dentry->d_sb)->mount_crypt_stat;
|
||||
generic_fillattr(&nop_mnt_idmap, d_inode(dentry), stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, d_inode(dentry), stat);
|
||||
if (mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES) {
|
||||
char *target;
|
||||
size_t targetsiz;
|
||||
|
@ -1011,7 +1011,8 @@ static int ecryptfs_getattr(struct mnt_idmap *idmap,
|
|||
if (!rc) {
|
||||
fsstack_copy_attr_all(d_inode(dentry),
|
||||
ecryptfs_inode_to_lower(d_inode(dentry)));
|
||||
generic_fillattr(&nop_mnt_idmap, d_inode(dentry), stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask,
|
||||
d_inode(dentry), stat);
|
||||
stat->blocks = lower_stat.blocks;
|
||||
}
|
||||
return rc;
|
||||
|
|
|
@ -51,7 +51,7 @@ static ssize_t efivarfs_file_write(struct file *file,
|
|||
} else {
|
||||
inode_lock(inode);
|
||||
i_size_write(inode, datasize + sizeof(attributes));
|
||||
inode->i_mtime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
inode_unlock(inode);
|
||||
}
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ struct inode *efivarfs_get_inode(struct super_block *sb,
|
|||
if (inode) {
|
||||
inode->i_ino = get_next_ino();
|
||||
inode->i_mode = mode;
|
||||
inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_atime = inode->i_mtime = inode_set_ctime_current(inode);
|
||||
inode->i_flags = is_removable ? 0 : S_IMMUTABLE;
|
||||
switch (mode & S_IFMT) {
|
||||
case S_IFREG:
|
||||
|
|
|
@ -105,8 +105,8 @@ struct inode *efs_iget(struct super_block *super, unsigned long ino)
|
|||
inode->i_size = be32_to_cpu(efs_inode->di_size);
|
||||
inode->i_atime.tv_sec = be32_to_cpu(efs_inode->di_atime);
|
||||
inode->i_mtime.tv_sec = be32_to_cpu(efs_inode->di_mtime);
|
||||
inode->i_ctime.tv_sec = be32_to_cpu(efs_inode->di_ctime);
|
||||
inode->i_atime.tv_nsec = inode->i_mtime.tv_nsec = inode->i_ctime.tv_nsec = 0;
|
||||
inode_set_ctime(inode, be32_to_cpu(efs_inode->di_ctime), 0);
|
||||
inode->i_atime.tv_nsec = inode->i_mtime.tv_nsec = 0;
|
||||
|
||||
/* this is the number of blocks in the file */
|
||||
if (inode->i_size == 0) {
|
||||
|
|
|
@ -105,8 +105,8 @@ static void *erofs_read_inode(struct erofs_buf *buf,
|
|||
set_nlink(inode, le32_to_cpu(die->i_nlink));
|
||||
|
||||
/* extended inode has its own timestamp */
|
||||
inode->i_ctime.tv_sec = le64_to_cpu(die->i_mtime);
|
||||
inode->i_ctime.tv_nsec = le32_to_cpu(die->i_mtime_nsec);
|
||||
inode_set_ctime(inode, le64_to_cpu(die->i_mtime),
|
||||
le32_to_cpu(die->i_mtime_nsec));
|
||||
|
||||
inode->i_size = le64_to_cpu(die->i_size);
|
||||
|
||||
|
@ -148,8 +148,7 @@ static void *erofs_read_inode(struct erofs_buf *buf,
|
|||
set_nlink(inode, le16_to_cpu(dic->i_nlink));
|
||||
|
||||
/* use build time for compact inodes */
|
||||
inode->i_ctime.tv_sec = sbi->build_time;
|
||||
inode->i_ctime.tv_nsec = sbi->build_time_nsec;
|
||||
inode_set_ctime(inode, sbi->build_time, sbi->build_time_nsec);
|
||||
|
||||
inode->i_size = le32_to_cpu(dic->i_size);
|
||||
if (erofs_inode_is_data_compressed(vi->datalayout))
|
||||
|
@ -176,10 +175,7 @@ static void *erofs_read_inode(struct erofs_buf *buf,
|
|||
vi->chunkbits = sb->s_blocksize_bits +
|
||||
(vi->chunkformat & EROFS_CHUNK_FORMAT_BLKBITS_MASK);
|
||||
}
|
||||
inode->i_mtime.tv_sec = inode->i_ctime.tv_sec;
|
||||
inode->i_atime.tv_sec = inode->i_ctime.tv_sec;
|
||||
inode->i_mtime.tv_nsec = inode->i_ctime.tv_nsec;
|
||||
inode->i_atime.tv_nsec = inode->i_ctime.tv_nsec;
|
||||
inode->i_mtime = inode->i_atime = inode_get_ctime(inode);
|
||||
|
||||
inode->i_flags &= ~S_DAX;
|
||||
if (test_opt(&sbi->opt, DAX_ALWAYS) && S_ISREG(inode->i_mode) &&
|
||||
|
@ -373,7 +369,7 @@ int erofs_getattr(struct mnt_idmap *idmap, const struct path *path,
|
|||
stat->attributes_mask |= (STATX_ATTR_COMPRESSED |
|
||||
STATX_ATTR_IMMUTABLE);
|
||||
|
||||
generic_fillattr(idmap, inode, stat);
|
||||
generic_fillattr(idmap, request_mask, inode, stat);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ static int exfat_cont_expand(struct inode *inode, loff_t size)
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
inode->i_ctime = inode->i_mtime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
mark_inode_dirty(inode);
|
||||
|
||||
if (!IS_SYNC(inode))
|
||||
|
@ -232,7 +232,7 @@ int exfat_getattr(struct mnt_idmap *idmap, const struct path *path,
|
|||
struct inode *inode = d_backing_inode(path->dentry);
|
||||
struct exfat_inode_info *ei = EXFAT_I(inode);
|
||||
|
||||
generic_fillattr(&nop_mnt_idmap, inode, stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
|
||||
exfat_truncate_atime(&stat->atime);
|
||||
stat->result_mask |= STATX_BTIME;
|
||||
stat->btime.tv_sec = ei->i_crtime.tv_sec;
|
||||
|
@ -290,7 +290,7 @@ int exfat_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
|
|||
}
|
||||
|
||||
if (attr->ia_valid & ATTR_SIZE)
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
|
||||
setattr_copy(&nop_mnt_idmap, inode, attr);
|
||||
exfat_truncate_atime(&inode->i_atime);
|
||||
|
|
|
@ -355,7 +355,7 @@ static void exfat_write_failed(struct address_space *mapping, loff_t to)
|
|||
|
||||
if (to > i_size_read(inode)) {
|
||||
truncate_pagecache(inode, i_size_read(inode));
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
exfat_truncate(inode);
|
||||
}
|
||||
}
|
||||
|
@ -398,7 +398,7 @@ static int exfat_write_end(struct file *file, struct address_space *mapping,
|
|||
exfat_write_failed(mapping, pos+len);
|
||||
|
||||
if (!(err < 0) && !(ei->attr & ATTR_ARCHIVE)) {
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
ei->attr |= ATTR_ARCHIVE;
|
||||
mark_inode_dirty(inode);
|
||||
}
|
||||
|
@ -577,7 +577,7 @@ static int exfat_fill_inode(struct inode *inode, struct exfat_dir_entry *info)
|
|||
|
||||
inode->i_blocks = round_up(i_size_read(inode), sbi->cluster_size) >> 9;
|
||||
inode->i_mtime = info->mtime;
|
||||
inode->i_ctime = info->mtime;
|
||||
inode_set_ctime_to_ts(inode, info->mtime);
|
||||
ei->i_crtime = info->crtime;
|
||||
inode->i_atime = info->atime;
|
||||
|
||||
|
|
|
@ -569,7 +569,7 @@ static int exfat_create(struct mnt_idmap *idmap, struct inode *dir,
|
|||
goto unlock;
|
||||
|
||||
inode_inc_iversion(dir);
|
||||
dir->i_ctime = dir->i_mtime = current_time(dir);
|
||||
dir->i_mtime = inode_set_ctime_current(dir);
|
||||
if (IS_DIRSYNC(dir))
|
||||
exfat_sync_inode(dir);
|
||||
else
|
||||
|
@ -582,8 +582,7 @@ static int exfat_create(struct mnt_idmap *idmap, struct inode *dir,
|
|||
goto unlock;
|
||||
|
||||
inode_inc_iversion(inode);
|
||||
inode->i_mtime = inode->i_atime = inode->i_ctime =
|
||||
EXFAT_I(inode)->i_crtime = current_time(inode);
|
||||
inode->i_mtime = inode->i_atime = EXFAT_I(inode)->i_crtime = inode_set_ctime_current(inode);
|
||||
exfat_truncate_atime(&inode->i_atime);
|
||||
/* timestamp is already written, so mark_inode_dirty() is unneeded. */
|
||||
|
||||
|
@ -817,7 +816,7 @@ static int exfat_unlink(struct inode *dir, struct dentry *dentry)
|
|||
ei->dir.dir = DIR_DELETED;
|
||||
|
||||
inode_inc_iversion(dir);
|
||||
dir->i_mtime = dir->i_atime = current_time(dir);
|
||||
dir->i_mtime = dir->i_atime = inode_set_ctime_current(dir);
|
||||
exfat_truncate_atime(&dir->i_atime);
|
||||
if (IS_DIRSYNC(dir))
|
||||
exfat_sync_inode(dir);
|
||||
|
@ -825,7 +824,7 @@ static int exfat_unlink(struct inode *dir, struct dentry *dentry)
|
|||
mark_inode_dirty(dir);
|
||||
|
||||
clear_nlink(inode);
|
||||
inode->i_mtime = inode->i_atime = current_time(inode);
|
||||
inode->i_mtime = inode->i_atime = inode_set_ctime_current(inode);
|
||||
exfat_truncate_atime(&inode->i_atime);
|
||||
exfat_unhash_inode(inode);
|
||||
exfat_d_version_set(dentry, inode_query_iversion(dir));
|
||||
|
@ -852,7 +851,7 @@ static int exfat_mkdir(struct mnt_idmap *idmap, struct inode *dir,
|
|||
goto unlock;
|
||||
|
||||
inode_inc_iversion(dir);
|
||||
dir->i_ctime = dir->i_mtime = current_time(dir);
|
||||
dir->i_mtime = inode_set_ctime_current(dir);
|
||||
if (IS_DIRSYNC(dir))
|
||||
exfat_sync_inode(dir);
|
||||
else
|
||||
|
@ -866,8 +865,7 @@ static int exfat_mkdir(struct mnt_idmap *idmap, struct inode *dir,
|
|||
goto unlock;
|
||||
|
||||
inode_inc_iversion(inode);
|
||||
inode->i_mtime = inode->i_atime = inode->i_ctime =
|
||||
EXFAT_I(inode)->i_crtime = current_time(inode);
|
||||
inode->i_mtime = inode->i_atime = EXFAT_I(inode)->i_crtime = inode_set_ctime_current(inode);
|
||||
exfat_truncate_atime(&inode->i_atime);
|
||||
/* timestamp is already written, so mark_inode_dirty() is unneeded. */
|
||||
|
||||
|
@ -979,7 +977,7 @@ static int exfat_rmdir(struct inode *dir, struct dentry *dentry)
|
|||
ei->dir.dir = DIR_DELETED;
|
||||
|
||||
inode_inc_iversion(dir);
|
||||
dir->i_mtime = dir->i_atime = current_time(dir);
|
||||
dir->i_mtime = dir->i_atime = inode_set_ctime_current(dir);
|
||||
exfat_truncate_atime(&dir->i_atime);
|
||||
if (IS_DIRSYNC(dir))
|
||||
exfat_sync_inode(dir);
|
||||
|
@ -988,7 +986,7 @@ static int exfat_rmdir(struct inode *dir, struct dentry *dentry)
|
|||
drop_nlink(dir);
|
||||
|
||||
clear_nlink(inode);
|
||||
inode->i_mtime = inode->i_atime = current_time(inode);
|
||||
inode->i_mtime = inode->i_atime = inode_set_ctime_current(inode);
|
||||
exfat_truncate_atime(&inode->i_atime);
|
||||
exfat_unhash_inode(inode);
|
||||
exfat_d_version_set(dentry, inode_query_iversion(dir));
|
||||
|
@ -1312,8 +1310,8 @@ static int exfat_rename(struct mnt_idmap *idmap,
|
|||
goto unlock;
|
||||
|
||||
inode_inc_iversion(new_dir);
|
||||
new_dir->i_ctime = new_dir->i_mtime = new_dir->i_atime =
|
||||
EXFAT_I(new_dir)->i_crtime = current_time(new_dir);
|
||||
simple_rename_timestamp(old_dir, old_dentry, new_dir, new_dentry);
|
||||
EXFAT_I(new_dir)->i_crtime = current_time(new_dir);
|
||||
exfat_truncate_atime(&new_dir->i_atime);
|
||||
if (IS_DIRSYNC(new_dir))
|
||||
exfat_sync_inode(new_dir);
|
||||
|
@ -1336,7 +1334,6 @@ static int exfat_rename(struct mnt_idmap *idmap,
|
|||
}
|
||||
|
||||
inode_inc_iversion(old_dir);
|
||||
old_dir->i_ctime = old_dir->i_mtime = current_time(old_dir);
|
||||
if (IS_DIRSYNC(old_dir))
|
||||
exfat_sync_inode(old_dir);
|
||||
else
|
||||
|
@ -1354,8 +1351,7 @@ static int exfat_rename(struct mnt_idmap *idmap,
|
|||
exfat_warn(sb, "abnormal access to an inode dropped");
|
||||
WARN_ON(new_inode->i_nlink == 0);
|
||||
}
|
||||
new_inode->i_ctime = EXFAT_I(new_inode)->i_crtime =
|
||||
current_time(new_inode);
|
||||
EXFAT_I(new_inode)->i_crtime = current_time(new_inode);
|
||||
}
|
||||
|
||||
unlock:
|
||||
|
|
|
@ -379,8 +379,7 @@ static int exfat_read_root(struct inode *inode)
|
|||
ei->i_size_ondisk = i_size_read(inode);
|
||||
|
||||
exfat_save_attr(inode, ATTR_SUBDIR);
|
||||
inode->i_mtime = inode->i_atime = inode->i_ctime = ei->i_crtime =
|
||||
current_time(inode);
|
||||
inode->i_mtime = inode->i_atime = ei->i_crtime = inode_set_ctime_current(inode);
|
||||
exfat_truncate_atime(&inode->i_atime);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -237,7 +237,7 @@ ext2_set_acl(struct mnt_idmap *idmap, struct dentry *dentry,
|
|||
error = __ext2_set_acl(inode, acl, type);
|
||||
if (!error && update_mode) {
|
||||
inode->i_mode = mode;
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
mark_inode_dirty(inode);
|
||||
}
|
||||
return error;
|
||||
|
|
|
@ -468,7 +468,7 @@ int ext2_set_link(struct inode *dir, struct ext2_dir_entry_2 *de,
|
|||
ext2_set_de_type(de, inode);
|
||||
ext2_commit_chunk(page, pos, len);
|
||||
if (update_times)
|
||||
dir->i_mtime = dir->i_ctime = current_time(dir);
|
||||
dir->i_mtime = inode_set_ctime_current(dir);
|
||||
EXT2_I(dir)->i_flags &= ~EXT2_BTREE_FL;
|
||||
mark_inode_dirty(dir);
|
||||
return ext2_handle_dirsync(dir);
|
||||
|
@ -555,7 +555,7 @@ got_it:
|
|||
de->inode = cpu_to_le32(inode->i_ino);
|
||||
ext2_set_de_type (de, inode);
|
||||
ext2_commit_chunk(page, pos, rec_len);
|
||||
dir->i_mtime = dir->i_ctime = current_time(dir);
|
||||
dir->i_mtime = inode_set_ctime_current(dir);
|
||||
EXT2_I(dir)->i_flags &= ~EXT2_BTREE_FL;
|
||||
mark_inode_dirty(dir);
|
||||
err = ext2_handle_dirsync(dir);
|
||||
|
@ -606,7 +606,7 @@ int ext2_delete_entry(struct ext2_dir_entry_2 *dir, struct page *page)
|
|||
pde->rec_len = ext2_rec_len_to_disk(to - from);
|
||||
dir->inode = 0;
|
||||
ext2_commit_chunk(page, pos, to - from);
|
||||
inode->i_ctime = inode->i_mtime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
EXT2_I(inode)->i_flags &= ~EXT2_BTREE_FL;
|
||||
mark_inode_dirty(inode);
|
||||
return ext2_handle_dirsync(inode);
|
||||
|
|
|
@ -549,7 +549,7 @@ got:
|
|||
|
||||
inode->i_ino = ino;
|
||||
inode->i_blocks = 0;
|
||||
inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode->i_atime = inode_set_ctime_current(inode);
|
||||
memset(ei->i_data, 0, sizeof(ei->i_data));
|
||||
ei->i_flags =
|
||||
ext2_mask_flags(mode, EXT2_I(dir)->i_flags & EXT2_FL_INHERITED);
|
||||
|
|
|
@ -595,7 +595,7 @@ static void ext2_splice_branch(struct inode *inode,
|
|||
if (where->bh)
|
||||
mark_buffer_dirty_inode(where->bh, inode);
|
||||
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
mark_inode_dirty(inode);
|
||||
}
|
||||
|
||||
|
@ -1287,7 +1287,7 @@ static int ext2_setsize(struct inode *inode, loff_t newsize)
|
|||
__ext2_truncate_blocks(inode, newsize);
|
||||
filemap_invalidate_unlock(inode->i_mapping);
|
||||
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
if (inode_needs_sync(inode)) {
|
||||
sync_mapping_buffers(inode->i_mapping);
|
||||
sync_inode_metadata(inode, 1);
|
||||
|
@ -1409,9 +1409,9 @@ struct inode *ext2_iget (struct super_block *sb, unsigned long ino)
|
|||
set_nlink(inode, le16_to_cpu(raw_inode->i_links_count));
|
||||
inode->i_size = le32_to_cpu(raw_inode->i_size);
|
||||
inode->i_atime.tv_sec = (signed)le32_to_cpu(raw_inode->i_atime);
|
||||
inode->i_ctime.tv_sec = (signed)le32_to_cpu(raw_inode->i_ctime);
|
||||
inode_set_ctime(inode, (signed)le32_to_cpu(raw_inode->i_ctime), 0);
|
||||
inode->i_mtime.tv_sec = (signed)le32_to_cpu(raw_inode->i_mtime);
|
||||
inode->i_atime.tv_nsec = inode->i_mtime.tv_nsec = inode->i_ctime.tv_nsec = 0;
|
||||
inode->i_atime.tv_nsec = inode->i_mtime.tv_nsec = 0;
|
||||
ei->i_dtime = le32_to_cpu(raw_inode->i_dtime);
|
||||
/* We now have enough fields to check if the inode was active or not.
|
||||
* This is needed because nfsd might try to access dead inodes
|
||||
|
@ -1541,7 +1541,7 @@ static int __ext2_write_inode(struct inode *inode, int do_sync)
|
|||
raw_inode->i_links_count = cpu_to_le16(inode->i_nlink);
|
||||
raw_inode->i_size = cpu_to_le32(inode->i_size);
|
||||
raw_inode->i_atime = cpu_to_le32(inode->i_atime.tv_sec);
|
||||
raw_inode->i_ctime = cpu_to_le32(inode->i_ctime.tv_sec);
|
||||
raw_inode->i_ctime = cpu_to_le32(inode_get_ctime(inode).tv_sec);
|
||||
raw_inode->i_mtime = cpu_to_le32(inode->i_mtime.tv_sec);
|
||||
|
||||
raw_inode->i_blocks = cpu_to_le32(inode->i_blocks);
|
||||
|
@ -1628,7 +1628,7 @@ int ext2_getattr(struct mnt_idmap *idmap, const struct path *path,
|
|||
STATX_ATTR_IMMUTABLE |
|
||||
STATX_ATTR_NODUMP);
|
||||
|
||||
generic_fillattr(&nop_mnt_idmap, inode, stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -44,7 +44,7 @@ int ext2_fileattr_set(struct mnt_idmap *idmap,
|
|||
(fa->flags & EXT2_FL_USER_MODIFIABLE);
|
||||
|
||||
ext2_set_inode_flags(inode);
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
mark_inode_dirty(inode);
|
||||
|
||||
return 0;
|
||||
|
@ -77,7 +77,7 @@ long ext2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|||
}
|
||||
|
||||
inode_lock(inode);
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
inode->i_generation = generation;
|
||||
inode_unlock(inode);
|
||||
|
||||
|
|
|
@ -211,7 +211,7 @@ static int ext2_link (struct dentry * old_dentry, struct inode * dir,
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
inode_inc_link_count(inode);
|
||||
ihold(inode);
|
||||
|
||||
|
@ -291,7 +291,7 @@ static int ext2_unlink(struct inode *dir, struct dentry *dentry)
|
|||
if (err)
|
||||
goto out;
|
||||
|
||||
inode->i_ctime = dir->i_ctime;
|
||||
inode_set_ctime_to_ts(inode, inode_get_ctime(dir));
|
||||
inode_dec_link_count(inode);
|
||||
err = 0;
|
||||
out:
|
||||
|
@ -367,7 +367,7 @@ static int ext2_rename (struct mnt_idmap * idmap,
|
|||
ext2_put_page(new_page, new_de);
|
||||
if (err)
|
||||
goto out_dir;
|
||||
new_inode->i_ctime = current_time(new_inode);
|
||||
inode_set_ctime_current(new_inode);
|
||||
if (dir_de)
|
||||
drop_nlink(new_inode);
|
||||
inode_dec_link_count(new_inode);
|
||||
|
@ -383,7 +383,7 @@ static int ext2_rename (struct mnt_idmap * idmap,
|
|||
* Like most other Unix systems, set the ctime for inodes on a
|
||||
* rename.
|
||||
*/
|
||||
old_inode->i_ctime = current_time(old_inode);
|
||||
inode_set_ctime_current(old_inode);
|
||||
mark_inode_dirty(old_inode);
|
||||
|
||||
err = ext2_delete_entry(old_de, old_page);
|
||||
|
|
|
@ -1572,7 +1572,7 @@ out:
|
|||
if (inode->i_size < off+len-towrite)
|
||||
i_size_write(inode, off+len-towrite);
|
||||
inode_inc_iversion(inode);
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
mark_inode_dirty(inode);
|
||||
return len - towrite;
|
||||
}
|
||||
|
|
|
@ -773,7 +773,7 @@ ext2_xattr_set2(struct inode *inode, struct buffer_head *old_bh,
|
|||
|
||||
/* Update the inode. */
|
||||
EXT2_I(inode)->i_file_acl = new_bh ? new_bh->b_blocknr : 0;
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
if (IS_SYNC(inode)) {
|
||||
error = sync_inode_metadata(inode, 1);
|
||||
/* In case sync failed due to ENOSPC the inode was actually
|
||||
|
|
|
@ -259,7 +259,7 @@ retry:
|
|||
error = __ext4_set_acl(handle, inode, type, acl, 0 /* xattr_flags */);
|
||||
if (!error && update_mode) {
|
||||
inode->i_mode = mode;
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
error = ext4_mark_inode_dirty(handle, inode);
|
||||
}
|
||||
out_stop:
|
||||
|
|
|
@ -868,64 +868,70 @@ struct ext4_inode {
|
|||
* affected filesystem before 2242.
|
||||
*/
|
||||
|
||||
static inline __le32 ext4_encode_extra_time(struct timespec64 *time)
|
||||
static inline __le32 ext4_encode_extra_time(struct timespec64 ts)
|
||||
{
|
||||
u32 extra =((time->tv_sec - (s32)time->tv_sec) >> 32) & EXT4_EPOCH_MASK;
|
||||
return cpu_to_le32(extra | (time->tv_nsec << EXT4_EPOCH_BITS));
|
||||
u32 extra = ((ts.tv_sec - (s32)ts.tv_sec) >> 32) & EXT4_EPOCH_MASK;
|
||||
return cpu_to_le32(extra | (ts.tv_nsec << EXT4_EPOCH_BITS));
|
||||
}
|
||||
|
||||
static inline void ext4_decode_extra_time(struct timespec64 *time,
|
||||
__le32 extra)
|
||||
static inline struct timespec64 ext4_decode_extra_time(__le32 base,
|
||||
__le32 extra)
|
||||
{
|
||||
struct timespec64 ts = { .tv_sec = (signed)le32_to_cpu(base) };
|
||||
|
||||
if (unlikely(extra & cpu_to_le32(EXT4_EPOCH_MASK)))
|
||||
time->tv_sec += (u64)(le32_to_cpu(extra) & EXT4_EPOCH_MASK) << 32;
|
||||
time->tv_nsec = (le32_to_cpu(extra) & EXT4_NSEC_MASK) >> EXT4_EPOCH_BITS;
|
||||
ts.tv_sec += (u64)(le32_to_cpu(extra) & EXT4_EPOCH_MASK) << 32;
|
||||
ts.tv_nsec = (le32_to_cpu(extra) & EXT4_NSEC_MASK) >> EXT4_EPOCH_BITS;
|
||||
return ts;
|
||||
}
|
||||
|
||||
#define EXT4_INODE_SET_XTIME_VAL(xtime, inode, raw_inode, ts) \
|
||||
do { \
|
||||
if (EXT4_FITS_IN_INODE(raw_inode, EXT4_I(inode), xtime ## _extra)) { \
|
||||
(raw_inode)->xtime = cpu_to_le32((ts).tv_sec); \
|
||||
(raw_inode)->xtime ## _extra = ext4_encode_extra_time(ts); \
|
||||
} else \
|
||||
(raw_inode)->xtime = cpu_to_le32(clamp_t(int32_t, (ts).tv_sec, S32_MIN, S32_MAX)); \
|
||||
} while (0)
|
||||
|
||||
#define EXT4_INODE_SET_XTIME(xtime, inode, raw_inode) \
|
||||
do { \
|
||||
if (EXT4_FITS_IN_INODE(raw_inode, EXT4_I(inode), xtime ## _extra)) {\
|
||||
(raw_inode)->xtime = cpu_to_le32((inode)->xtime.tv_sec); \
|
||||
(raw_inode)->xtime ## _extra = \
|
||||
ext4_encode_extra_time(&(inode)->xtime); \
|
||||
} \
|
||||
else \
|
||||
(raw_inode)->xtime = cpu_to_le32(clamp_t(int32_t, (inode)->xtime.tv_sec, S32_MIN, S32_MAX)); \
|
||||
} while (0)
|
||||
EXT4_INODE_SET_XTIME_VAL(xtime, inode, raw_inode, (inode)->xtime)
|
||||
|
||||
#define EXT4_EINODE_SET_XTIME(xtime, einode, raw_inode) \
|
||||
do { \
|
||||
if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime)) \
|
||||
(raw_inode)->xtime = cpu_to_le32((einode)->xtime.tv_sec); \
|
||||
if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime ## _extra)) \
|
||||
(raw_inode)->xtime ## _extra = \
|
||||
ext4_encode_extra_time(&(einode)->xtime); \
|
||||
} while (0)
|
||||
#define EXT4_INODE_SET_CTIME(inode, raw_inode) \
|
||||
EXT4_INODE_SET_XTIME_VAL(i_ctime, inode, raw_inode, inode_get_ctime(inode))
|
||||
|
||||
#define EXT4_EINODE_SET_XTIME(xtime, einode, raw_inode) \
|
||||
if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime)) \
|
||||
EXT4_INODE_SET_XTIME_VAL(xtime, &((einode)->vfs_inode), \
|
||||
raw_inode, (einode)->xtime)
|
||||
|
||||
#define EXT4_INODE_GET_XTIME_VAL(xtime, inode, raw_inode) \
|
||||
(EXT4_FITS_IN_INODE(raw_inode, EXT4_I(inode), xtime ## _extra) ? \
|
||||
ext4_decode_extra_time((raw_inode)->xtime, \
|
||||
(raw_inode)->xtime ## _extra) : \
|
||||
(struct timespec64) { \
|
||||
.tv_sec = (signed)le32_to_cpu((raw_inode)->xtime) \
|
||||
})
|
||||
|
||||
#define EXT4_INODE_GET_XTIME(xtime, inode, raw_inode) \
|
||||
do { \
|
||||
(inode)->xtime.tv_sec = (signed)le32_to_cpu((raw_inode)->xtime); \
|
||||
if (EXT4_FITS_IN_INODE(raw_inode, EXT4_I(inode), xtime ## _extra)) { \
|
||||
ext4_decode_extra_time(&(inode)->xtime, \
|
||||
raw_inode->xtime ## _extra); \
|
||||
} \
|
||||
else \
|
||||
(inode)->xtime.tv_nsec = 0; \
|
||||
(inode)->xtime = EXT4_INODE_GET_XTIME_VAL(xtime, inode, raw_inode); \
|
||||
} while (0)
|
||||
|
||||
#define EXT4_INODE_GET_CTIME(inode, raw_inode) \
|
||||
do { \
|
||||
inode_set_ctime_to_ts(inode, \
|
||||
EXT4_INODE_GET_XTIME_VAL(i_ctime, inode, raw_inode)); \
|
||||
} while (0)
|
||||
|
||||
#define EXT4_EINODE_GET_XTIME(xtime, einode, raw_inode) \
|
||||
do { \
|
||||
if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime)) \
|
||||
(einode)->xtime.tv_sec = \
|
||||
(signed)le32_to_cpu((raw_inode)->xtime); \
|
||||
else \
|
||||
(einode)->xtime.tv_sec = 0; \
|
||||
if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime ## _extra)) \
|
||||
ext4_decode_extra_time(&(einode)->xtime, \
|
||||
raw_inode->xtime ## _extra); \
|
||||
else \
|
||||
(einode)->xtime.tv_nsec = 0; \
|
||||
#define EXT4_EINODE_GET_XTIME(xtime, einode, raw_inode) \
|
||||
do { \
|
||||
if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime)) \
|
||||
(einode)->xtime = \
|
||||
EXT4_INODE_GET_XTIME_VAL(xtime, &(einode->vfs_inode), \
|
||||
raw_inode); \
|
||||
else \
|
||||
(einode)->xtime = (struct timespec64){0, 0}; \
|
||||
} while (0)
|
||||
|
||||
#define i_disk_version osd1.linux1.l_i_version
|
||||
|
|
|
@ -4476,12 +4476,12 @@ retry:
|
|||
map.m_lblk += ret;
|
||||
map.m_len = len = len - ret;
|
||||
epos = (loff_t)map.m_lblk << inode->i_blkbits;
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
if (new_size) {
|
||||
if (epos > new_size)
|
||||
epos = new_size;
|
||||
if (ext4_update_inode_size(inode, epos) & 0x1)
|
||||
inode->i_mtime = inode->i_ctime;
|
||||
inode->i_mtime = inode_get_ctime(inode);
|
||||
}
|
||||
ret2 = ext4_mark_inode_dirty(handle, inode);
|
||||
ext4_update_inode_fsync_trans(handle, inode, 1);
|
||||
|
@ -4617,7 +4617,7 @@ static long ext4_zero_range(struct file *file, loff_t offset,
|
|||
|
||||
/* Now release the pages and zero block aligned part of pages */
|
||||
truncate_pagecache_range(inode, start, end - 1);
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
|
||||
ret = ext4_alloc_file_blocks(file, lblk, max_blocks, new_size,
|
||||
flags);
|
||||
|
@ -4642,7 +4642,7 @@ static long ext4_zero_range(struct file *file, loff_t offset,
|
|||
goto out_mutex;
|
||||
}
|
||||
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
if (new_size)
|
||||
ext4_update_inode_size(inode, new_size);
|
||||
ret = ext4_mark_inode_dirty(handle, inode);
|
||||
|
@ -5378,7 +5378,7 @@ static int ext4_collapse_range(struct file *file, loff_t offset, loff_t len)
|
|||
up_write(&EXT4_I(inode)->i_data_sem);
|
||||
if (IS_SYNC(inode))
|
||||
ext4_handle_sync(handle);
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
ret = ext4_mark_inode_dirty(handle, inode);
|
||||
ext4_update_inode_fsync_trans(handle, inode, 1);
|
||||
|
||||
|
@ -5488,7 +5488,7 @@ static int ext4_insert_range(struct file *file, loff_t offset, loff_t len)
|
|||
/* Expand file to avoid data loss if there is error while shifting */
|
||||
inode->i_size += len;
|
||||
EXT4_I(inode)->i_disksize += len;
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
ret = ext4_mark_inode_dirty(handle, inode);
|
||||
if (ret)
|
||||
goto out_stop;
|
||||
|
|
|
@ -1250,7 +1250,7 @@ got:
|
|||
inode->i_ino = ino + group * EXT4_INODES_PER_GROUP(sb);
|
||||
/* This is the optimal IO size (for stat), not the fs block size */
|
||||
inode->i_blocks = 0;
|
||||
inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode->i_atime = inode_set_ctime_current(inode);
|
||||
ei->i_crtime = inode->i_mtime;
|
||||
|
||||
memset(ei->i_data, 0, sizeof(ei->i_data));
|
||||
|
|
|
@ -1037,7 +1037,7 @@ static int ext4_add_dirent_to_inline(handle_t *handle,
|
|||
* happen is that the times are slightly out of date
|
||||
* and/or different from the directory change time.
|
||||
*/
|
||||
dir->i_mtime = dir->i_ctime = current_time(dir);
|
||||
dir->i_mtime = inode_set_ctime_current(dir);
|
||||
ext4_update_dx_flag(dir);
|
||||
inode_inc_iversion(dir);
|
||||
return 1;
|
||||
|
@ -1991,7 +1991,7 @@ out:
|
|||
ext4_orphan_del(handle, inode);
|
||||
|
||||
if (err == 0) {
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
err = ext4_mark_inode_dirty(handle, inode);
|
||||
if (IS_SYNC(inode))
|
||||
ext4_handle_sync(handle);
|
||||
|
|
|
@ -245,9 +245,9 @@ static void inode_test_xtimestamp_decoding(struct kunit *test)
|
|||
struct timestamp_expectation *test_param =
|
||||
(struct timestamp_expectation *)(test->param_value);
|
||||
|
||||
timestamp.tv_sec = get_32bit_time(test_param);
|
||||
ext4_decode_extra_time(×tamp,
|
||||
cpu_to_le32(test_param->extra_bits));
|
||||
timestamp = ext4_decode_extra_time(
|
||||
cpu_to_le32(get_32bit_time(test_param)),
|
||||
cpu_to_le32(test_param->extra_bits));
|
||||
|
||||
KUNIT_EXPECT_EQ_MSG(test,
|
||||
test_param->expected.tv_sec,
|
||||
|
|
|
@ -3986,7 +3986,7 @@ int ext4_punch_hole(struct file *file, loff_t offset, loff_t length)
|
|||
if (IS_SYNC(inode))
|
||||
ext4_handle_sync(handle);
|
||||
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
ret2 = ext4_mark_inode_dirty(handle, inode);
|
||||
if (unlikely(ret2))
|
||||
ret = ret2;
|
||||
|
@ -4146,7 +4146,7 @@ out_stop:
|
|||
if (inode->i_nlink)
|
||||
ext4_orphan_del(handle, inode);
|
||||
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
err2 = ext4_mark_inode_dirty(handle, inode);
|
||||
if (unlikely(err2 && !err))
|
||||
err = err2;
|
||||
|
@ -4249,7 +4249,7 @@ static int ext4_fill_raw_inode(struct inode *inode, struct ext4_inode *raw_inode
|
|||
}
|
||||
raw_inode->i_links_count = cpu_to_le16(inode->i_nlink);
|
||||
|
||||
EXT4_INODE_SET_XTIME(i_ctime, inode, raw_inode);
|
||||
EXT4_INODE_SET_CTIME(inode, raw_inode);
|
||||
EXT4_INODE_SET_XTIME(i_mtime, inode, raw_inode);
|
||||
EXT4_INODE_SET_XTIME(i_atime, inode, raw_inode);
|
||||
EXT4_EINODE_SET_XTIME(i_crtime, ei, raw_inode);
|
||||
|
@ -4858,7 +4858,7 @@ struct inode *__ext4_iget(struct super_block *sb, unsigned long ino,
|
|||
}
|
||||
}
|
||||
|
||||
EXT4_INODE_GET_XTIME(i_ctime, inode, raw_inode);
|
||||
EXT4_INODE_GET_CTIME(inode, raw_inode);
|
||||
EXT4_INODE_GET_XTIME(i_mtime, inode, raw_inode);
|
||||
EXT4_INODE_GET_XTIME(i_atime, inode, raw_inode);
|
||||
EXT4_EINODE_GET_XTIME(i_crtime, ei, raw_inode);
|
||||
|
@ -4981,7 +4981,7 @@ static void __ext4_update_other_inode_time(struct super_block *sb,
|
|||
spin_unlock(&inode->i_lock);
|
||||
|
||||
spin_lock(&ei->i_raw_lock);
|
||||
EXT4_INODE_SET_XTIME(i_ctime, inode, raw_inode);
|
||||
EXT4_INODE_SET_CTIME(inode, raw_inode);
|
||||
EXT4_INODE_SET_XTIME(i_mtime, inode, raw_inode);
|
||||
EXT4_INODE_SET_XTIME(i_atime, inode, raw_inode);
|
||||
ext4_inode_csum_set(inode, raw_inode, ei);
|
||||
|
@ -5376,10 +5376,8 @@ int ext4_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
|
|||
* Update c/mtime on truncate up, ext4_truncate() will
|
||||
* update c/mtime in shrink case below
|
||||
*/
|
||||
if (!shrink) {
|
||||
inode->i_mtime = current_time(inode);
|
||||
inode->i_ctime = inode->i_mtime;
|
||||
}
|
||||
if (!shrink)
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
|
||||
if (shrink)
|
||||
ext4_fc_track_range(handle, inode,
|
||||
|
@ -5537,7 +5535,7 @@ int ext4_getattr(struct mnt_idmap *idmap, const struct path *path,
|
|||
STATX_ATTR_NODUMP |
|
||||
STATX_ATTR_VERITY);
|
||||
|
||||
generic_fillattr(idmap, inode, stat);
|
||||
generic_fillattr(idmap, request_mask, inode, stat);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -449,7 +449,8 @@ static long swap_inode_boot_loader(struct super_block *sb,
|
|||
diff = size - size_bl;
|
||||
swap_inode_data(inode, inode_bl);
|
||||
|
||||
inode->i_ctime = inode_bl->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
inode_set_ctime_current(inode_bl);
|
||||
inode_inc_iversion(inode);
|
||||
|
||||
inode->i_generation = get_random_u32();
|
||||
|
@ -663,7 +664,7 @@ static int ext4_ioctl_setflags(struct inode *inode,
|
|||
|
||||
ext4_set_inode_flags(inode, false);
|
||||
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
inode_inc_iversion(inode);
|
||||
|
||||
err = ext4_mark_iloc_dirty(handle, inode, &iloc);
|
||||
|
@ -774,7 +775,7 @@ static int ext4_ioctl_setproject(struct inode *inode, __u32 projid)
|
|||
}
|
||||
|
||||
EXT4_I(inode)->i_projid = kprojid;
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
inode_inc_iversion(inode);
|
||||
out_dirty:
|
||||
rc = ext4_mark_iloc_dirty(handle, inode, &iloc);
|
||||
|
@ -1266,7 +1267,7 @@ static long __ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|||
}
|
||||
err = ext4_reserve_inode_write(handle, inode, &iloc);
|
||||
if (err == 0) {
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
inode_inc_iversion(inode);
|
||||
inode->i_generation = generation;
|
||||
err = ext4_mark_iloc_dirty(handle, inode, &iloc);
|
||||
|
|
|
@ -2203,7 +2203,7 @@ static int add_dirent_to_buf(handle_t *handle, struct ext4_filename *fname,
|
|||
* happen is that the times are slightly out of date
|
||||
* and/or different from the directory change time.
|
||||
*/
|
||||
dir->i_mtime = dir->i_ctime = current_time(dir);
|
||||
dir->i_mtime = inode_set_ctime_current(dir);
|
||||
ext4_update_dx_flag(dir);
|
||||
inode_inc_iversion(dir);
|
||||
err2 = ext4_mark_inode_dirty(handle, dir);
|
||||
|
@ -3197,7 +3197,8 @@ static int ext4_rmdir(struct inode *dir, struct dentry *dentry)
|
|||
* recovery. */
|
||||
inode->i_size = 0;
|
||||
ext4_orphan_add(handle, inode);
|
||||
inode->i_ctime = dir->i_ctime = dir->i_mtime = current_time(inode);
|
||||
dir->i_mtime = inode_set_ctime_current(dir);
|
||||
inode_set_ctime_current(inode);
|
||||
retval = ext4_mark_inode_dirty(handle, inode);
|
||||
if (retval)
|
||||
goto end_rmdir;
|
||||
|
@ -3271,7 +3272,7 @@ int __ext4_unlink(struct inode *dir, const struct qstr *d_name,
|
|||
retval = ext4_delete_entry(handle, dir, de, bh);
|
||||
if (retval)
|
||||
goto out_handle;
|
||||
dir->i_ctime = dir->i_mtime = current_time(dir);
|
||||
dir->i_mtime = inode_set_ctime_current(dir);
|
||||
ext4_update_dx_flag(dir);
|
||||
retval = ext4_mark_inode_dirty(handle, dir);
|
||||
if (retval)
|
||||
|
@ -3286,7 +3287,7 @@ int __ext4_unlink(struct inode *dir, const struct qstr *d_name,
|
|||
drop_nlink(inode);
|
||||
if (!inode->i_nlink)
|
||||
ext4_orphan_add(handle, inode);
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
retval = ext4_mark_inode_dirty(handle, inode);
|
||||
if (dentry && !retval)
|
||||
ext4_fc_track_unlink(handle, dentry);
|
||||
|
@ -3463,7 +3464,7 @@ retry:
|
|||
if (IS_DIRSYNC(dir))
|
||||
ext4_handle_sync(handle);
|
||||
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
ext4_inc_count(inode);
|
||||
ihold(inode);
|
||||
|
||||
|
@ -3641,8 +3642,7 @@ static int ext4_setent(handle_t *handle, struct ext4_renament *ent,
|
|||
if (ext4_has_feature_filetype(ent->dir->i_sb))
|
||||
ent->de->file_type = file_type;
|
||||
inode_inc_iversion(ent->dir);
|
||||
ent->dir->i_ctime = ent->dir->i_mtime =
|
||||
current_time(ent->dir);
|
||||
ent->dir->i_mtime = inode_set_ctime_current(ent->dir);
|
||||
retval = ext4_mark_inode_dirty(handle, ent->dir);
|
||||
BUFFER_TRACE(ent->bh, "call ext4_handle_dirty_metadata");
|
||||
if (!ent->inlined) {
|
||||
|
@ -3941,7 +3941,7 @@ static int ext4_rename(struct mnt_idmap *idmap, struct inode *old_dir,
|
|||
* Like most other Unix systems, set the ctime for inodes on a
|
||||
* rename.
|
||||
*/
|
||||
old.inode->i_ctime = current_time(old.inode);
|
||||
inode_set_ctime_current(old.inode);
|
||||
retval = ext4_mark_inode_dirty(handle, old.inode);
|
||||
if (unlikely(retval))
|
||||
goto end_rename;
|
||||
|
@ -3955,9 +3955,9 @@ static int ext4_rename(struct mnt_idmap *idmap, struct inode *old_dir,
|
|||
|
||||
if (new.inode) {
|
||||
ext4_dec_count(new.inode);
|
||||
new.inode->i_ctime = current_time(new.inode);
|
||||
inode_set_ctime_current(new.inode);
|
||||
}
|
||||
old.dir->i_ctime = old.dir->i_mtime = current_time(old.dir);
|
||||
old.dir->i_mtime = inode_set_ctime_current(old.dir);
|
||||
ext4_update_dx_flag(old.dir);
|
||||
if (old.dir_bh) {
|
||||
retval = ext4_rename_dir_finish(handle, &old, new.dir->i_ino);
|
||||
|
@ -4053,7 +4053,6 @@ static int ext4_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
|
|||
};
|
||||
u8 new_file_type;
|
||||
int retval;
|
||||
struct timespec64 ctime;
|
||||
|
||||
if ((ext4_test_inode_flag(new_dir, EXT4_INODE_PROJINHERIT) &&
|
||||
!projid_eq(EXT4_I(new_dir)->i_projid,
|
||||
|
@ -4147,9 +4146,8 @@ static int ext4_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
|
|||
* Like most other Unix systems, set the ctime for inodes on a
|
||||
* rename.
|
||||
*/
|
||||
ctime = current_time(old.inode);
|
||||
old.inode->i_ctime = ctime;
|
||||
new.inode->i_ctime = ctime;
|
||||
inode_set_ctime_current(old.inode);
|
||||
inode_set_ctime_current(new.inode);
|
||||
retval = ext4_mark_inode_dirty(handle, old.inode);
|
||||
if (unlikely(retval))
|
||||
goto end_rename;
|
||||
|
|
|
@ -7103,7 +7103,7 @@ static int ext4_quota_off(struct super_block *sb, int type)
|
|||
}
|
||||
EXT4_I(inode)->i_flags &= ~(EXT4_NOATIME_FL | EXT4_IMMUTABLE_FL);
|
||||
inode_set_flags(inode, 0, S_NOATIME | S_IMMUTABLE);
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
err = ext4_mark_inode_dirty(handle, inode);
|
||||
ext4_journal_stop(handle);
|
||||
out_unlock:
|
||||
|
@ -7279,7 +7279,7 @@ static struct file_system_type ext4_fs_type = {
|
|||
.init_fs_context = ext4_init_fs_context,
|
||||
.parameters = ext4_param_specs,
|
||||
.kill_sb = kill_block_super,
|
||||
.fs_flags = FS_REQUIRES_DEV | FS_ALLOW_IDMAP,
|
||||
.fs_flags = FS_REQUIRES_DEV | FS_ALLOW_IDMAP | FS_MGTIME,
|
||||
};
|
||||
MODULE_ALIAS_FS("ext4");
|
||||
|
||||
|
|
|
@ -356,13 +356,13 @@ ext4_xattr_inode_hash(struct ext4_sb_info *sbi, const void *buffer, size_t size)
|
|||
|
||||
static u64 ext4_xattr_inode_get_ref(struct inode *ea_inode)
|
||||
{
|
||||
return ((u64)ea_inode->i_ctime.tv_sec << 32) |
|
||||
return ((u64) inode_get_ctime(ea_inode).tv_sec << 32) |
|
||||
(u32) inode_peek_iversion_raw(ea_inode);
|
||||
}
|
||||
|
||||
static void ext4_xattr_inode_set_ref(struct inode *ea_inode, u64 ref_count)
|
||||
{
|
||||
ea_inode->i_ctime.tv_sec = (u32)(ref_count >> 32);
|
||||
inode_set_ctime(ea_inode, (u32)(ref_count >> 32), 0);
|
||||
inode_set_iversion_raw(ea_inode, ref_count & 0xffffffff);
|
||||
}
|
||||
|
||||
|
@ -2473,7 +2473,7 @@ retry_inode:
|
|||
}
|
||||
if (!error) {
|
||||
ext4_xattr_update_super_block(handle, inode->i_sb);
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
inode_inc_iversion(inode);
|
||||
if (!value)
|
||||
no_expand = 0;
|
||||
|
|
|
@ -455,7 +455,7 @@ void f2fs_set_link(struct inode *dir, struct f2fs_dir_entry *de,
|
|||
de->file_type = fs_umode_to_ftype(inode->i_mode);
|
||||
set_page_dirty(page);
|
||||
|
||||
dir->i_mtime = dir->i_ctime = current_time(dir);
|
||||
dir->i_mtime = inode_set_ctime_current(dir);
|
||||
f2fs_mark_inode_dirty_sync(dir, false);
|
||||
f2fs_put_page(page, 1);
|
||||
}
|
||||
|
@ -609,7 +609,7 @@ void f2fs_update_parent_metadata(struct inode *dir, struct inode *inode,
|
|||
f2fs_i_links_write(dir, true);
|
||||
clear_inode_flag(inode, FI_NEW_INODE);
|
||||
}
|
||||
dir->i_mtime = dir->i_ctime = current_time(dir);
|
||||
dir->i_mtime = inode_set_ctime_current(dir);
|
||||
f2fs_mark_inode_dirty_sync(dir, false);
|
||||
|
||||
if (F2FS_I(dir)->i_current_depth != current_depth)
|
||||
|
@ -858,7 +858,7 @@ void f2fs_drop_nlink(struct inode *dir, struct inode *inode)
|
|||
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
f2fs_i_links_write(dir, false);
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
|
||||
f2fs_i_links_write(inode, false);
|
||||
if (S_ISDIR(inode->i_mode)) {
|
||||
|
@ -919,7 +919,7 @@ void f2fs_delete_entry(struct f2fs_dir_entry *dentry, struct page *page,
|
|||
}
|
||||
f2fs_put_page(page, 1);
|
||||
|
||||
dir->i_ctime = dir->i_mtime = current_time(dir);
|
||||
dir->i_mtime = inode_set_ctime_current(dir);
|
||||
f2fs_mark_inode_dirty_sync(dir, false);
|
||||
|
||||
if (inode)
|
||||
|
|
|
@ -3303,9 +3303,11 @@ static inline void clear_file(struct inode *inode, int type)
|
|||
|
||||
static inline bool f2fs_is_time_consistent(struct inode *inode)
|
||||
{
|
||||
struct timespec64 ctime = inode_get_ctime(inode);
|
||||
|
||||
if (!timespec64_equal(F2FS_I(inode)->i_disk_time, &inode->i_atime))
|
||||
return false;
|
||||
if (!timespec64_equal(F2FS_I(inode)->i_disk_time + 1, &inode->i_ctime))
|
||||
if (!timespec64_equal(F2FS_I(inode)->i_disk_time + 1, &ctime))
|
||||
return false;
|
||||
if (!timespec64_equal(F2FS_I(inode)->i_disk_time + 2, &inode->i_mtime))
|
||||
return false;
|
||||
|
|
|
@ -794,7 +794,7 @@ int f2fs_truncate(struct inode *inode)
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
f2fs_mark_inode_dirty_sync(inode, false);
|
||||
return 0;
|
||||
}
|
||||
|
@ -882,7 +882,7 @@ int f2fs_getattr(struct mnt_idmap *idmap, const struct path *path,
|
|||
STATX_ATTR_NODUMP |
|
||||
STATX_ATTR_VERITY);
|
||||
|
||||
generic_fillattr(idmap, inode, stat);
|
||||
generic_fillattr(idmap, request_mask, inode, stat);
|
||||
|
||||
/* we need to show initial sectors used for inline_data/dentries */
|
||||
if ((S_ISREG(inode->i_mode) && f2fs_has_inline_data(inode)) ||
|
||||
|
@ -905,7 +905,7 @@ static void __setattr_copy(struct mnt_idmap *idmap,
|
|||
if (ia_valid & ATTR_MTIME)
|
||||
inode->i_mtime = attr->ia_mtime;
|
||||
if (ia_valid & ATTR_CTIME)
|
||||
inode->i_ctime = attr->ia_ctime;
|
||||
inode_set_ctime_to_ts(inode, attr->ia_ctime);
|
||||
if (ia_valid & ATTR_MODE) {
|
||||
umode_t mode = attr->ia_mode;
|
||||
vfsgid_t vfsgid = i_gid_into_vfsgid(idmap, inode);
|
||||
|
@ -1008,7 +1008,7 @@ int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
|
|||
return err;
|
||||
|
||||
spin_lock(&F2FS_I(inode)->i_size_lock);
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
F2FS_I(inode)->last_disk_size = i_size_read(inode);
|
||||
spin_unlock(&F2FS_I(inode)->i_size_lock);
|
||||
}
|
||||
|
@ -1835,7 +1835,7 @@ static long f2fs_fallocate(struct file *file, int mode,
|
|||
}
|
||||
|
||||
if (!ret) {
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
f2fs_mark_inode_dirty_sync(inode, false);
|
||||
f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
|
||||
}
|
||||
|
@ -1937,7 +1937,7 @@ static int f2fs_setflags_common(struct inode *inode, u32 iflags, u32 mask)
|
|||
else
|
||||
clear_inode_flag(inode, FI_PROJ_INHERIT);
|
||||
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
f2fs_set_inode_flags(inode);
|
||||
f2fs_mark_inode_dirty_sync(inode, true);
|
||||
return 0;
|
||||
|
@ -2874,10 +2874,10 @@ out_src:
|
|||
if (ret)
|
||||
goto out_unlock;
|
||||
|
||||
src->i_mtime = src->i_ctime = current_time(src);
|
||||
src->i_mtime = inode_set_ctime_current(src);
|
||||
f2fs_mark_inode_dirty_sync(src, false);
|
||||
if (src != dst) {
|
||||
dst->i_mtime = dst->i_ctime = current_time(dst);
|
||||
dst->i_mtime = inode_set_ctime_current(dst);
|
||||
f2fs_mark_inode_dirty_sync(dst, false);
|
||||
}
|
||||
f2fs_update_time(sbi, REQ_TIME);
|
||||
|
@ -3073,7 +3073,7 @@ static int f2fs_ioc_setproject(struct inode *inode, __u32 projid)
|
|||
goto out_unlock;
|
||||
|
||||
fi->i_projid = kprojid;
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
f2fs_mark_inode_dirty_sync(inode, true);
|
||||
out_unlock:
|
||||
f2fs_unlock_op(sbi);
|
||||
|
@ -3511,7 +3511,7 @@ static int f2fs_release_compress_blocks(struct file *filp, unsigned long arg)
|
|||
}
|
||||
|
||||
set_inode_flag(inode, FI_COMPRESS_RELEASED);
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
f2fs_mark_inode_dirty_sync(inode, true);
|
||||
|
||||
f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
|
||||
|
@ -3710,7 +3710,7 @@ static int f2fs_reserve_compress_blocks(struct file *filp, unsigned long arg)
|
|||
|
||||
if (ret >= 0) {
|
||||
clear_inode_flag(inode, FI_COMPRESS_RELEASED);
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
f2fs_mark_inode_dirty_sync(inode, true);
|
||||
}
|
||||
unlock_inode:
|
||||
|
|
|
@ -698,7 +698,7 @@ void f2fs_delete_inline_entry(struct f2fs_dir_entry *dentry, struct page *page,
|
|||
set_page_dirty(page);
|
||||
f2fs_put_page(page, 1);
|
||||
|
||||
dir->i_ctime = dir->i_mtime = current_time(dir);
|
||||
dir->i_mtime = inode_set_ctime_current(dir);
|
||||
f2fs_mark_inode_dirty_sync(dir, false);
|
||||
|
||||
if (inode)
|
||||
|
|
|
@ -403,7 +403,7 @@ static void init_idisk_time(struct inode *inode)
|
|||
struct f2fs_inode_info *fi = F2FS_I(inode);
|
||||
|
||||
fi->i_disk_time[0] = inode->i_atime;
|
||||
fi->i_disk_time[1] = inode->i_ctime;
|
||||
fi->i_disk_time[1] = inode_get_ctime(inode);
|
||||
fi->i_disk_time[2] = inode->i_mtime;
|
||||
}
|
||||
|
||||
|
@ -434,10 +434,10 @@ static int do_read_inode(struct inode *inode)
|
|||
inode->i_blocks = SECTOR_FROM_BLOCK(le64_to_cpu(ri->i_blocks) - 1);
|
||||
|
||||
inode->i_atime.tv_sec = le64_to_cpu(ri->i_atime);
|
||||
inode->i_ctime.tv_sec = le64_to_cpu(ri->i_ctime);
|
||||
inode_set_ctime(inode, le64_to_cpu(ri->i_ctime),
|
||||
le32_to_cpu(ri->i_ctime_nsec));
|
||||
inode->i_mtime.tv_sec = le64_to_cpu(ri->i_mtime);
|
||||
inode->i_atime.tv_nsec = le32_to_cpu(ri->i_atime_nsec);
|
||||
inode->i_ctime.tv_nsec = le32_to_cpu(ri->i_ctime_nsec);
|
||||
inode->i_mtime.tv_nsec = le32_to_cpu(ri->i_mtime_nsec);
|
||||
inode->i_generation = le32_to_cpu(ri->i_generation);
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
|
@ -714,10 +714,10 @@ void f2fs_update_inode(struct inode *inode, struct page *node_page)
|
|||
set_raw_inline(inode, ri);
|
||||
|
||||
ri->i_atime = cpu_to_le64(inode->i_atime.tv_sec);
|
||||
ri->i_ctime = cpu_to_le64(inode->i_ctime.tv_sec);
|
||||
ri->i_ctime = cpu_to_le64(inode_get_ctime(inode).tv_sec);
|
||||
ri->i_mtime = cpu_to_le64(inode->i_mtime.tv_sec);
|
||||
ri->i_atime_nsec = cpu_to_le32(inode->i_atime.tv_nsec);
|
||||
ri->i_ctime_nsec = cpu_to_le32(inode->i_ctime.tv_nsec);
|
||||
ri->i_ctime_nsec = cpu_to_le32(inode_get_ctime(inode).tv_nsec);
|
||||
ri->i_mtime_nsec = cpu_to_le32(inode->i_mtime.tv_nsec);
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
ri->i_current_depth =
|
||||
|
|
|
@ -243,7 +243,7 @@ static struct inode *f2fs_new_inode(struct mnt_idmap *idmap,
|
|||
|
||||
inode->i_ino = ino;
|
||||
inode->i_blocks = 0;
|
||||
inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode->i_atime = inode_set_ctime_current(inode);
|
||||
F2FS_I(inode)->i_crtime = inode->i_mtime;
|
||||
inode->i_generation = get_random_u32();
|
||||
|
||||
|
@ -420,7 +420,7 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir,
|
|||
|
||||
f2fs_balance_fs(sbi, true);
|
||||
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
ihold(inode);
|
||||
|
||||
set_inode_flag(inode, FI_INC_LINK);
|
||||
|
@ -1052,7 +1052,7 @@ static int f2fs_rename(struct mnt_idmap *idmap, struct inode *old_dir,
|
|||
f2fs_set_link(new_dir, new_entry, new_page, old_inode);
|
||||
new_page = NULL;
|
||||
|
||||
new_inode->i_ctime = current_time(new_inode);
|
||||
inode_set_ctime_current(new_inode);
|
||||
f2fs_down_write(&F2FS_I(new_inode)->i_sem);
|
||||
if (old_dir_entry)
|
||||
f2fs_i_links_write(new_inode, false);
|
||||
|
@ -1086,7 +1086,7 @@ static int f2fs_rename(struct mnt_idmap *idmap, struct inode *old_dir,
|
|||
f2fs_i_pino_write(old_inode, new_dir->i_ino);
|
||||
f2fs_up_write(&F2FS_I(old_inode)->i_sem);
|
||||
|
||||
old_inode->i_ctime = current_time(old_inode);
|
||||
inode_set_ctime_current(old_inode);
|
||||
f2fs_mark_inode_dirty_sync(old_inode, false);
|
||||
|
||||
f2fs_delete_entry(old_entry, old_page, old_dir, NULL);
|
||||
|
@ -1251,7 +1251,7 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
|
|||
f2fs_i_pino_write(old_inode, new_dir->i_ino);
|
||||
f2fs_up_write(&F2FS_I(old_inode)->i_sem);
|
||||
|
||||
old_dir->i_ctime = current_time(old_dir);
|
||||
inode_set_ctime_current(old_dir);
|
||||
if (old_nlink) {
|
||||
f2fs_down_write(&F2FS_I(old_dir)->i_sem);
|
||||
f2fs_i_links_write(old_dir, old_nlink > 0);
|
||||
|
@ -1270,7 +1270,7 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
|
|||
f2fs_i_pino_write(new_inode, old_dir->i_ino);
|
||||
f2fs_up_write(&F2FS_I(new_inode)->i_sem);
|
||||
|
||||
new_dir->i_ctime = current_time(new_dir);
|
||||
inode_set_ctime_current(new_dir);
|
||||
if (new_nlink) {
|
||||
f2fs_down_write(&F2FS_I(new_dir)->i_sem);
|
||||
f2fs_i_links_write(new_dir, new_nlink > 0);
|
||||
|
|
|
@ -321,10 +321,10 @@ static int recover_inode(struct inode *inode, struct page *page)
|
|||
|
||||
f2fs_i_size_write(inode, le64_to_cpu(raw->i_size));
|
||||
inode->i_atime.tv_sec = le64_to_cpu(raw->i_atime);
|
||||
inode->i_ctime.tv_sec = le64_to_cpu(raw->i_ctime);
|
||||
inode_set_ctime(inode, le64_to_cpu(raw->i_ctime),
|
||||
le32_to_cpu(raw->i_ctime_nsec));
|
||||
inode->i_mtime.tv_sec = le64_to_cpu(raw->i_mtime);
|
||||
inode->i_atime.tv_nsec = le32_to_cpu(raw->i_atime_nsec);
|
||||
inode->i_ctime.tv_nsec = le32_to_cpu(raw->i_ctime_nsec);
|
||||
inode->i_mtime.tv_nsec = le32_to_cpu(raw->i_mtime_nsec);
|
||||
|
||||
F2FS_I(inode)->i_advise = raw->i_advise;
|
||||
|
|
|
@ -2703,7 +2703,7 @@ retry:
|
|||
|
||||
if (len == towrite)
|
||||
return err;
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
f2fs_mark_inode_dirty_sync(inode, false);
|
||||
return len - towrite;
|
||||
}
|
||||
|
|
|
@ -764,7 +764,7 @@ static int __f2fs_setxattr(struct inode *inode, int index,
|
|||
same:
|
||||
if (is_inode_flag_set(inode, FI_ACL_MODE)) {
|
||||
inode->i_mode = F2FS_I(inode)->i_acl_mode;
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
clear_inode_flag(inode, FI_ACL_MODE);
|
||||
}
|
||||
|
||||
|
|
|
@ -460,8 +460,7 @@ extern struct timespec64 fat_truncate_mtime(const struct msdos_sb_info *sbi,
|
|||
const struct timespec64 *ts);
|
||||
extern int fat_truncate_time(struct inode *inode, struct timespec64 *now,
|
||||
int flags);
|
||||
extern int fat_update_time(struct inode *inode, struct timespec64 *now,
|
||||
int flags);
|
||||
extern int fat_update_time(struct inode *inode, int flags);
|
||||
extern int fat_sync_bhs(struct buffer_head **bhs, int nr_bhs);
|
||||
|
||||
int fat_cache_init(void);
|
||||
|
|
|
@ -401,7 +401,7 @@ int fat_getattr(struct mnt_idmap *idmap, const struct path *path,
|
|||
struct inode *inode = d_inode(path->dentry);
|
||||
struct msdos_sb_info *sbi = MSDOS_SB(inode->i_sb);
|
||||
|
||||
generic_fillattr(idmap, inode, stat);
|
||||
generic_fillattr(idmap, request_mask, inode, stat);
|
||||
stat->blksize = sbi->cluster_size;
|
||||
|
||||
if (sbi->options.nfs == FAT_NFS_NOSTALE_RO) {
|
||||
|
|
|
@ -562,7 +562,7 @@ int fat_fill_inode(struct inode *inode, struct msdos_dir_entry *de)
|
|||
& ~((loff_t)sbi->cluster_size - 1)) >> 9;
|
||||
|
||||
fat_time_fat2unix(sbi, &inode->i_mtime, de->time, de->date, 0);
|
||||
inode->i_ctime = inode->i_mtime;
|
||||
inode_set_ctime_to_ts(inode, inode->i_mtime);
|
||||
if (sbi->options.isvfat) {
|
||||
fat_time_fat2unix(sbi, &inode->i_atime, 0, de->adate, 0);
|
||||
fat_time_fat2unix(sbi, &MSDOS_I(inode)->i_crtime, de->ctime,
|
||||
|
@ -1407,8 +1407,7 @@ static int fat_read_root(struct inode *inode)
|
|||
MSDOS_I(inode)->mmu_private = inode->i_size;
|
||||
|
||||
fat_save_attrs(inode, ATTR_DIR);
|
||||
inode->i_mtime.tv_sec = inode->i_atime.tv_sec = inode->i_ctime.tv_sec = 0;
|
||||
inode->i_mtime.tv_nsec = inode->i_atime.tv_nsec = inode->i_ctime.tv_nsec = 0;
|
||||
inode->i_mtime = inode->i_atime = inode_set_ctime(inode, 0, 0);
|
||||
set_nlink(inode, fat_subdirs(inode)+2);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -332,13 +332,14 @@ int fat_truncate_time(struct inode *inode, struct timespec64 *now, int flags)
|
|||
* but ctime updates are ignored.
|
||||
*/
|
||||
if (flags & S_MTIME)
|
||||
inode->i_mtime = inode->i_ctime = fat_truncate_mtime(sbi, now);
|
||||
inode->i_mtime = inode_set_ctime_to_ts(inode,
|
||||
fat_truncate_mtime(sbi, now));
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(fat_truncate_time);
|
||||
|
||||
int fat_update_time(struct inode *inode, struct timespec64 *now, int flags)
|
||||
int fat_update_time(struct inode *inode, int flags)
|
||||
{
|
||||
int dirty_flags = 0;
|
||||
|
||||
|
@ -346,16 +347,13 @@ int fat_update_time(struct inode *inode, struct timespec64 *now, int flags)
|
|||
return 0;
|
||||
|
||||
if (flags & (S_ATIME | S_CTIME | S_MTIME)) {
|
||||
fat_truncate_time(inode, now, flags);
|
||||
fat_truncate_time(inode, NULL, flags);
|
||||
if (inode->i_sb->s_flags & SB_LAZYTIME)
|
||||
dirty_flags |= I_DIRTY_TIME;
|
||||
else
|
||||
dirty_flags |= I_DIRTY_SYNC;
|
||||
}
|
||||
|
||||
if ((flags & S_VERSION) && inode_maybe_inc_iversion(inode, false))
|
||||
dirty_flags |= I_DIRTY_SYNC;
|
||||
|
||||
__mark_inode_dirty(inode, dirty_flags);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -110,10 +110,9 @@ static inline void dip2vip_cpy(struct vxfs_sb_info *sbi,
|
|||
inode->i_size = vip->vii_size;
|
||||
|
||||
inode->i_atime.tv_sec = vip->vii_atime;
|
||||
inode->i_ctime.tv_sec = vip->vii_ctime;
|
||||
inode_set_ctime(inode, vip->vii_ctime, 0);
|
||||
inode->i_mtime.tv_sec = vip->vii_mtime;
|
||||
inode->i_atime.tv_nsec = 0;
|
||||
inode->i_ctime.tv_nsec = 0;
|
||||
inode->i_mtime.tv_nsec = 0;
|
||||
|
||||
inode->i_blocks = vip->vii_blocks;
|
||||
|
|
|
@ -235,7 +235,7 @@ static struct dentry *fuse_ctl_add_dentry(struct dentry *parent,
|
|||
inode->i_mode = mode;
|
||||
inode->i_uid = fc->user_id;
|
||||
inode->i_gid = fc->group_id;
|
||||
inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_atime = inode->i_mtime = inode_set_ctime_current(inode);
|
||||
/* setting ->i_op to NULL is not allowed */
|
||||
if (iop)
|
||||
inode->i_op = iop;
|
||||
|
|
|
@ -933,7 +933,7 @@ void fuse_flush_time_update(struct inode *inode)
|
|||
static void fuse_update_ctime_in_cache(struct inode *inode)
|
||||
{
|
||||
if (!IS_NOCMTIME(inode)) {
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
mark_inode_dirty_sync(inode);
|
||||
fuse_flush_time_update(inode);
|
||||
}
|
||||
|
@ -1222,7 +1222,7 @@ static int fuse_update_get_attr(struct inode *inode, struct file *file,
|
|||
forget_all_cached_acls(inode);
|
||||
err = fuse_do_getattr(inode, stat, file);
|
||||
} else if (stat) {
|
||||
generic_fillattr(&nop_mnt_idmap, inode, stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
|
||||
stat->mode = fi->orig_i_mode;
|
||||
stat->ino = fi->orig_ino;
|
||||
}
|
||||
|
@ -1715,8 +1715,8 @@ int fuse_flush_times(struct inode *inode, struct fuse_file *ff)
|
|||
inarg.mtimensec = inode->i_mtime.tv_nsec;
|
||||
if (fm->fc->minor >= 23) {
|
||||
inarg.valid |= FATTR_CTIME;
|
||||
inarg.ctime = inode->i_ctime.tv_sec;
|
||||
inarg.ctimensec = inode->i_ctime.tv_nsec;
|
||||
inarg.ctime = inode_get_ctime(inode).tv_sec;
|
||||
inarg.ctimensec = inode_get_ctime(inode).tv_nsec;
|
||||
}
|
||||
if (ff) {
|
||||
inarg.valid |= FATTR_FH;
|
||||
|
@ -1857,7 +1857,7 @@ int fuse_do_setattr(struct dentry *dentry, struct iattr *attr,
|
|||
if (attr->ia_valid & ATTR_MTIME)
|
||||
inode->i_mtime = attr->ia_mtime;
|
||||
if (attr->ia_valid & ATTR_CTIME)
|
||||
inode->i_ctime = attr->ia_ctime;
|
||||
inode_set_ctime_to_ts(inode, attr->ia_ctime);
|
||||
/* FIXME: clear I_DIRTY_SYNC? */
|
||||
}
|
||||
|
||||
|
|
|
@ -194,8 +194,7 @@ void fuse_change_attributes_common(struct inode *inode, struct fuse_attr *attr,
|
|||
inode->i_mtime.tv_nsec = attr->mtimensec;
|
||||
}
|
||||
if (!(cache_mask & STATX_CTIME)) {
|
||||
inode->i_ctime.tv_sec = attr->ctime;
|
||||
inode->i_ctime.tv_nsec = attr->ctimensec;
|
||||
inode_set_ctime(inode, attr->ctime, attr->ctimensec);
|
||||
}
|
||||
|
||||
if (attr->blksize != 0)
|
||||
|
@ -259,8 +258,8 @@ void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr,
|
|||
attr->mtimensec = inode->i_mtime.tv_nsec;
|
||||
}
|
||||
if (cache_mask & STATX_CTIME) {
|
||||
attr->ctime = inode->i_ctime.tv_sec;
|
||||
attr->ctimensec = inode->i_ctime.tv_nsec;
|
||||
attr->ctime = inode_get_ctime(inode).tv_sec;
|
||||
attr->ctimensec = inode_get_ctime(inode).tv_nsec;
|
||||
}
|
||||
|
||||
if ((attr_version != 0 && fi->attr_version > attr_version) ||
|
||||
|
@ -318,8 +317,7 @@ static void fuse_init_inode(struct inode *inode, struct fuse_attr *attr,
|
|||
inode->i_size = attr->size;
|
||||
inode->i_mtime.tv_sec = attr->mtime;
|
||||
inode->i_mtime.tv_nsec = attr->mtimensec;
|
||||
inode->i_ctime.tv_sec = attr->ctime;
|
||||
inode->i_ctime.tv_nsec = attr->ctimensec;
|
||||
inode_set_ctime(inode, attr->ctime, attr->ctimensec);
|
||||
if (S_ISREG(inode->i_mode)) {
|
||||
fuse_init_common(inode);
|
||||
fuse_init_file_inode(inode, attr->flags);
|
||||
|
@ -1401,16 +1399,18 @@ EXPORT_SYMBOL_GPL(fuse_dev_free);
|
|||
static void fuse_fill_attr_from_inode(struct fuse_attr *attr,
|
||||
const struct fuse_inode *fi)
|
||||
{
|
||||
struct timespec64 ctime = inode_get_ctime(&fi->inode);
|
||||
|
||||
*attr = (struct fuse_attr){
|
||||
.ino = fi->inode.i_ino,
|
||||
.size = fi->inode.i_size,
|
||||
.blocks = fi->inode.i_blocks,
|
||||
.atime = fi->inode.i_atime.tv_sec,
|
||||
.mtime = fi->inode.i_mtime.tv_sec,
|
||||
.ctime = fi->inode.i_ctime.tv_sec,
|
||||
.ctime = ctime.tv_sec,
|
||||
.atimensec = fi->inode.i_atime.tv_nsec,
|
||||
.mtimensec = fi->inode.i_mtime.tv_nsec,
|
||||
.ctimensec = fi->inode.i_ctime.tv_nsec,
|
||||
.ctimensec = ctime.tv_nsec,
|
||||
.mode = fi->inode.i_mode,
|
||||
.nlink = fi->inode.i_nlink,
|
||||
.uid = fi->inode.i_uid.val,
|
||||
|
|
|
@ -142,7 +142,7 @@ int gfs2_set_acl(struct mnt_idmap *idmap, struct dentry *dentry,
|
|||
|
||||
ret = __gfs2_set_acl(inode, acl, type);
|
||||
if (!ret && mode != inode->i_mode) {
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
inode->i_mode = mode;
|
||||
mark_inode_dirty(inode);
|
||||
}
|
||||
|
|
|
@ -1386,7 +1386,7 @@ static int trunc_start(struct inode *inode, u64 newsize)
|
|||
ip->i_diskflags |= GFS2_DIF_TRUNC_IN_PROG;
|
||||
|
||||
i_size_write(inode, newsize);
|
||||
ip->i_inode.i_mtime = ip->i_inode.i_ctime = current_time(&ip->i_inode);
|
||||
ip->i_inode.i_mtime = inode_set_ctime_current(&ip->i_inode);
|
||||
gfs2_dinode_out(ip, dibh->b_data);
|
||||
|
||||
if (journaled)
|
||||
|
@ -1583,8 +1583,7 @@ out_unlock:
|
|||
|
||||
/* Every transaction boundary, we rewrite the dinode
|
||||
to keep its di_blocks current in case of failure. */
|
||||
ip->i_inode.i_mtime = ip->i_inode.i_ctime =
|
||||
current_time(&ip->i_inode);
|
||||
ip->i_inode.i_mtime = inode_set_ctime_current(&ip->i_inode);
|
||||
gfs2_trans_add_meta(ip->i_gl, dibh);
|
||||
gfs2_dinode_out(ip, dibh->b_data);
|
||||
brelse(dibh);
|
||||
|
@ -1950,7 +1949,7 @@ static int punch_hole(struct gfs2_inode *ip, u64 offset, u64 length)
|
|||
gfs2_statfs_change(sdp, 0, +btotal, 0);
|
||||
gfs2_quota_change(ip, -(s64)btotal, ip->i_inode.i_uid,
|
||||
ip->i_inode.i_gid);
|
||||
ip->i_inode.i_mtime = ip->i_inode.i_ctime = current_time(&ip->i_inode);
|
||||
ip->i_inode.i_mtime = inode_set_ctime_current(&ip->i_inode);
|
||||
gfs2_trans_add_meta(ip->i_gl, dibh);
|
||||
gfs2_dinode_out(ip, dibh->b_data);
|
||||
up_write(&ip->i_rw_mutex);
|
||||
|
@ -1993,7 +1992,7 @@ static int trunc_end(struct gfs2_inode *ip)
|
|||
gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode));
|
||||
gfs2_ordered_del_inode(ip);
|
||||
}
|
||||
ip->i_inode.i_mtime = ip->i_inode.i_ctime = current_time(&ip->i_inode);
|
||||
ip->i_inode.i_mtime = inode_set_ctime_current(&ip->i_inode);
|
||||
ip->i_diskflags &= ~GFS2_DIF_TRUNC_IN_PROG;
|
||||
|
||||
gfs2_trans_add_meta(ip->i_gl, dibh);
|
||||
|
@ -2094,7 +2093,7 @@ static int do_grow(struct inode *inode, u64 size)
|
|||
goto do_end_trans;
|
||||
|
||||
truncate_setsize(inode, size);
|
||||
ip->i_inode.i_mtime = ip->i_inode.i_ctime = current_time(&ip->i_inode);
|
||||
ip->i_inode.i_mtime = inode_set_ctime_current(&ip->i_inode);
|
||||
gfs2_trans_add_meta(ip->i_gl, dibh);
|
||||
gfs2_dinode_out(ip, dibh->b_data);
|
||||
brelse(dibh);
|
||||
|
|
|
@ -130,7 +130,7 @@ static int gfs2_dir_write_stuffed(struct gfs2_inode *ip, const char *buf,
|
|||
memcpy(dibh->b_data + offset + sizeof(struct gfs2_dinode), buf, size);
|
||||
if (ip->i_inode.i_size < offset + size)
|
||||
i_size_write(&ip->i_inode, offset + size);
|
||||
ip->i_inode.i_mtime = ip->i_inode.i_ctime = current_time(&ip->i_inode);
|
||||
ip->i_inode.i_mtime = inode_set_ctime_current(&ip->i_inode);
|
||||
gfs2_dinode_out(ip, dibh->b_data);
|
||||
|
||||
brelse(dibh);
|
||||
|
@ -227,7 +227,7 @@ out:
|
|||
|
||||
if (ip->i_inode.i_size < offset + copied)
|
||||
i_size_write(&ip->i_inode, offset + copied);
|
||||
ip->i_inode.i_mtime = ip->i_inode.i_ctime = current_time(&ip->i_inode);
|
||||
ip->i_inode.i_mtime = inode_set_ctime_current(&ip->i_inode);
|
||||
|
||||
gfs2_trans_add_meta(ip->i_gl, dibh);
|
||||
gfs2_dinode_out(ip, dibh->b_data);
|
||||
|
@ -1814,7 +1814,7 @@ int gfs2_dir_add(struct inode *inode, const struct qstr *name,
|
|||
gfs2_inum_out(nip, dent);
|
||||
dent->de_type = cpu_to_be16(IF2DT(nip->i_inode.i_mode));
|
||||
dent->de_rahead = cpu_to_be16(gfs2_inode_ra_len(nip));
|
||||
tv = current_time(&ip->i_inode);
|
||||
tv = inode_set_ctime_current(&ip->i_inode);
|
||||
if (ip->i_diskflags & GFS2_DIF_EXHASH) {
|
||||
leaf = (struct gfs2_leaf *)bh->b_data;
|
||||
be16_add_cpu(&leaf->lf_entries, 1);
|
||||
|
@ -1825,7 +1825,7 @@ int gfs2_dir_add(struct inode *inode, const struct qstr *name,
|
|||
da->bh = NULL;
|
||||
brelse(bh);
|
||||
ip->i_entries++;
|
||||
ip->i_inode.i_mtime = ip->i_inode.i_ctime = tv;
|
||||
ip->i_inode.i_mtime = tv;
|
||||
if (S_ISDIR(nip->i_inode.i_mode))
|
||||
inc_nlink(&ip->i_inode);
|
||||
mark_inode_dirty(inode);
|
||||
|
@ -1876,7 +1876,7 @@ int gfs2_dir_del(struct gfs2_inode *dip, const struct dentry *dentry)
|
|||
const struct qstr *name = &dentry->d_name;
|
||||
struct gfs2_dirent *dent, *prev = NULL;
|
||||
struct buffer_head *bh;
|
||||
struct timespec64 tv = current_time(&dip->i_inode);
|
||||
struct timespec64 tv;
|
||||
|
||||
/* Returns _either_ the entry (if its first in block) or the
|
||||
previous entry otherwise */
|
||||
|
@ -1896,6 +1896,7 @@ int gfs2_dir_del(struct gfs2_inode *dip, const struct dentry *dentry)
|
|||
}
|
||||
|
||||
dirent_del(dip, bh, prev, dent);
|
||||
tv = inode_set_ctime_current(&dip->i_inode);
|
||||
if (dip->i_diskflags & GFS2_DIF_EXHASH) {
|
||||
struct gfs2_leaf *leaf = (struct gfs2_leaf *)bh->b_data;
|
||||
u16 entries = be16_to_cpu(leaf->lf_entries);
|
||||
|
@ -1910,7 +1911,7 @@ int gfs2_dir_del(struct gfs2_inode *dip, const struct dentry *dentry)
|
|||
if (!dip->i_entries)
|
||||
gfs2_consist_inode(dip);
|
||||
dip->i_entries--;
|
||||
dip->i_inode.i_mtime = dip->i_inode.i_ctime = tv;
|
||||
dip->i_inode.i_mtime = tv;
|
||||
if (d_is_dir(dentry))
|
||||
drop_nlink(&dip->i_inode);
|
||||
mark_inode_dirty(&dip->i_inode);
|
||||
|
@ -1951,7 +1952,7 @@ int gfs2_dir_mvino(struct gfs2_inode *dip, const struct qstr *filename,
|
|||
dent->de_type = cpu_to_be16(new_type);
|
||||
brelse(bh);
|
||||
|
||||
dip->i_inode.i_mtime = dip->i_inode.i_ctime = current_time(&dip->i_inode);
|
||||
dip->i_inode.i_mtime = inode_set_ctime_current(&dip->i_inode);
|
||||
mark_inode_dirty_sync(&dip->i_inode);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -260,7 +260,7 @@ static int do_gfs2_set_flags(struct inode *inode, u32 reqflags, u32 mask)
|
|||
error = gfs2_meta_inode_buffer(ip, &bh);
|
||||
if (error)
|
||||
goto out_trans_end;
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
gfs2_trans_add_meta(ip->i_gl, bh);
|
||||
ip->i_diskflags = new_flags;
|
||||
gfs2_dinode_out(ip, bh->b_data);
|
||||
|
|
|
@ -437,8 +437,8 @@ static int gfs2_dinode_in(struct gfs2_inode *ip, const void *buf)
|
|||
inode->i_atime = atime;
|
||||
inode->i_mtime.tv_sec = be64_to_cpu(str->di_mtime);
|
||||
inode->i_mtime.tv_nsec = be32_to_cpu(str->di_mtime_nsec);
|
||||
inode->i_ctime.tv_sec = be64_to_cpu(str->di_ctime);
|
||||
inode->i_ctime.tv_nsec = be32_to_cpu(str->di_ctime_nsec);
|
||||
inode_set_ctime(inode, be64_to_cpu(str->di_ctime),
|
||||
be32_to_cpu(str->di_ctime_nsec));
|
||||
|
||||
ip->i_goal = be64_to_cpu(str->di_goal_meta);
|
||||
ip->i_generation = be64_to_cpu(str->di_generation);
|
||||
|
|
|
@ -690,7 +690,7 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
|
|||
set_nlink(inode, S_ISDIR(mode) ? 2 : 1);
|
||||
inode->i_rdev = dev;
|
||||
inode->i_size = size;
|
||||
inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
inode->i_atime = inode->i_mtime = inode_set_ctime_current(inode);
|
||||
munge_mode_uid_gid(dip, inode);
|
||||
check_and_update_goal(dip);
|
||||
ip->i_goal = dip->i_goal;
|
||||
|
@ -1029,7 +1029,7 @@ static int gfs2_link(struct dentry *old_dentry, struct inode *dir,
|
|||
|
||||
gfs2_trans_add_meta(ip->i_gl, dibh);
|
||||
inc_nlink(&ip->i_inode);
|
||||
ip->i_inode.i_ctime = current_time(&ip->i_inode);
|
||||
inode_set_ctime_current(&ip->i_inode);
|
||||
ihold(inode);
|
||||
d_instantiate(dentry, inode);
|
||||
mark_inode_dirty(inode);
|
||||
|
@ -1114,7 +1114,7 @@ static int gfs2_unlink_inode(struct gfs2_inode *dip,
|
|||
return error;
|
||||
|
||||
ip->i_entries = 0;
|
||||
inode->i_ctime = current_time(inode);
|
||||
inode_set_ctime_current(inode);
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
clear_nlink(inode);
|
||||
else
|
||||
|
@ -1371,7 +1371,7 @@ static int update_moved_ino(struct gfs2_inode *ip, struct gfs2_inode *ndip,
|
|||
if (dir_rename)
|
||||
return gfs2_dir_mvino(ip, &gfs2_qdotdot, ndip, DT_DIR);
|
||||
|
||||
ip->i_inode.i_ctime = current_time(&ip->i_inode);
|
||||
inode_set_ctime_current(&ip->i_inode);
|
||||
mark_inode_dirty_sync(&ip->i_inode);
|
||||
return 0;
|
||||
}
|
||||
|
@ -2071,7 +2071,7 @@ static int gfs2_getattr(struct mnt_idmap *idmap,
|
|||
STATX_ATTR_IMMUTABLE |
|
||||
STATX_ATTR_NODUMP);
|
||||
|
||||
generic_fillattr(&nop_mnt_idmap, inode, stat);
|
||||
generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
|
||||
|
||||
if (gfs2_holder_initialized(&gh))
|
||||
gfs2_glock_dq_uninit(&gh);
|
||||
|
@ -2139,8 +2139,7 @@ loff_t gfs2_seek_hole(struct file *file, loff_t offset)
|
|||
return vfs_setpos(file, ret, inode->i_sb->s_maxbytes);
|
||||
}
|
||||
|
||||
static int gfs2_update_time(struct inode *inode, struct timespec64 *time,
|
||||
int flags)
|
||||
static int gfs2_update_time(struct inode *inode, int flags)
|
||||
{
|
||||
struct gfs2_inode *ip = GFS2_I(inode);
|
||||
struct gfs2_glock *gl = ip->i_gl;
|
||||
|
@ -2155,7 +2154,8 @@ static int gfs2_update_time(struct inode *inode, struct timespec64 *time,
|
|||
if (error)
|
||||
return error;
|
||||
}
|
||||
return generic_update_time(inode, time, flags);
|
||||
generic_update_time(inode, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct inode_operations gfs2_file_iops = {
|
||||
|
|
|
@ -871,7 +871,7 @@ static int gfs2_adjust_quota(struct gfs2_inode *ip, loff_t loc,
|
|||
size = loc + sizeof(struct gfs2_quota);
|
||||
if (size > inode->i_size)
|
||||
i_size_write(inode, size);
|
||||
inode->i_mtime = inode->i_atime = current_time(inode);
|
||||
inode->i_mtime = inode_set_ctime_current(inode);
|
||||
mark_inode_dirty(inode);
|
||||
set_bit(QDF_REFRESH, &qd->qd_flags);
|
||||
}
|
||||
|
|
|
@ -412,7 +412,7 @@ void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf)
|
|||
str->di_blocks = cpu_to_be64(gfs2_get_inode_blocks(inode));
|
||||
str->di_atime = cpu_to_be64(inode->i_atime.tv_sec);
|
||||
str->di_mtime = cpu_to_be64(inode->i_mtime.tv_sec);
|
||||
str->di_ctime = cpu_to_be64(inode->i_ctime.tv_sec);
|
||||
str->di_ctime = cpu_to_be64(inode_get_ctime(inode).tv_sec);
|
||||
|
||||
str->di_goal_meta = cpu_to_be64(ip->i_goal);
|
||||
str->di_goal_data = cpu_to_be64(ip->i_goal);
|
||||
|
@ -429,7 +429,7 @@ void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf)
|
|||
str->di_eattr = cpu_to_be64(ip->i_eattr);
|
||||
str->di_atime_nsec = cpu_to_be32(inode->i_atime.tv_nsec);
|
||||
str->di_mtime_nsec = cpu_to_be32(inode->i_mtime.tv_nsec);
|
||||
str->di_ctime_nsec = cpu_to_be32(inode->i_ctime.tv_nsec);
|
||||
str->di_ctime_nsec = cpu_to_be32(inode_get_ctime(inode).tv_nsec);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue