From: Jeff Layton <jlayton@kernel.org> To: Christian Brauner <brauner@kernel.org>, Jaegeuk Kim <jaegeuk@kernel.org>, Chao Yu <chao@kernel.org> Cc: linux-kernel@vger.kernel.org, Jan Kara <jack@suse.cz>, Al Viro <viro@zeniv.linux.org.uk>, linux-f2fs-devel@lists.sourceforge.net Subject: [f2fs-dev] [PATCH 30/79] f2fs: switch to new ctime accessors Date: Wed, 21 Jun 2023 10:45:43 -0400 [thread overview] Message-ID: <20230621144735.55953-29-jlayton@kernel.org> (raw) In-Reply-To: <20230621144735.55953-1-jlayton@kernel.org> In later patches, we're going to change how the ctime.tv_nsec field is utilized. Switch to using accessor functions instead of raw accesses of inode->i_ctime. Signed-off-by: Jeff Layton <jlayton@kernel.org> --- fs/f2fs/dir.c | 8 ++++---- fs/f2fs/f2fs.h | 5 ++++- fs/f2fs/file.c | 16 ++++++++-------- fs/f2fs/inline.c | 2 +- fs/f2fs/inode.c | 10 +++++----- fs/f2fs/namei.c | 12 ++++++------ fs/f2fs/recovery.c | 4 ++-- fs/f2fs/super.c | 2 +- fs/f2fs/xattr.c | 2 +- 9 files changed, 32 insertions(+), 29 deletions(-) diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c index 887e55988450..54fa7285e2d6 100644 --- a/fs/f2fs/dir.c +++ b/fs/f2fs/dir.c @@ -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_ctime_set_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_ctime_set_current(dir); f2fs_mark_inode_dirty_sync(dir, false); if (F2FS_I(dir)->i_current_depth != current_depth) @@ -851,7 +851,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_ctime_set_current(inode); f2fs_i_links_write(inode, false); if (S_ISDIR(inode->i_mode)) { @@ -912,7 +912,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_ctime_set_current(dir); f2fs_mark_inode_dirty_sync(dir, false); if (inode) diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 7b9af2d51656..b0a0de41f823 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -3302,9 +3302,12 @@ static inline void clear_file(struct inode *inode, int type) static inline bool f2fs_is_time_consistent(struct inode *inode) { + struct timespec64 ctime; + 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)) + ctime = inode_ctime_peek(inode); + 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; diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 38688b5192ef..76c38cd89865 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -809,7 +809,7 @@ int f2fs_truncate(struct inode *inode) if (err) return err; - inode->i_mtime = inode->i_ctime = current_time(inode); + inode->i_mtime = inode_ctime_set_current(inode); f2fs_mark_inode_dirty_sync(inode, false); return 0; } @@ -920,7 +920,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_ctime_set(inode, attr->ia_ctime); if (ia_valid & ATTR_MODE) { umode_t mode = attr->ia_mode; vfsgid_t vfsgid = i_gid_into_vfsgid(idmap, inode); @@ -1023,7 +1023,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_ctime_set_current(inode); F2FS_I(inode)->last_disk_size = i_size_read(inode); spin_unlock(&F2FS_I(inode)->i_size_lock); } @@ -1850,7 +1850,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_ctime_set_current(inode); f2fs_mark_inode_dirty_sync(inode, false); f2fs_update_time(F2FS_I_SB(inode), REQ_TIME); } @@ -1952,7 +1952,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_ctime_set_current(inode); f2fs_set_inode_flags(inode); f2fs_mark_inode_dirty_sync(inode, true); return 0; @@ -3077,7 +3077,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_ctime_set_current(inode); f2fs_mark_inode_dirty_sync(inode, true); out_unlock: f2fs_unlock_op(sbi); @@ -3510,7 +3510,7 @@ static int f2fs_release_compress_blocks(struct file *filp, unsigned long arg) goto out; set_inode_flag(inode, FI_COMPRESS_RELEASED); - inode->i_ctime = current_time(inode); + inode_ctime_set_current(inode); f2fs_mark_inode_dirty_sync(inode, true); if (!atomic_read(&F2FS_I(inode)->i_compr_blocks)) @@ -3712,7 +3712,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_ctime_set_current(inode); f2fs_mark_inode_dirty_sync(inode, true); } unlock_inode: diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c index 4638fee16a91..72bb5340b088 100644 --- a/fs/f2fs/inline.c +++ b/fs/f2fs/inline.c @@ -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_ctime_set_current(dir); f2fs_mark_inode_dirty_sync(dir, false); if (inode) diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index 09e986b050c6..95b89e48a159 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c @@ -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_ctime_peek(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_ctime_set_sec(inode, le64_to_cpu(ri->i_ctime)); 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_ctime_set_nsec(inode, 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_ctime_peek(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_ctime_peek(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 = diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c index 614c33f0f17e..c7876c5d74a6 100644 --- a/fs/f2fs/namei.c +++ b/fs/f2fs/namei.c @@ -233,7 +233,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_ctime_set_current(inode); F2FS_I(inode)->i_crtime = inode->i_mtime; inode->i_generation = get_random_u32(); @@ -410,7 +410,7 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir, f2fs_balance_fs(sbi, true); - inode->i_ctime = current_time(inode); + inode_ctime_set_current(inode); ihold(inode); set_inode_flag(inode, FI_INC_LINK); @@ -1042,7 +1042,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_ctime_set_current(new_inode); f2fs_down_write(&F2FS_I(new_inode)->i_sem); if (old_dir_entry) f2fs_i_links_write(new_inode, false); @@ -1076,7 +1076,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_ctime_set_current(old_inode); f2fs_mark_inode_dirty_sync(old_inode, false); f2fs_delete_entry(old_entry, old_page, old_dir, NULL); @@ -1241,7 +1241,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_ctime_set_current(old_dir); if (old_nlink) { f2fs_down_write(&F2FS_I(old_dir)->i_sem); f2fs_i_links_write(old_dir, old_nlink > 0); @@ -1260,7 +1260,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_ctime_set_current(new_dir); if (new_nlink) { f2fs_down_write(&F2FS_I(new_dir)->i_sem); f2fs_i_links_write(new_dir, new_nlink > 0); diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c index 4e7d4ceeb084..5a06dd15453d 100644 --- a/fs/f2fs/recovery.c +++ b/fs/f2fs/recovery.c @@ -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_ctime_set_sec(inode, le64_to_cpu(raw->i_ctime)); 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_ctime_set_nsec(inode, 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; diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index bc15841fd33c..3c6bb358a7a3 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -2702,7 +2702,7 @@ static ssize_t f2fs_quota_write(struct super_block *sb, int type, if (len == towrite) return err; - inode->i_mtime = inode->i_ctime = current_time(inode); + inode->i_mtime = inode_ctime_set_current(inode); f2fs_mark_inode_dirty_sync(inode, false); return len - towrite; } diff --git a/fs/f2fs/xattr.c b/fs/f2fs/xattr.c index bdc8a55085a2..9bc685b33f4d 100644 --- a/fs/f2fs/xattr.c +++ b/fs/f2fs/xattr.c @@ -749,7 +749,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_ctime_set_current(inode); clear_inode_flag(inode, FI_ACL_MODE); } -- 2.41.0 _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
WARNING: multiple messages have this Message-ID (diff)
From: Jeff Layton <jlayton@kernel.org> To: Christian Brauner <brauner@kernel.org>, Jaegeuk Kim <jaegeuk@kernel.org>, Chao Yu <chao@kernel.org> Cc: Al Viro <viro@zeniv.linux.org.uk>, Jan Kara <jack@suse.cz>, linux-f2fs-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org Subject: [PATCH 30/79] f2fs: switch to new ctime accessors Date: Wed, 21 Jun 2023 10:45:43 -0400 [thread overview] Message-ID: <20230621144735.55953-29-jlayton@kernel.org> (raw) In-Reply-To: <20230621144735.55953-1-jlayton@kernel.org> In later patches, we're going to change how the ctime.tv_nsec field is utilized. Switch to using accessor functions instead of raw accesses of inode->i_ctime. Signed-off-by: Jeff Layton <jlayton@kernel.org> --- fs/f2fs/dir.c | 8 ++++---- fs/f2fs/f2fs.h | 5 ++++- fs/f2fs/file.c | 16 ++++++++-------- fs/f2fs/inline.c | 2 +- fs/f2fs/inode.c | 10 +++++----- fs/f2fs/namei.c | 12 ++++++------ fs/f2fs/recovery.c | 4 ++-- fs/f2fs/super.c | 2 +- fs/f2fs/xattr.c | 2 +- 9 files changed, 32 insertions(+), 29 deletions(-) diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c index 887e55988450..54fa7285e2d6 100644 --- a/fs/f2fs/dir.c +++ b/fs/f2fs/dir.c @@ -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_ctime_set_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_ctime_set_current(dir); f2fs_mark_inode_dirty_sync(dir, false); if (F2FS_I(dir)->i_current_depth != current_depth) @@ -851,7 +851,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_ctime_set_current(inode); f2fs_i_links_write(inode, false); if (S_ISDIR(inode->i_mode)) { @@ -912,7 +912,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_ctime_set_current(dir); f2fs_mark_inode_dirty_sync(dir, false); if (inode) diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 7b9af2d51656..b0a0de41f823 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -3302,9 +3302,12 @@ static inline void clear_file(struct inode *inode, int type) static inline bool f2fs_is_time_consistent(struct inode *inode) { + struct timespec64 ctime; + 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)) + ctime = inode_ctime_peek(inode); + 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; diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 38688b5192ef..76c38cd89865 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -809,7 +809,7 @@ int f2fs_truncate(struct inode *inode) if (err) return err; - inode->i_mtime = inode->i_ctime = current_time(inode); + inode->i_mtime = inode_ctime_set_current(inode); f2fs_mark_inode_dirty_sync(inode, false); return 0; } @@ -920,7 +920,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_ctime_set(inode, attr->ia_ctime); if (ia_valid & ATTR_MODE) { umode_t mode = attr->ia_mode; vfsgid_t vfsgid = i_gid_into_vfsgid(idmap, inode); @@ -1023,7 +1023,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_ctime_set_current(inode); F2FS_I(inode)->last_disk_size = i_size_read(inode); spin_unlock(&F2FS_I(inode)->i_size_lock); } @@ -1850,7 +1850,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_ctime_set_current(inode); f2fs_mark_inode_dirty_sync(inode, false); f2fs_update_time(F2FS_I_SB(inode), REQ_TIME); } @@ -1952,7 +1952,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_ctime_set_current(inode); f2fs_set_inode_flags(inode); f2fs_mark_inode_dirty_sync(inode, true); return 0; @@ -3077,7 +3077,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_ctime_set_current(inode); f2fs_mark_inode_dirty_sync(inode, true); out_unlock: f2fs_unlock_op(sbi); @@ -3510,7 +3510,7 @@ static int f2fs_release_compress_blocks(struct file *filp, unsigned long arg) goto out; set_inode_flag(inode, FI_COMPRESS_RELEASED); - inode->i_ctime = current_time(inode); + inode_ctime_set_current(inode); f2fs_mark_inode_dirty_sync(inode, true); if (!atomic_read(&F2FS_I(inode)->i_compr_blocks)) @@ -3712,7 +3712,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_ctime_set_current(inode); f2fs_mark_inode_dirty_sync(inode, true); } unlock_inode: diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c index 4638fee16a91..72bb5340b088 100644 --- a/fs/f2fs/inline.c +++ b/fs/f2fs/inline.c @@ -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_ctime_set_current(dir); f2fs_mark_inode_dirty_sync(dir, false); if (inode) diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index 09e986b050c6..95b89e48a159 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c @@ -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_ctime_peek(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_ctime_set_sec(inode, le64_to_cpu(ri->i_ctime)); 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_ctime_set_nsec(inode, 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_ctime_peek(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_ctime_peek(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 = diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c index 614c33f0f17e..c7876c5d74a6 100644 --- a/fs/f2fs/namei.c +++ b/fs/f2fs/namei.c @@ -233,7 +233,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_ctime_set_current(inode); F2FS_I(inode)->i_crtime = inode->i_mtime; inode->i_generation = get_random_u32(); @@ -410,7 +410,7 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir, f2fs_balance_fs(sbi, true); - inode->i_ctime = current_time(inode); + inode_ctime_set_current(inode); ihold(inode); set_inode_flag(inode, FI_INC_LINK); @@ -1042,7 +1042,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_ctime_set_current(new_inode); f2fs_down_write(&F2FS_I(new_inode)->i_sem); if (old_dir_entry) f2fs_i_links_write(new_inode, false); @@ -1076,7 +1076,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_ctime_set_current(old_inode); f2fs_mark_inode_dirty_sync(old_inode, false); f2fs_delete_entry(old_entry, old_page, old_dir, NULL); @@ -1241,7 +1241,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_ctime_set_current(old_dir); if (old_nlink) { f2fs_down_write(&F2FS_I(old_dir)->i_sem); f2fs_i_links_write(old_dir, old_nlink > 0); @@ -1260,7 +1260,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_ctime_set_current(new_dir); if (new_nlink) { f2fs_down_write(&F2FS_I(new_dir)->i_sem); f2fs_i_links_write(new_dir, new_nlink > 0); diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c index 4e7d4ceeb084..5a06dd15453d 100644 --- a/fs/f2fs/recovery.c +++ b/fs/f2fs/recovery.c @@ -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_ctime_set_sec(inode, le64_to_cpu(raw->i_ctime)); 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_ctime_set_nsec(inode, 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; diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index bc15841fd33c..3c6bb358a7a3 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -2702,7 +2702,7 @@ static ssize_t f2fs_quota_write(struct super_block *sb, int type, if (len == towrite) return err; - inode->i_mtime = inode->i_ctime = current_time(inode); + inode->i_mtime = inode_ctime_set_current(inode); f2fs_mark_inode_dirty_sync(inode, false); return len - towrite; } diff --git a/fs/f2fs/xattr.c b/fs/f2fs/xattr.c index bdc8a55085a2..9bc685b33f4d 100644 --- a/fs/f2fs/xattr.c +++ b/fs/f2fs/xattr.c @@ -749,7 +749,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_ctime_set_current(inode); clear_inode_flag(inode, FI_ACL_MODE); } -- 2.41.0
next prev parent reply other threads:[~2023-06-21 14:48 UTC|newest] Thread overview: 229+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-06-21 14:45 [PATCH 00/79] fs: new accessors for inode->i_ctime Jeff Layton 2023-06-21 14:45 ` [Cluster-devel] " Jeff Layton 2023-06-21 14:45 ` [Ocfs2-devel] " Jeff Layton via Ocfs2-devel 2023-06-21 14:45 ` [f2fs-dev] " Jeff Layton 2023-06-21 14:45 ` [PATCH 01/79] fs: add ctime accessors infrastructure Jeff Layton 2023-06-21 14:45 ` [Cluster-devel] " Jeff Layton 2023-06-21 14:45 ` [Ocfs2-devel] " Jeff Layton via Ocfs2-devel 2023-06-21 14:45 ` [f2fs-dev] " Jeff Layton 2023-06-21 16:34 ` Jan Kara 2023-06-21 16:34 ` Jan Kara 2023-06-21 16:34 ` [Cluster-devel] " Jan Kara 2023-06-21 16:34 ` Jan Kara 2023-06-21 16:34 ` Jan Kara 2023-06-21 16:34 ` [Ocfs2-devel] " Jan Kara via Ocfs2-devel 2023-06-21 16:34 ` [f2fs-dev] " Jan Kara 2023-06-21 17:29 ` Tom Talpey 2023-06-21 17:29 ` [Cluster-devel] " Tom Talpey 2023-06-21 17:29 ` [f2fs-dev] " Tom Talpey 2023-06-21 17:29 ` [Ocfs2-devel] " Tom Talpey via Ocfs2-devel 2023-06-21 18:01 ` Jeff Layton 2023-06-21 18:01 ` [Cluster-devel] " Jeff Layton 2023-06-21 18:01 ` [Ocfs2-devel] " Jeff Layton via Ocfs2-devel 2023-06-21 18:01 ` [f2fs-dev] " Jeff Layton 2023-06-21 18:19 ` Tom Talpey 2023-06-21 18:19 ` [Cluster-devel] " Tom Talpey 2023-06-21 18:19 ` [Ocfs2-devel] " Tom Talpey via Ocfs2-devel 2023-06-21 18:19 ` [f2fs-dev] " Tom Talpey 2023-06-21 18:48 ` Jeff Layton 2023-06-21 18:48 ` [Cluster-devel] " Jeff Layton 2023-06-21 18:48 ` [Ocfs2-devel] " Jeff Layton via Ocfs2-devel 2023-06-21 18:48 ` [f2fs-dev] " Jeff Layton 2023-06-22 0:46 ` Damien Le Moal 2023-06-22 0:46 ` [Cluster-devel] " Damien Le Moal 2023-06-22 0:46 ` [Ocfs2-devel] " Damien Le Moal via Ocfs2-devel 2023-06-22 0:46 ` [f2fs-dev] " Damien Le Moal 2023-06-22 10:14 ` Jeff Layton 2023-06-22 10:14 ` [Cluster-devel] " Jeff Layton 2023-06-22 10:14 ` [Ocfs2-devel] " Jeff Layton via Ocfs2-devel 2023-06-22 10:14 ` [f2fs-dev] " Jeff Layton [not found] ` <99b3c749-23d9-6f09-fb75-6a84f3d1b066-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> 2023-06-22 10:14 ` Jeff Layton 2023-06-22 10:14 ` Jeff Layton 2023-06-30 22:12 ` Luis Chamberlain 2023-06-30 22:12 ` Luis Chamberlain 2023-06-30 22:12 ` [Cluster-devel] " Luis Chamberlain 2023-06-30 22:12 ` Luis Chamberlain 2023-06-30 22:12 ` Luis Chamberlain 2023-06-30 22:12 ` [f2fs-dev] " Luis Chamberlain [not found] ` <20230621144507.55591-2-jlayton-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> 2023-07-12 15:31 ` Randy Dunlap 2023-07-12 15:31 ` Randy Dunlap 2023-07-12 15:31 ` [Cluster-devel] " Randy Dunlap 2023-07-12 15:31 ` Randy Dunlap 2023-07-12 15:31 ` Randy Dunlap 2023-07-12 15:34 ` Christian Brauner 2023-07-12 15:34 ` Christian Brauner 2023-07-12 15:31 ` Randy Dunlap 2023-06-21 14:45 ` [PATCH 02/79] spufs: switch to new ctime accessors Jeff Layton 2023-06-21 14:45 ` Jeff Layton 2023-06-21 14:45 ` [PATCH 03/79] s390: " Jeff Layton 2023-06-21 16:34 ` Jan Kara 2023-06-22 17:35 ` Alexander Gordeev 2023-06-22 17:51 ` Jeff Layton 2023-06-22 18:22 ` Alexander Gordeev 2023-06-22 18:46 ` Jeff Layton 2023-06-21 14:45 ` [PATCH 04/79] binderfs: " Jeff Layton 2023-06-21 15:29 ` Greg Kroah-Hartman 2023-06-21 16:35 ` Jan Kara 2023-06-21 14:45 ` [PATCH 05/79] qib_fs: " Jeff Layton 2023-06-21 16:35 ` Jan Kara 2023-06-21 19:37 ` Dennis Dalessandro 2023-06-21 14:45 ` [PATCH 06/79] ibm: " Jeff Layton 2023-06-21 15:29 ` Greg Kroah-Hartman 2023-06-21 16:35 ` Jan Kara 2023-06-21 14:45 ` [PATCH 07/79] usb: " Jeff Layton 2023-06-21 15:29 ` Greg Kroah-Hartman 2023-06-21 16:36 ` Jan Kara 2023-06-21 14:45 ` [PATCH 08/79] 9p: " Jeff Layton 2023-06-21 16:37 ` Jan Kara 2023-06-21 14:45 ` [PATCH 09/79] adfs: " Jeff Layton 2023-06-21 16:38 ` Jan Kara 2023-06-21 14:45 ` [PATCH 10/79] affs: " Jeff Layton 2023-06-21 16:39 ` Jan Kara 2023-06-22 11:37 ` David Sterba 2023-06-21 14:45 ` [PATCH 11/79] afs: " Jeff Layton 2023-06-21 16:43 ` Jan Kara 2023-06-21 14:45 ` [PATCH 12/79] fs: " Jeff Layton 2023-06-21 16:42 ` Jan Kara 2023-06-21 14:45 ` [PATCH 13/79] autofs: " Jeff Layton 2023-06-21 16:43 ` Jan Kara 2023-06-27 1:48 ` Ian Kent 2023-06-21 14:45 ` [PATCH 14/79] befs: " Jeff Layton 2023-06-21 16:44 ` Jan Kara 2023-06-21 14:45 ` [PATCH 15/79] bfs: " Jeff Layton 2023-06-21 16:48 ` Jan Kara 2023-06-21 16:57 ` Jeff Layton 2023-06-22 12:30 ` Jan Kara 2023-06-22 12:51 ` Jeff Layton 2023-06-22 14:57 ` Jan Kara 2023-06-23 12:33 ` Christian Brauner 2023-07-03 10:12 ` Christian Brauner 2023-07-03 10:46 ` Jeff Layton 2023-07-03 10:57 ` Christian Brauner 2023-06-21 14:45 ` [PATCH 16/79] btrfs: " Jeff Layton 2023-06-22 11:42 ` David Sterba 2023-06-21 14:45 ` [PATCH 17/79] ceph: " Jeff Layton 2023-06-26 0:56 ` Xiubo Li 2023-06-21 14:45 ` [PATCH 18/79] coda: " Jeff Layton 2023-06-21 14:45 ` [PATCH 19/79] configfs: " Jeff Layton 2023-06-21 14:45 ` [PATCH 20/79] cramfs: " Jeff Layton 2023-06-21 15:29 ` Nicolas Pitre 2023-06-21 14:45 ` [PATCH 21/79] debugfs: " Jeff Layton 2023-06-21 15:29 ` Greg Kroah-Hartman 2023-06-21 14:45 ` [PATCH 22/79] devpts: " Jeff Layton 2023-06-21 14:45 ` [PATCH 23/79] ecryptfs: " Jeff Layton 2023-06-21 14:45 ` [PATCH 24/79] efivarfs: " Jeff Layton 2023-06-21 14:45 ` [PATCH 25/79] efs: " Jeff Layton 2023-06-21 14:45 ` [PATCH 26/79] erofs: " Jeff Layton 2023-06-21 14:45 ` Jeff Layton 2023-06-22 4:01 ` Gao Xiang 2023-06-22 4:01 ` Gao Xiang 2023-06-21 14:45 ` [PATCH 27/79] exfat: " Jeff Layton 2023-06-21 14:45 ` [PATCH 28/79] ext2: " Jeff Layton 2023-06-21 14:45 ` [PATCH 29/79] ext4: " Jeff Layton 2023-06-21 14:45 ` Jeff Layton [this message] 2023-06-21 14:45 ` [PATCH 30/79] f2fs: " Jeff Layton 2023-06-21 14:45 ` [PATCH 31/79] fat: " Jeff Layton 2023-06-21 14:45 ` [PATCH 32/79] freevxfs: " Jeff Layton 2023-06-21 14:45 ` [PATCH 33/79] fuse: " Jeff Layton 2023-06-21 14:45 ` [PATCH 34/79] gfs2: " Jeff Layton 2023-06-21 14:45 ` [Cluster-devel] " Jeff Layton 2023-06-21 14:45 ` [PATCH 35/79] hfs: " Jeff Layton 2023-06-21 14:45 ` [PATCH 36/79] hfsplus: " Jeff Layton 2023-06-21 14:45 ` [PATCH 37/79] hostfs: " Jeff Layton 2023-06-21 14:45 ` Jeff Layton 2023-06-21 14:45 ` [PATCH 38/79] hpfs: " Jeff Layton 2023-06-21 14:45 ` [PATCH 39/79] hugetlbfs: " Jeff Layton 2023-06-21 14:45 ` [PATCH 40/79] isofs: " Jeff Layton 2023-06-21 14:45 ` [PATCH 41/79] jffs2: " Jeff Layton 2023-06-21 14:45 ` Jeff Layton 2023-06-21 14:45 ` [PATCH 42/79] jfs: " Jeff Layton 2023-06-21 17:47 ` Dave Kleikamp 2023-06-21 14:45 ` [PATCH 43/79] kernfs: " Jeff Layton 2023-06-21 15:30 ` Greg Kroah-Hartman 2023-06-21 14:45 ` [PATCH 44/79] minix: " Jeff Layton 2023-06-21 14:45 ` [PATCH 45/79] nfs: " Jeff Layton 2023-06-21 14:45 ` [PATCH 46/79] nfsd: " Jeff Layton 2023-06-21 17:36 ` Chuck Lever 2023-06-21 14:46 ` [PATCH 47/79] nilfs2: " Jeff Layton 2023-06-21 14:46 ` Jeff Layton 2023-06-26 15:26 ` Ryusuke Konishi 2023-06-26 15:26 ` Ryusuke Konishi 2023-06-21 14:46 ` [PATCH 48/79] ntfs: " Jeff Layton 2023-06-21 14:46 ` [PATCH 49/79] ntfs3: " Jeff Layton 2023-06-21 14:46 ` [Ocfs2-devel] [PATCH 50/79] ocfs2: " Jeff Layton via Ocfs2-devel 2023-06-21 14:46 ` Jeff Layton 2023-06-21 14:46 ` [PATCH 51/79] omfs: " Jeff Layton 2023-06-23 12:12 ` Bob Copeland 2023-06-21 14:46 ` [PATCH 52/79] openpromfs: " Jeff Layton 2023-06-21 14:46 ` [PATCH 53/79] orangefs: " Jeff Layton 2023-06-21 14:46 ` [PATCH 54/79] overlayfs: " Jeff Layton 2023-06-22 6:44 ` Amir Goldstein 2023-06-21 14:46 ` [PATCH 55/79] proc: " Jeff Layton 2023-06-30 22:13 ` Luis Chamberlain 2023-06-21 14:46 ` [PATCH 56/79] pstore: " Jeff Layton 2023-06-21 17:50 ` Kees Cook 2023-06-21 14:46 ` [PATCH 57/79] qnx4: " Jeff Layton 2023-06-23 14:26 ` Anders Larsen 2023-06-21 14:46 ` [PATCH 58/79] qnx6: " Jeff Layton 2023-06-21 14:46 ` [PATCH 59/79] ramfs: " Jeff Layton 2023-06-21 14:46 ` [PATCH 60/79] reiserfs: " Jeff Layton 2023-06-21 14:46 ` [PATCH 61/79] romfs: " Jeff Layton 2023-06-21 14:46 ` [PATCH 62/79] smb: " Jeff Layton 2023-06-21 17:45 ` Tom Talpey 2023-06-23 5:03 ` Sergey Senozhatsky 2023-06-21 14:46 ` [PATCH 63/79] squashfs: " Jeff Layton 2023-06-21 14:46 ` [PATCH 64/79] sysv: " Jeff Layton 2023-06-21 14:46 ` [PATCH 65/79] tracefs: " Jeff Layton 2023-06-21 14:46 ` [PATCH 66/79] ubifs: " Jeff Layton 2023-06-21 14:46 ` Jeff Layton 2023-06-21 14:46 ` [PATCH 67/79] udf: " Jeff Layton 2023-06-21 14:46 ` [PATCH 68/79] ufs: " Jeff Layton 2023-06-21 14:46 ` [PATCH 69/79] vboxsf: " Jeff Layton 2023-06-21 14:46 ` [PATCH 70/79] xfs: " Jeff Layton 2023-06-21 14:46 ` [PATCH 71/79] zonefs: " Jeff Layton 2023-06-22 0:48 ` Damien Le Moal 2023-06-21 14:46 ` [PATCH 72/79] mqueue: " Jeff Layton 2023-06-21 14:46 ` [PATCH 73/79] bpf: " Jeff Layton 2023-06-21 14:46 ` [PATCH 74/79] shmem: " Jeff Layton 2023-06-21 14:46 ` [PATCH 75/79] rpc_pipefs: " Jeff Layton 2023-06-21 14:46 ` [PATCH 76/79] apparmor: " Jeff Layton 2023-06-22 9:04 ` John Johansen 2023-06-21 14:46 ` [PATCH 77/79] security: " Jeff Layton 2023-06-23 14:15 ` Paul Moore 2023-06-21 14:46 ` [PATCH 78/79] selinux: " Jeff Layton 2023-06-23 14:17 ` Paul Moore 2023-06-21 16:34 ` [PATCH 02/79] spufs: " Jan Kara 2023-06-21 16:34 ` Jan Kara 2023-06-22 0:19 ` Jeremy Kerr 2023-06-22 0:19 ` Jeremy Kerr 2023-06-21 14:49 ` [PATCH 79/79] fs: rename i_ctime field to __i_ctime Jeff Layton 2023-06-21 14:49 ` [Cluster-devel] " Jeff Layton 2023-06-21 14:49 ` [Ocfs2-devel] " Jeff Layton via Ocfs2-devel 2023-06-21 14:49 ` [f2fs-dev] " Jeff Layton 2023-06-21 19:21 ` [PATCH 00/79] fs: new accessors for inode->i_ctime Steven Rostedt 2023-06-21 19:21 ` Steven Rostedt 2023-06-21 19:21 ` [Cluster-devel] " Steven Rostedt 2023-06-21 19:21 ` Steven Rostedt 2023-06-21 19:21 ` Steven Rostedt 2023-06-21 19:21 ` [Ocfs2-devel] " Steven Rostedt via Ocfs2-devel 2023-06-21 19:21 ` [f2fs-dev] " Steven Rostedt 2023-06-21 19:52 ` Jeff Layton 2023-06-21 19:52 ` Jeff Layton 2023-06-21 19:52 ` [Cluster-devel] " Jeff Layton 2023-06-21 19:52 ` [Ocfs2-devel] " Jeff Layton via Ocfs2-devel 2023-06-21 19:52 ` Jeff Layton 2023-06-21 19:52 ` Jeff Layton 2023-06-21 19:52 ` [f2fs-dev] " Jeff Layton 2023-06-23 12:41 ` Christian Brauner 2023-06-23 12:41 ` Christian Brauner 2023-06-23 12:41 ` [Cluster-devel] " Christian Brauner 2023-06-23 12:41 ` Christian Brauner 2023-06-23 12:41 ` Christian Brauner 2023-06-23 12:41 ` [Ocfs2-devel] " Christian Brauner via Ocfs2-devel 2023-06-23 12:41 ` [f2fs-dev] " Christian Brauner 2023-06-30 22:11 ` Luis Chamberlain 2023-06-30 22:11 ` Luis Chamberlain 2023-06-30 22:11 ` [Cluster-devel] " Luis Chamberlain 2023-06-30 22:11 ` Luis Chamberlain 2023-06-30 22:11 ` Luis Chamberlain 2023-06-30 22:11 ` [f2fs-dev] " Luis Chamberlain
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20230621144735.55953-29-jlayton@kernel.org \ --to=jlayton@kernel.org \ --cc=brauner@kernel.org \ --cc=chao@kernel.org \ --cc=jack@suse.cz \ --cc=jaegeuk@kernel.org \ --cc=linux-f2fs-devel@lists.sourceforge.net \ --cc=linux-kernel@vger.kernel.org \ --cc=viro@zeniv.linux.org.uk \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.