udf: convert inode stamps to timespec64
authorArnd Bergmann <arnd@arndb.de>
Wed, 20 Jun 2018 08:15:13 +0000 (10:15 +0200)
committerJan Kara <jack@suse.cz>
Wed, 27 Jun 2018 11:58:00 +0000 (13:58 +0200)
The VFS structures are finally converted to always use 64-bit timestamps,
and this file system can represent a long range of on-disk timestamps
already, so now let's fit in the missing bits for udf.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Jan Kara <jack@suse.cz>
fs/udf/ialloc.c
fs/udf/inode.c
fs/udf/super.c
fs/udf/udf_i.h
fs/udf/udf_sb.h
fs/udf/udfdecl.h
fs/udf/udftime.c

index 5656902..f8e5872 100644 (file)
@@ -125,7 +125,7 @@ struct inode *udf_new_inode(struct inode *dir, umode_t mode)
        else
                iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG;
        inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
-       iinfo->i_crtime = timespec64_to_timespec(inode->i_mtime);
+       iinfo->i_crtime = inode->i_mtime;
        if (unlikely(insert_inode_locked(inode) < 0)) {
                make_bad_inode(inode);
                iput(inode);
index 9915a58..5df554a 100644 (file)
@@ -1270,7 +1270,6 @@ static int udf_read_inode(struct inode *inode, bool hidden_inode)
        struct udf_inode_info *iinfo = UDF_I(inode);
        struct udf_sb_info *sbi = UDF_SB(inode->i_sb);
        struct kernel_lb_addr *iloc = &iinfo->i_location;
-       struct timespec ts;
        unsigned int link_count;
        unsigned int indirections = 0;
        int bs = inode->i_sb->s_blocksize;
@@ -1443,12 +1442,9 @@ reread:
                inode->i_blocks = le64_to_cpu(fe->logicalBlocksRecorded) <<
                        (inode->i_sb->s_blocksize_bits - 9);
 
-               udf_disk_stamp_to_time(&ts, fe->accessTime);
-               inode->i_atime = timespec_to_timespec64(ts);
-               udf_disk_stamp_to_time(&ts, fe->modificationTime);
-               inode->i_mtime = timespec_to_timespec64(ts);
-               udf_disk_stamp_to_time(&ts, fe->attrTime);
-               inode->i_ctime = timespec_to_timespec64(ts);
+               udf_disk_stamp_to_time(&inode->i_atime, fe->accessTime);
+               udf_disk_stamp_to_time(&inode->i_mtime, fe->modificationTime);
+               udf_disk_stamp_to_time(&inode->i_ctime, fe->attrTime);
 
                iinfo->i_unique = le64_to_cpu(fe->uniqueID);
                iinfo->i_lenEAttr = le32_to_cpu(fe->lengthExtendedAttr);
@@ -1458,13 +1454,10 @@ reread:
                inode->i_blocks = le64_to_cpu(efe->logicalBlocksRecorded) <<
                    (inode->i_sb->s_blocksize_bits - 9);
 
-               udf_disk_stamp_to_time(&ts, efe->accessTime);
-               inode->i_atime = timespec_to_timespec64(ts);
-               udf_disk_stamp_to_time(&ts, efe->modificationTime);
-               inode->i_mtime = timespec_to_timespec64(ts);
+               udf_disk_stamp_to_time(&inode->i_atime, efe->accessTime);
+               udf_disk_stamp_to_time(&inode->i_mtime, efe->modificationTime);
                udf_disk_stamp_to_time(&iinfo->i_crtime, efe->createTime);
-               udf_disk_stamp_to_time(&ts, efe->attrTime);
-               inode->i_ctime = timespec_to_timespec64(ts);
+               udf_disk_stamp_to_time(&inode->i_ctime, efe->attrTime);
 
                iinfo->i_unique = le64_to_cpu(efe->uniqueID);
                iinfo->i_lenEAttr = le32_to_cpu(efe->lengthExtendedAttr);
@@ -1601,7 +1594,7 @@ static int udf_sync_inode(struct inode *inode)
        return udf_update_inode(inode, 1);
 }
 
-static void udf_adjust_time(struct udf_inode_info *iinfo, struct timespec time)
+static void udf_adjust_time(struct udf_inode_info *iinfo, struct timespec64 time)
 {
        if (iinfo->i_crtime.tv_sec > time.tv_sec ||
            (iinfo->i_crtime.tv_sec == time.tv_sec &&
@@ -1714,12 +1707,9 @@ static int udf_update_inode(struct inode *inode, int do_sync)
                       inode->i_sb->s_blocksize - sizeof(struct fileEntry));
                fe->logicalBlocksRecorded = cpu_to_le64(lb_recorded);
 
-               udf_time_to_disk_stamp(&fe->accessTime,
-                                      timespec64_to_timespec(inode->i_atime));
-               udf_time_to_disk_stamp(&fe->modificationTime,
-                                      timespec64_to_timespec(inode->i_mtime));
-               udf_time_to_disk_stamp(&fe->attrTime,
-                                      timespec64_to_timespec(inode->i_ctime));
+               udf_time_to_disk_stamp(&fe->accessTime, inode->i_atime);
+               udf_time_to_disk_stamp(&fe->modificationTime, inode->i_mtime);
+               udf_time_to_disk_stamp(&fe->attrTime, inode->i_ctime);
                memset(&(fe->impIdent), 0, sizeof(struct regid));
                strcpy(fe->impIdent.ident, UDF_ID_DEVELOPER);
                fe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
@@ -1738,17 +1728,14 @@ static int udf_update_inode(struct inode *inode, int do_sync)
                efe->objectSize = cpu_to_le64(inode->i_size);
                efe->logicalBlocksRecorded = cpu_to_le64(lb_recorded);
 
-               udf_adjust_time(iinfo, timespec64_to_timespec(inode->i_atime));
-               udf_adjust_time(iinfo, timespec64_to_timespec(inode->i_mtime));
-               udf_adjust_time(iinfo, timespec64_to_timespec(inode->i_ctime));
+               udf_adjust_time(iinfo, inode->i_atime);
+               udf_adjust_time(iinfo, inode->i_mtime);
+               udf_adjust_time(iinfo, inode->i_ctime);
 
-               udf_time_to_disk_stamp(&efe->accessTime,
-                                      timespec64_to_timespec(inode->i_atime));
-               udf_time_to_disk_stamp(&efe->modificationTime,
-                                      timespec64_to_timespec(inode->i_mtime));
+               udf_time_to_disk_stamp(&efe->accessTime, inode->i_atime);
+               udf_time_to_disk_stamp(&efe->modificationTime, inode->i_mtime);
                udf_time_to_disk_stamp(&efe->createTime, iinfo->i_crtime);
-               udf_time_to_disk_stamp(&efe->attrTime,
-                                      timespec64_to_timespec(inode->i_ctime));
+               udf_time_to_disk_stamp(&efe->attrTime, inode->i_ctime);
 
                memset(&(efe->impIdent), 0, sizeof(efe->impIdent));
                strcpy(efe->impIdent.ident, UDF_ID_DEVELOPER);
index 0c504c8..3040dc2 100644 (file)
@@ -1980,7 +1980,7 @@ static void udf_open_lvid(struct super_block *sb)
        struct buffer_head *bh = sbi->s_lvid_bh;
        struct logicalVolIntegrityDesc *lvid;
        struct logicalVolIntegrityDescImpUse *lvidiu;
-       struct timespec ts;
+       struct timespec64 ts;
 
        if (!bh)
                return;
@@ -1992,7 +1992,7 @@ static void udf_open_lvid(struct super_block *sb)
        mutex_lock(&sbi->s_alloc_mutex);
        lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
        lvidiu->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
-       ktime_get_real_ts(&ts);
+       ktime_get_real_ts64(&ts);
        udf_time_to_disk_stamp(&lvid->recordingDateAndTime, ts);
        if (le32_to_cpu(lvid->integrityType) == LVID_INTEGRITY_TYPE_CLOSE)
                lvid->integrityType = cpu_to_le32(LVID_INTEGRITY_TYPE_OPEN);
@@ -2017,7 +2017,7 @@ static void udf_close_lvid(struct super_block *sb)
        struct buffer_head *bh = sbi->s_lvid_bh;
        struct logicalVolIntegrityDesc *lvid;
        struct logicalVolIntegrityDescImpUse *lvidiu;
-       struct timespec ts;
+       struct timespec64 ts;
 
        if (!bh)
                return;
@@ -2029,7 +2029,7 @@ static void udf_close_lvid(struct super_block *sb)
        mutex_lock(&sbi->s_alloc_mutex);
        lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
        lvidiu->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
-       ktime_get_real_ts(&ts);
+       ktime_get_real_ts64(&ts);
        udf_time_to_disk_stamp(&lvid->recordingDateAndTime, ts);
        if (UDF_MAX_WRITE_VERSION > le16_to_cpu(lvidiu->maxUDFWriteRev))
                lvidiu->maxUDFWriteRev = cpu_to_le16(UDF_MAX_WRITE_VERSION);
index 630426f..2ef0e21 100644 (file)
@@ -28,7 +28,7 @@ struct udf_ext_cache {
  */
 
 struct udf_inode_info {
-       struct timespec         i_crtime;
+       struct timespec64       i_crtime;
        /* Physical address of inode */
        struct kernel_lb_addr           i_location;
        __u64                   i_unique;
index 9dd3e1b..9424d7c 100644 (file)
@@ -138,7 +138,7 @@ struct udf_sb_info {
        rwlock_t                s_cred_lock;
 
        /* Root Info */
-       struct timespec         s_record_time;
+       struct timespec64       s_record_time;
 
        /* Fileset Info */
        __u16                   s_serial_number;
index 84c47dd..ee24676 100644 (file)
@@ -258,8 +258,8 @@ extern struct long_ad *udf_get_filelongad(uint8_t *, int, uint32_t *, int);
 extern struct short_ad *udf_get_fileshortad(uint8_t *, int, uint32_t *, int);
 
 /* udftime.c */
-extern void udf_disk_stamp_to_time(struct timespec *dest,
+extern void udf_disk_stamp_to_time(struct timespec64 *dest,
                                                struct timestamp src);
-extern void udf_time_to_disk_stamp(struct timestamp *dest, struct timespec src);
+extern void udf_time_to_disk_stamp(struct timestamp *dest, struct timespec64 src);
 
 #endif                         /* __UDF_DECL_H */
index 67b33ac..fce4ad9 100644 (file)
@@ -41,7 +41,7 @@
 #include <linux/time.h>
 
 void
-udf_disk_stamp_to_time(struct timespec *dest, struct timestamp src)
+udf_disk_stamp_to_time(struct timespec64 *dest, struct timestamp src)
 {
        u16 typeAndTimezone = le16_to_cpu(src.typeAndTimezone);
        u16 year = le16_to_cpu(src.year);
@@ -70,9 +70,9 @@ udf_disk_stamp_to_time(struct timespec *dest, struct timestamp src)
 }
 
 void
-udf_time_to_disk_stamp(struct timestamp *dest, struct timespec ts)
+udf_time_to_disk_stamp(struct timestamp *dest, struct timespec64 ts)
 {
-       long seconds;
+       time64_t seconds;
        int16_t offset;
        struct tm tm;