udf: convert inode stamps to timespec64
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>
This commit is contained in:
parent
813835028e
commit
c3b9cecd89
|
@ -125,7 +125,7 @@ struct inode *udf_new_inode(struct inode *dir, umode_t mode)
|
||||||
else
|
else
|
||||||
iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG;
|
iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG;
|
||||||
inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
|
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)) {
|
if (unlikely(insert_inode_locked(inode) < 0)) {
|
||||||
make_bad_inode(inode);
|
make_bad_inode(inode);
|
||||||
iput(inode);
|
iput(inode);
|
||||||
|
|
|
@ -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_inode_info *iinfo = UDF_I(inode);
|
||||||
struct udf_sb_info *sbi = UDF_SB(inode->i_sb);
|
struct udf_sb_info *sbi = UDF_SB(inode->i_sb);
|
||||||
struct kernel_lb_addr *iloc = &iinfo->i_location;
|
struct kernel_lb_addr *iloc = &iinfo->i_location;
|
||||||
struct timespec ts;
|
|
||||||
unsigned int link_count;
|
unsigned int link_count;
|
||||||
unsigned int indirections = 0;
|
unsigned int indirections = 0;
|
||||||
int bs = inode->i_sb->s_blocksize;
|
int bs = inode->i_sb->s_blocksize;
|
||||||
|
@ -1443,12 +1442,9 @@ reread:
|
||||||
inode->i_blocks = le64_to_cpu(fe->logicalBlocksRecorded) <<
|
inode->i_blocks = le64_to_cpu(fe->logicalBlocksRecorded) <<
|
||||||
(inode->i_sb->s_blocksize_bits - 9);
|
(inode->i_sb->s_blocksize_bits - 9);
|
||||||
|
|
||||||
udf_disk_stamp_to_time(&ts, fe->accessTime);
|
udf_disk_stamp_to_time(&inode->i_atime, fe->accessTime);
|
||||||
inode->i_atime = timespec_to_timespec64(ts);
|
udf_disk_stamp_to_time(&inode->i_mtime, fe->modificationTime);
|
||||||
udf_disk_stamp_to_time(&ts, fe->modificationTime);
|
udf_disk_stamp_to_time(&inode->i_ctime, fe->attrTime);
|
||||||
inode->i_mtime = timespec_to_timespec64(ts);
|
|
||||||
udf_disk_stamp_to_time(&ts, fe->attrTime);
|
|
||||||
inode->i_ctime = timespec_to_timespec64(ts);
|
|
||||||
|
|
||||||
iinfo->i_unique = le64_to_cpu(fe->uniqueID);
|
iinfo->i_unique = le64_to_cpu(fe->uniqueID);
|
||||||
iinfo->i_lenEAttr = le32_to_cpu(fe->lengthExtendedAttr);
|
iinfo->i_lenEAttr = le32_to_cpu(fe->lengthExtendedAttr);
|
||||||
|
@ -1458,13 +1454,10 @@ reread:
|
||||||
inode->i_blocks = le64_to_cpu(efe->logicalBlocksRecorded) <<
|
inode->i_blocks = le64_to_cpu(efe->logicalBlocksRecorded) <<
|
||||||
(inode->i_sb->s_blocksize_bits - 9);
|
(inode->i_sb->s_blocksize_bits - 9);
|
||||||
|
|
||||||
udf_disk_stamp_to_time(&ts, efe->accessTime);
|
udf_disk_stamp_to_time(&inode->i_atime, efe->accessTime);
|
||||||
inode->i_atime = timespec_to_timespec64(ts);
|
udf_disk_stamp_to_time(&inode->i_mtime, efe->modificationTime);
|
||||||
udf_disk_stamp_to_time(&ts, efe->modificationTime);
|
|
||||||
inode->i_mtime = timespec_to_timespec64(ts);
|
|
||||||
udf_disk_stamp_to_time(&iinfo->i_crtime, efe->createTime);
|
udf_disk_stamp_to_time(&iinfo->i_crtime, efe->createTime);
|
||||||
udf_disk_stamp_to_time(&ts, efe->attrTime);
|
udf_disk_stamp_to_time(&inode->i_ctime, efe->attrTime);
|
||||||
inode->i_ctime = timespec_to_timespec64(ts);
|
|
||||||
|
|
||||||
iinfo->i_unique = le64_to_cpu(efe->uniqueID);
|
iinfo->i_unique = le64_to_cpu(efe->uniqueID);
|
||||||
iinfo->i_lenEAttr = le32_to_cpu(efe->lengthExtendedAttr);
|
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);
|
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 ||
|
if (iinfo->i_crtime.tv_sec > time.tv_sec ||
|
||||||
(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));
|
inode->i_sb->s_blocksize - sizeof(struct fileEntry));
|
||||||
fe->logicalBlocksRecorded = cpu_to_le64(lb_recorded);
|
fe->logicalBlocksRecorded = cpu_to_le64(lb_recorded);
|
||||||
|
|
||||||
udf_time_to_disk_stamp(&fe->accessTime,
|
udf_time_to_disk_stamp(&fe->accessTime, inode->i_atime);
|
||||||
timespec64_to_timespec(inode->i_atime));
|
udf_time_to_disk_stamp(&fe->modificationTime, inode->i_mtime);
|
||||||
udf_time_to_disk_stamp(&fe->modificationTime,
|
udf_time_to_disk_stamp(&fe->attrTime, inode->i_ctime);
|
||||||
timespec64_to_timespec(inode->i_mtime));
|
|
||||||
udf_time_to_disk_stamp(&fe->attrTime,
|
|
||||||
timespec64_to_timespec(inode->i_ctime));
|
|
||||||
memset(&(fe->impIdent), 0, sizeof(struct regid));
|
memset(&(fe->impIdent), 0, sizeof(struct regid));
|
||||||
strcpy(fe->impIdent.ident, UDF_ID_DEVELOPER);
|
strcpy(fe->impIdent.ident, UDF_ID_DEVELOPER);
|
||||||
fe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
|
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->objectSize = cpu_to_le64(inode->i_size);
|
||||||
efe->logicalBlocksRecorded = cpu_to_le64(lb_recorded);
|
efe->logicalBlocksRecorded = cpu_to_le64(lb_recorded);
|
||||||
|
|
||||||
udf_adjust_time(iinfo, timespec64_to_timespec(inode->i_atime));
|
udf_adjust_time(iinfo, inode->i_atime);
|
||||||
udf_adjust_time(iinfo, timespec64_to_timespec(inode->i_mtime));
|
udf_adjust_time(iinfo, inode->i_mtime);
|
||||||
udf_adjust_time(iinfo, timespec64_to_timespec(inode->i_ctime));
|
udf_adjust_time(iinfo, inode->i_ctime);
|
||||||
|
|
||||||
udf_time_to_disk_stamp(&efe->accessTime,
|
udf_time_to_disk_stamp(&efe->accessTime, inode->i_atime);
|
||||||
timespec64_to_timespec(inode->i_atime));
|
udf_time_to_disk_stamp(&efe->modificationTime, inode->i_mtime);
|
||||||
udf_time_to_disk_stamp(&efe->modificationTime,
|
|
||||||
timespec64_to_timespec(inode->i_mtime));
|
|
||||||
udf_time_to_disk_stamp(&efe->createTime, iinfo->i_crtime);
|
udf_time_to_disk_stamp(&efe->createTime, iinfo->i_crtime);
|
||||||
udf_time_to_disk_stamp(&efe->attrTime,
|
udf_time_to_disk_stamp(&efe->attrTime, inode->i_ctime);
|
||||||
timespec64_to_timespec(inode->i_ctime));
|
|
||||||
|
|
||||||
memset(&(efe->impIdent), 0, sizeof(efe->impIdent));
|
memset(&(efe->impIdent), 0, sizeof(efe->impIdent));
|
||||||
strcpy(efe->impIdent.ident, UDF_ID_DEVELOPER);
|
strcpy(efe->impIdent.ident, UDF_ID_DEVELOPER);
|
||||||
|
|
|
@ -1980,7 +1980,7 @@ static void udf_open_lvid(struct super_block *sb)
|
||||||
struct buffer_head *bh = sbi->s_lvid_bh;
|
struct buffer_head *bh = sbi->s_lvid_bh;
|
||||||
struct logicalVolIntegrityDesc *lvid;
|
struct logicalVolIntegrityDesc *lvid;
|
||||||
struct logicalVolIntegrityDescImpUse *lvidiu;
|
struct logicalVolIntegrityDescImpUse *lvidiu;
|
||||||
struct timespec ts;
|
struct timespec64 ts;
|
||||||
|
|
||||||
if (!bh)
|
if (!bh)
|
||||||
return;
|
return;
|
||||||
|
@ -1992,7 +1992,7 @@ static void udf_open_lvid(struct super_block *sb)
|
||||||
mutex_lock(&sbi->s_alloc_mutex);
|
mutex_lock(&sbi->s_alloc_mutex);
|
||||||
lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
|
lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
|
||||||
lvidiu->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
|
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);
|
udf_time_to_disk_stamp(&lvid->recordingDateAndTime, ts);
|
||||||
if (le32_to_cpu(lvid->integrityType) == LVID_INTEGRITY_TYPE_CLOSE)
|
if (le32_to_cpu(lvid->integrityType) == LVID_INTEGRITY_TYPE_CLOSE)
|
||||||
lvid->integrityType = cpu_to_le32(LVID_INTEGRITY_TYPE_OPEN);
|
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 buffer_head *bh = sbi->s_lvid_bh;
|
||||||
struct logicalVolIntegrityDesc *lvid;
|
struct logicalVolIntegrityDesc *lvid;
|
||||||
struct logicalVolIntegrityDescImpUse *lvidiu;
|
struct logicalVolIntegrityDescImpUse *lvidiu;
|
||||||
struct timespec ts;
|
struct timespec64 ts;
|
||||||
|
|
||||||
if (!bh)
|
if (!bh)
|
||||||
return;
|
return;
|
||||||
|
@ -2029,7 +2029,7 @@ static void udf_close_lvid(struct super_block *sb)
|
||||||
mutex_lock(&sbi->s_alloc_mutex);
|
mutex_lock(&sbi->s_alloc_mutex);
|
||||||
lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
|
lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
|
||||||
lvidiu->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
|
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);
|
udf_time_to_disk_stamp(&lvid->recordingDateAndTime, ts);
|
||||||
if (UDF_MAX_WRITE_VERSION > le16_to_cpu(lvidiu->maxUDFWriteRev))
|
if (UDF_MAX_WRITE_VERSION > le16_to_cpu(lvidiu->maxUDFWriteRev))
|
||||||
lvidiu->maxUDFWriteRev = cpu_to_le16(UDF_MAX_WRITE_VERSION);
|
lvidiu->maxUDFWriteRev = cpu_to_le16(UDF_MAX_WRITE_VERSION);
|
||||||
|
|
|
@ -28,7 +28,7 @@ struct udf_ext_cache {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct udf_inode_info {
|
struct udf_inode_info {
|
||||||
struct timespec i_crtime;
|
struct timespec64 i_crtime;
|
||||||
/* Physical address of inode */
|
/* Physical address of inode */
|
||||||
struct kernel_lb_addr i_location;
|
struct kernel_lb_addr i_location;
|
||||||
__u64 i_unique;
|
__u64 i_unique;
|
||||||
|
|
|
@ -138,7 +138,7 @@ struct udf_sb_info {
|
||||||
rwlock_t s_cred_lock;
|
rwlock_t s_cred_lock;
|
||||||
|
|
||||||
/* Root Info */
|
/* Root Info */
|
||||||
struct timespec s_record_time;
|
struct timespec64 s_record_time;
|
||||||
|
|
||||||
/* Fileset Info */
|
/* Fileset Info */
|
||||||
__u16 s_serial_number;
|
__u16 s_serial_number;
|
||||||
|
|
|
@ -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);
|
extern struct short_ad *udf_get_fileshortad(uint8_t *, int, uint32_t *, int);
|
||||||
|
|
||||||
/* udftime.c */
|
/* 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);
|
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 */
|
#endif /* __UDF_DECL_H */
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
|
|
||||||
void
|
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 typeAndTimezone = le16_to_cpu(src.typeAndTimezone);
|
||||||
u16 year = le16_to_cpu(src.year);
|
u16 year = le16_to_cpu(src.year);
|
||||||
|
@ -70,9 +70,9 @@ udf_disk_stamp_to_time(struct timespec *dest, struct timestamp src)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
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;
|
int16_t offset;
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue