|
@@ -195,10 +195,13 @@ xfs_imap_to_bp(
|
|
|
}
|
|
|
|
|
|
void
|
|
|
-xfs_dinode_from_disk(
|
|
|
- struct xfs_icdinode *to,
|
|
|
+xfs_inode_from_disk(
|
|
|
+ struct xfs_inode *ip,
|
|
|
struct xfs_dinode *from)
|
|
|
{
|
|
|
+ struct xfs_icdinode *to = &ip->i_d;
|
|
|
+ struct inode *inode = VFS_I(ip);
|
|
|
+
|
|
|
to->di_magic = be16_to_cpu(from->di_magic);
|
|
|
to->di_mode = be16_to_cpu(from->di_mode);
|
|
|
to->di_version = from ->di_version;
|
|
@@ -211,12 +214,20 @@ xfs_dinode_from_disk(
|
|
|
to->di_projid_hi = be16_to_cpu(from->di_projid_hi);
|
|
|
memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad));
|
|
|
to->di_flushiter = be16_to_cpu(from->di_flushiter);
|
|
|
- to->di_atime.t_sec = be32_to_cpu(from->di_atime.t_sec);
|
|
|
- to->di_atime.t_nsec = be32_to_cpu(from->di_atime.t_nsec);
|
|
|
- to->di_mtime.t_sec = be32_to_cpu(from->di_mtime.t_sec);
|
|
|
- to->di_mtime.t_nsec = be32_to_cpu(from->di_mtime.t_nsec);
|
|
|
- to->di_ctime.t_sec = be32_to_cpu(from->di_ctime.t_sec);
|
|
|
- to->di_ctime.t_nsec = be32_to_cpu(from->di_ctime.t_nsec);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Time is signed, so need to convert to signed 32 bit before
|
|
|
+ * storing in inode timestamp which may be 64 bit. Otherwise
|
|
|
+ * 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);
|
|
|
+
|
|
|
to->di_size = be64_to_cpu(from->di_size);
|
|
|
to->di_nblocks = be64_to_cpu(from->di_nblocks);
|
|
|
to->di_extsize = be32_to_cpu(from->di_extsize);
|
|
@@ -242,9 +253,63 @@ xfs_dinode_from_disk(
|
|
|
}
|
|
|
|
|
|
void
|
|
|
-xfs_dinode_to_disk(
|
|
|
- struct xfs_dinode *to,
|
|
|
- struct xfs_icdinode *from)
|
|
|
+xfs_inode_to_disk(
|
|
|
+ struct xfs_inode *ip,
|
|
|
+ struct xfs_dinode *to)
|
|
|
+{
|
|
|
+ struct xfs_icdinode *from = &ip->i_d;
|
|
|
+ struct inode *inode = VFS_I(ip);
|
|
|
+
|
|
|
+ to->di_magic = cpu_to_be16(from->di_magic);
|
|
|
+ to->di_mode = cpu_to_be16(from->di_mode);
|
|
|
+ to->di_version = from ->di_version;
|
|
|
+ to->di_format = from->di_format;
|
|
|
+ to->di_onlink = cpu_to_be16(from->di_onlink);
|
|
|
+ to->di_uid = cpu_to_be32(from->di_uid);
|
|
|
+ to->di_gid = cpu_to_be32(from->di_gid);
|
|
|
+ to->di_nlink = cpu_to_be32(from->di_nlink);
|
|
|
+ to->di_projid_lo = cpu_to_be16(from->di_projid_lo);
|
|
|
+ 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(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);
|
|
|
+
|
|
|
+ to->di_size = cpu_to_be64(from->di_size);
|
|
|
+ to->di_nblocks = cpu_to_be64(from->di_nblocks);
|
|
|
+ to->di_extsize = cpu_to_be32(from->di_extsize);
|
|
|
+ to->di_nextents = cpu_to_be32(from->di_nextents);
|
|
|
+ to->di_anextents = cpu_to_be16(from->di_anextents);
|
|
|
+ to->di_forkoff = from->di_forkoff;
|
|
|
+ to->di_aformat = from->di_aformat;
|
|
|
+ to->di_dmevmask = cpu_to_be32(from->di_dmevmask);
|
|
|
+ to->di_dmstate = cpu_to_be16(from->di_dmstate);
|
|
|
+ to->di_flags = cpu_to_be16(from->di_flags);
|
|
|
+ to->di_gen = cpu_to_be32(from->di_gen);
|
|
|
+
|
|
|
+ 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);
|
|
|
+ to->di_flags2 = cpu_to_be64(from->di_flags2);
|
|
|
+ to->di_ino = cpu_to_be64(from->di_ino);
|
|
|
+ to->di_lsn = cpu_to_be64(from->di_lsn);
|
|
|
+ memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2));
|
|
|
+ uuid_copy(&to->di_uuid, &from->di_uuid);
|
|
|
+ to->di_flushiter = 0;
|
|
|
+ } else {
|
|
|
+ to->di_flushiter = cpu_to_be16(from->di_flushiter);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void
|
|
|
+xfs_log_dinode_to_disk(
|
|
|
+ struct xfs_log_dinode *from,
|
|
|
+ struct xfs_dinode *to)
|
|
|
{
|
|
|
to->di_magic = cpu_to_be16(from->di_magic);
|
|
|
to->di_mode = cpu_to_be16(from->di_mode);
|
|
@@ -257,12 +322,14 @@ xfs_dinode_to_disk(
|
|
|
to->di_projid_lo = cpu_to_be16(from->di_projid_lo);
|
|
|
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);
|
|
|
+
|
|
|
to->di_size = cpu_to_be64(from->di_size);
|
|
|
to->di_nblocks = cpu_to_be64(from->di_nblocks);
|
|
|
to->di_extsize = cpu_to_be32(from->di_extsize);
|
|
@@ -403,7 +470,7 @@ xfs_iread(
|
|
|
* Otherwise, just get the truly permanent information.
|
|
|
*/
|
|
|
if (dip->di_mode) {
|
|
|
- xfs_dinode_from_disk(&ip->i_d, dip);
|
|
|
+ xfs_inode_from_disk(ip, dip);
|
|
|
error = xfs_iformat_fork(ip, dip);
|
|
|
if (error) {
|
|
|
#ifdef DEBUG
|