@@ -201,6 +201,15 @@ xfs_imap_to_bp(
return 0;
}
+void
+xfs_inode_from_disk_timestamp(
+ struct timespec64 *tv,
+ const struct xfs_timestamp *ts)
+{
+ tv->tv_sec = (int)be32_to_cpu(ts->t_sec);
+ tv->tv_nsec = (int)be32_to_cpu(ts->t_nsec);
+}
+
void
xfs_inode_from_disk(
struct xfs_inode *ip,
@@ -236,12 +245,9 @@ xfs_inode_from_disk(
* a time before epoch is converted to a time long after epoch
* on 64 bit systems.
*/
- inode->i_atime.tv_sec = (int)be32_to_cpu(from->di_atime.t_sec);
- inode->i_atime.tv_nsec = (int)be32_to_cpu(from->di_atime.t_nsec);
- inode->i_mtime.tv_sec = (int)be32_to_cpu(from->di_mtime.t_sec);
- inode->i_mtime.tv_nsec = (int)be32_to_cpu(from->di_mtime.t_nsec);
- inode->i_ctime.tv_sec = (int)be32_to_cpu(from->di_ctime.t_sec);
- inode->i_ctime.tv_nsec = (int)be32_to_cpu(from->di_ctime.t_nsec);
+ xfs_inode_from_disk_timestamp(&inode->i_atime, &from->di_atime);
+ xfs_inode_from_disk_timestamp(&inode->i_mtime, &from->di_mtime);
+ xfs_inode_from_disk_timestamp(&inode->i_ctime, &from->di_ctime);
inode->i_generation = be32_to_cpu(from->di_gen);
inode->i_mode = be16_to_cpu(from->di_mode);
@@ -259,13 +265,21 @@ xfs_inode_from_disk(
if (to->di_version == 3) {
inode_set_iversion_queried(inode,
be64_to_cpu(from->di_changecount));
- to->di_crtime.tv_sec = be32_to_cpu(from->di_crtime.t_sec);
- to->di_crtime.tv_nsec = be32_to_cpu(from->di_crtime.t_nsec);
+ xfs_inode_from_disk_timestamp(&to->di_crtime, &from->di_crtime);
to->di_flags2 = be64_to_cpu(from->di_flags2);
to->di_cowextsize = be32_to_cpu(from->di_cowextsize);
}
}
+void
+xfs_inode_to_disk_timestamp(
+ struct xfs_timestamp *ts,
+ const struct timespec64 *tv)
+{
+ ts->t_sec = cpu_to_be32(tv->tv_sec);
+ ts->t_nsec = cpu_to_be32(tv->tv_nsec);
+}
+
void
xfs_inode_to_disk(
struct xfs_inode *ip,
@@ -286,12 +300,9 @@ xfs_inode_to_disk(
to->di_projid_hi = cpu_to_be16(from->di_projid >> 16);
memset(to->di_pad, 0, sizeof(to->di_pad));
- to->di_atime.t_sec = cpu_to_be32(inode->i_atime.tv_sec);
- to->di_atime.t_nsec = cpu_to_be32(inode->i_atime.tv_nsec);
- to->di_mtime.t_sec = cpu_to_be32(inode->i_mtime.tv_sec);
- to->di_mtime.t_nsec = cpu_to_be32(inode->i_mtime.tv_nsec);
- to->di_ctime.t_sec = cpu_to_be32(inode->i_ctime.tv_sec);
- to->di_ctime.t_nsec = cpu_to_be32(inode->i_ctime.tv_nsec);
+ xfs_inode_to_disk_timestamp(&to->di_atime, &inode->i_atime);
+ xfs_inode_to_disk_timestamp(&to->di_mtime, &inode->i_mtime);
+ xfs_inode_to_disk_timestamp(&to->di_ctime, &inode->i_ctime);
to->di_nlink = cpu_to_be32(inode->i_nlink);
to->di_gen = cpu_to_be32(inode->i_generation);
to->di_mode = cpu_to_be16(inode->i_mode);
@@ -309,8 +320,7 @@ xfs_inode_to_disk(
if (from->di_version == 3) {
to->di_changecount = cpu_to_be64(inode_peek_iversion(inode));
- to->di_crtime.t_sec = cpu_to_be32(from->di_crtime.tv_sec);
- to->di_crtime.t_nsec = cpu_to_be32(from->di_crtime.tv_nsec);
+ xfs_inode_to_disk_timestamp(&to->di_crtime, &from->di_crtime);
to->di_flags2 = cpu_to_be64(from->di_flags2);
to->di_cowextsize = cpu_to_be32(from->di_cowextsize);
to->di_ino = cpu_to_be64(ip->i_ino);
@@ -75,4 +75,9 @@ xfs_failaddr_t xfs_inode_validate_cowextsize(struct xfs_mount *mp,
uint32_t cowextsize, uint16_t mode, uint16_t flags,
uint64_t flags2);
+void xfs_inode_from_disk_timestamp(struct timespec64 *tv,
+ const struct xfs_timestamp *ts);
+void xfs_inode_to_disk_timestamp(struct xfs_timestamp *ts,
+ const struct timespec64 *tv);
+
#endif /* __XFS_INODE_BUF_H__ */
@@ -195,6 +195,19 @@ xchk_inode_flags2(
xchk_ino_set_corrupt(sc, ino);
}
+static inline void
+xchk_dinode_nsec(
+ struct xfs_scrub *sc,
+ xfs_ino_t ino,
+ const struct xfs_timestamp *ts)
+{
+ struct timespec64 tv;
+
+ xfs_inode_from_disk_timestamp(&tv, ts);
+ if (tv.tv_nsec < 0 || tv.tv_nsec >= NSEC_PER_SEC)
+ xchk_ino_set_corrupt(sc, ino);
+}
+
/* Scrub all the ondisk inode fields. */
STATIC void
xchk_dinode(
@@ -293,12 +306,9 @@ xchk_dinode(
}
/* di_[amc]time.nsec */
- if (be32_to_cpu(dip->di_atime.t_nsec) >= NSEC_PER_SEC)
- xchk_ino_set_corrupt(sc, ino);
- if (be32_to_cpu(dip->di_mtime.t_nsec) >= NSEC_PER_SEC)
- xchk_ino_set_corrupt(sc, ino);
- if (be32_to_cpu(dip->di_ctime.t_nsec) >= NSEC_PER_SEC)
- xchk_ino_set_corrupt(sc, ino);
+ xchk_dinode_nsec(sc, ino, &dip->di_atime);
+ xchk_dinode_nsec(sc, ino, &dip->di_mtime);
+ xchk_dinode_nsec(sc, ino, &dip->di_ctime);
/*
* di_size. xfs_dinode_verify checks for things that screw up
@@ -403,8 +413,7 @@ xchk_dinode(
}
if (dip->di_version >= 3) {
- if (be32_to_cpu(dip->di_crtime.t_nsec) >= NSEC_PER_SEC)
- xchk_ino_set_corrupt(sc, ino);
+ xchk_dinode_nsec(sc, ino, &dip->di_crtime);
xchk_inode_flags2(sc, dip, ino, mode, flags, flags2);
xchk_inode_cowextsize(sc, dip, ino, mode, flags,
flags2);
@@ -295,6 +295,15 @@ xfs_inode_item_format_attr_fork(
}
}
+static inline void
+xfs_from_log_timestamp(
+ struct xfs_timestamp *ts,
+ const struct xfs_ictimestamp *its)
+{
+ ts->t_sec = cpu_to_be32(its->t_sec);
+ ts->t_nsec = cpu_to_be32(its->t_nsec);
+}
+
void
xfs_log_dinode_to_disk(
struct xfs_log_dinode *from,
@@ -312,12 +321,9 @@ xfs_log_dinode_to_disk(
to->di_projid_hi = cpu_to_be16(from->di_projid_hi);
memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad));
- to->di_atime.t_sec = cpu_to_be32(from->di_atime.t_sec);
- to->di_atime.t_nsec = cpu_to_be32(from->di_atime.t_nsec);
- to->di_mtime.t_sec = cpu_to_be32(from->di_mtime.t_sec);
- to->di_mtime.t_nsec = cpu_to_be32(from->di_mtime.t_nsec);
- to->di_ctime.t_sec = cpu_to_be32(from->di_ctime.t_sec);
- to->di_ctime.t_nsec = cpu_to_be32(from->di_ctime.t_nsec);
+ xfs_from_log_timestamp(&to->di_atime, &from->di_atime);
+ xfs_from_log_timestamp(&to->di_mtime, &from->di_mtime);
+ xfs_from_log_timestamp(&to->di_ctime, &from->di_ctime);
to->di_size = cpu_to_be64(from->di_size);
to->di_nblocks = cpu_to_be64(from->di_nblocks);
@@ -333,8 +339,7 @@ xfs_log_dinode_to_disk(
if (from->di_version == 3) {
to->di_changecount = cpu_to_be64(from->di_changecount);
- to->di_crtime.t_sec = cpu_to_be32(from->di_crtime.t_sec);
- to->di_crtime.t_nsec = cpu_to_be32(from->di_crtime.t_nsec);
+ xfs_from_log_timestamp(&to->di_crtime, &from->di_crtime);
to->di_flags2 = cpu_to_be64(from->di_flags2);
to->di_cowextsize = cpu_to_be32(from->di_cowextsize);
to->di_ino = cpu_to_be64(from->di_ino);
@@ -347,6 +352,15 @@ xfs_log_dinode_to_disk(
}
}
+static inline void
+xfs_to_log_timestamp(
+ struct xfs_ictimestamp *its,
+ const struct timespec64 *ts)
+{
+ its->t_sec = ts->tv_sec;
+ its->t_nsec = ts->tv_nsec;
+}
+
static void
xfs_inode_to_log_dinode(
struct xfs_inode *ip,
@@ -367,12 +381,9 @@ xfs_inode_to_log_dinode(
memset(to->di_pad, 0, sizeof(to->di_pad));
memset(to->di_pad3, 0, sizeof(to->di_pad3));
- to->di_atime.t_sec = inode->i_atime.tv_sec;
- to->di_atime.t_nsec = inode->i_atime.tv_nsec;
- to->di_mtime.t_sec = inode->i_mtime.tv_sec;
- to->di_mtime.t_nsec = inode->i_mtime.tv_nsec;
- to->di_ctime.t_sec = inode->i_ctime.tv_sec;
- to->di_ctime.t_nsec = inode->i_ctime.tv_nsec;
+ xfs_to_log_timestamp(&to->di_atime, &inode->i_atime);
+ xfs_to_log_timestamp(&to->di_mtime, &inode->i_mtime);
+ xfs_to_log_timestamp(&to->di_ctime, &inode->i_ctime);
to->di_nlink = inode->i_nlink;
to->di_gen = inode->i_generation;
to->di_mode = inode->i_mode;
@@ -393,8 +404,7 @@ xfs_inode_to_log_dinode(
if (from->di_version == 3) {
to->di_changecount = inode_peek_iversion(inode);
- to->di_crtime.t_sec = from->di_crtime.tv_sec;
- to->di_crtime.t_nsec = from->di_crtime.tv_nsec;
+ xfs_to_log_timestamp(&to->di_crtime, &from->di_crtime);
to->di_flags2 = from->di_flags2;
to->di_cowextsize = from->di_cowextsize;
to->di_ino = ip->i_ino;