diff options
| author | marcin.slusarz@gmail.com <marcin.slusarz@gmail.com> | 2008-02-27 16:50:14 -0500 |
|---|---|---|
| committer | Jan Kara <jack@suse.cz> | 2008-04-17 08:22:29 -0400 |
| commit | cbf5676a0e0463f05e5073589f3194846dfb02e7 (patch) | |
| tree | 80407064556f2c7043d44533a7c9224e6af3e715 /fs/udf | |
| parent | c87e8e90d0da1134e42c89dc89559f4bfe282ef9 (diff) | |
udf: convert udf_stamp_to_time to return struct timespec
Signed-off-by: Marcin Slusarz <marcin.slusarz@gmail.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/udf')
| -rw-r--r-- | fs/udf/inode.c | 49 | ||||
| -rw-r--r-- | fs/udf/super.c | 9 | ||||
| -rw-r--r-- | fs/udf/udfdecl.h | 4 | ||||
| -rw-r--r-- | fs/udf/udftime.c | 17 |
4 files changed, 37 insertions, 42 deletions
diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 3c0a60dad478..a7646e9bdbde 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c | |||
| @@ -1136,20 +1136,6 @@ static void __udf_read_inode(struct inode *inode) | |||
| 1136 | brelse(bh); | 1136 | brelse(bh); |
| 1137 | } | 1137 | } |
| 1138 | 1138 | ||
| 1139 | static void udf_fill_inode_time(struct timespec *tspec, | ||
| 1140 | const timestamp *tstamp, | ||
| 1141 | struct udf_sb_info *sbi) | ||
| 1142 | { | ||
| 1143 | time_t convtime; | ||
| 1144 | long convtime_usec; | ||
| 1145 | if (udf_stamp_to_time(&convtime, &convtime_usec, | ||
| 1146 | lets_to_cpu(*tstamp))) { | ||
| 1147 | tspec->tv_sec = convtime; | ||
| 1148 | tspec->tv_nsec = convtime_usec * 1000; | ||
| 1149 | } else | ||
| 1150 | *tspec = sbi->s_record_time; | ||
| 1151 | } | ||
| 1152 | |||
| 1153 | static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | 1139 | static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) |
| 1154 | { | 1140 | { |
| 1155 | struct fileEntry *fe; | 1141 | struct fileEntry *fe; |
| @@ -1241,10 +1227,17 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
| 1241 | inode->i_blocks = le64_to_cpu(fe->logicalBlocksRecorded) << | 1227 | inode->i_blocks = le64_to_cpu(fe->logicalBlocksRecorded) << |
| 1242 | (inode->i_sb->s_blocksize_bits - 9); | 1228 | (inode->i_sb->s_blocksize_bits - 9); |
| 1243 | 1229 | ||
| 1244 | udf_fill_inode_time(&inode->i_atime, &fe->accessTime, sbi); | 1230 | if (!udf_stamp_to_time(&inode->i_atime, |
| 1245 | udf_fill_inode_time(&inode->i_mtime, &fe->modificationTime, | 1231 | lets_to_cpu(fe->accessTime))) |
| 1246 | sbi); | 1232 | inode->i_atime = sbi->s_record_time; |
| 1247 | udf_fill_inode_time(&inode->i_ctime, &fe->attrTime, sbi); | 1233 | |
| 1234 | if (!udf_stamp_to_time(&inode->i_mtime, | ||
| 1235 | lets_to_cpu(fe->modificationTime))) | ||
| 1236 | inode->i_mtime = sbi->s_record_time; | ||
| 1237 | |||
| 1238 | if (!udf_stamp_to_time(&inode->i_ctime, | ||
| 1239 | lets_to_cpu(fe->attrTime))) | ||
| 1240 | inode->i_ctime = sbi->s_record_time; | ||
| 1248 | 1241 | ||
| 1249 | iinfo->i_unique = le64_to_cpu(fe->uniqueID); | 1242 | iinfo->i_unique = le64_to_cpu(fe->uniqueID); |
| 1250 | iinfo->i_lenEAttr = le32_to_cpu(fe->lengthExtendedAttr); | 1243 | iinfo->i_lenEAttr = le32_to_cpu(fe->lengthExtendedAttr); |
| @@ -1254,11 +1247,21 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) | |||
| 1254 | inode->i_blocks = le64_to_cpu(efe->logicalBlocksRecorded) << | 1247 | inode->i_blocks = le64_to_cpu(efe->logicalBlocksRecorded) << |
| 1255 | (inode->i_sb->s_blocksize_bits - 9); | 1248 | (inode->i_sb->s_blocksize_bits - 9); |
| 1256 | 1249 | ||
| 1257 | udf_fill_inode_time(&inode->i_atime, &efe->accessTime, sbi); | 1250 | if (!udf_stamp_to_time(&inode->i_atime, |
| 1258 | udf_fill_inode_time(&inode->i_mtime, &efe->modificationTime, | 1251 | lets_to_cpu(efe->accessTime))) |
| 1259 | sbi); | 1252 | inode->i_atime = sbi->s_record_time; |
| 1260 | udf_fill_inode_time(&iinfo->i_crtime, &efe->createTime, sbi); | 1253 | |
| 1261 | udf_fill_inode_time(&inode->i_ctime, &efe->attrTime, sbi); | 1254 | if (!udf_stamp_to_time(&inode->i_mtime, |
| 1255 | lets_to_cpu(efe->modificationTime))) | ||
| 1256 | inode->i_mtime = sbi->s_record_time; | ||
| 1257 | |||
| 1258 | if (!udf_stamp_to_time(&iinfo->i_crtime, | ||
| 1259 | lets_to_cpu(efe->createTime))) | ||
| 1260 | iinfo->i_crtime = sbi->s_record_time; | ||
| 1261 | |||
| 1262 | if (!udf_stamp_to_time(&inode->i_ctime, | ||
| 1263 | lets_to_cpu(efe->attrTime))) | ||
| 1264 | inode->i_ctime = sbi->s_record_time; | ||
| 1262 | 1265 | ||
| 1263 | iinfo->i_unique = le64_to_cpu(efe->uniqueID); | 1266 | iinfo->i_unique = le64_to_cpu(efe->uniqueID); |
| 1264 | iinfo->i_lenEAttr = le32_to_cpu(efe->lengthExtendedAttr); | 1267 | iinfo->i_lenEAttr = le32_to_cpu(efe->lengthExtendedAttr); |
diff --git a/fs/udf/super.c b/fs/udf/super.c index be0aa424b8f1..f4cdd530c65f 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c | |||
| @@ -938,24 +938,19 @@ static int udf_find_fileset(struct super_block *sb, | |||
| 938 | static void udf_load_pvoldesc(struct super_block *sb, struct buffer_head *bh) | 938 | static void udf_load_pvoldesc(struct super_block *sb, struct buffer_head *bh) |
| 939 | { | 939 | { |
| 940 | struct primaryVolDesc *pvoldesc; | 940 | struct primaryVolDesc *pvoldesc; |
| 941 | time_t recording; | ||
| 942 | long recording_usec; | ||
| 943 | struct ustr instr; | 941 | struct ustr instr; |
| 944 | struct ustr outstr; | 942 | struct ustr outstr; |
| 945 | 943 | ||
| 946 | pvoldesc = (struct primaryVolDesc *)bh->b_data; | 944 | pvoldesc = (struct primaryVolDesc *)bh->b_data; |
| 947 | 945 | ||
| 948 | if (udf_stamp_to_time(&recording, &recording_usec, | 946 | if (udf_stamp_to_time(&UDF_SB(sb)->s_record_time, |
| 949 | lets_to_cpu(pvoldesc->recordingDateAndTime))) { | 947 | lets_to_cpu(pvoldesc->recordingDateAndTime))) { |
| 950 | kernel_timestamp ts; | 948 | kernel_timestamp ts; |
| 951 | ts = lets_to_cpu(pvoldesc->recordingDateAndTime); | 949 | ts = lets_to_cpu(pvoldesc->recordingDateAndTime); |
| 952 | udf_debug("recording time %ld/%ld, %04u/%02u/%02u" | 950 | udf_debug("recording time %04u/%02u/%02u" |
| 953 | " %02u:%02u (%x)\n", | 951 | " %02u:%02u (%x)\n", |
| 954 | recording, recording_usec, | ||
| 955 | ts.year, ts.month, ts.day, ts.hour, | 952 | ts.year, ts.month, ts.day, ts.hour, |
| 956 | ts.minute, ts.typeAndTimezone); | 953 | ts.minute, ts.typeAndTimezone); |
| 957 | UDF_SB(sb)->s_record_time.tv_sec = recording; | ||
| 958 | UDF_SB(sb)->s_record_time.tv_nsec = recording_usec * 1000; | ||
| 959 | } | 954 | } |
| 960 | 955 | ||
| 961 | if (!udf_build_ustr(&instr, pvoldesc->volIdent, 32)) | 956 | if (!udf_build_ustr(&instr, pvoldesc->volIdent, 32)) |
diff --git a/fs/udf/udfdecl.h b/fs/udf/udfdecl.h index cc15f58d497a..b277524fe608 100644 --- a/fs/udf/udfdecl.h +++ b/fs/udf/udfdecl.h | |||
| @@ -222,7 +222,7 @@ extern short_ad *udf_get_fileshortad(uint8_t *, int, uint32_t *, int); | |||
| 222 | extern uint16_t udf_crc(const uint8_t *, uint32_t, uint16_t); | 222 | extern uint16_t udf_crc(const uint8_t *, uint32_t, uint16_t); |
| 223 | 223 | ||
| 224 | /* udftime.c */ | 224 | /* udftime.c */ |
| 225 | extern time_t *udf_stamp_to_time(time_t *, long *, kernel_timestamp); | 225 | extern struct timespec *udf_stamp_to_time(struct timespec *dest, kernel_timestamp src); |
| 226 | extern kernel_timestamp *udf_time_to_stamp(kernel_timestamp *, struct timespec); | 226 | extern kernel_timestamp *udf_time_to_stamp(kernel_timestamp *dest, struct timespec src); |
| 227 | 227 | ||
| 228 | #endif /* __UDF_DECL_H */ | 228 | #endif /* __UDF_DECL_H */ |
diff --git a/fs/udf/udftime.c b/fs/udf/udftime.c index ce595732ba6f..12fae6cd444c 100644 --- a/fs/udf/udftime.c +++ b/fs/udf/udftime.c | |||
| @@ -85,7 +85,7 @@ extern struct timezone sys_tz; | |||
| 85 | #define SECS_PER_HOUR (60 * 60) | 85 | #define SECS_PER_HOUR (60 * 60) |
| 86 | #define SECS_PER_DAY (SECS_PER_HOUR * 24) | 86 | #define SECS_PER_DAY (SECS_PER_HOUR * 24) |
| 87 | 87 | ||
| 88 | time_t *udf_stamp_to_time(time_t *dest, long *dest_usec, kernel_timestamp src) | 88 | struct timespec *udf_stamp_to_time(struct timespec *dest, kernel_timestamp src) |
| 89 | { | 89 | { |
| 90 | int yday; | 90 | int yday; |
| 91 | uint8_t type = src.typeAndTimezone >> 12; | 91 | uint8_t type = src.typeAndTimezone >> 12; |
| @@ -97,23 +97,20 @@ time_t *udf_stamp_to_time(time_t *dest, long *dest_usec, kernel_timestamp src) | |||
| 97 | offset = (offset >> 4); | 97 | offset = (offset >> 4); |
| 98 | if (offset == -2047) /* unspecified offset */ | 98 | if (offset == -2047) /* unspecified offset */ |
| 99 | offset = 0; | 99 | offset = 0; |
| 100 | } else { | 100 | } else |
| 101 | offset = 0; | 101 | offset = 0; |
| 102 | } | ||
| 103 | 102 | ||
| 104 | if ((src.year < EPOCH_YEAR) || | 103 | if ((src.year < EPOCH_YEAR) || |
| 105 | (src.year >= EPOCH_YEAR + MAX_YEAR_SECONDS)) { | 104 | (src.year >= EPOCH_YEAR + MAX_YEAR_SECONDS)) { |
| 106 | *dest = -1; | ||
| 107 | *dest_usec = -1; | ||
| 108 | return NULL; | 105 | return NULL; |
| 109 | } | 106 | } |
| 110 | *dest = year_seconds[src.year - EPOCH_YEAR]; | 107 | dest->tv_sec = year_seconds[src.year - EPOCH_YEAR]; |
| 111 | *dest -= offset * 60; | 108 | dest->tv_sec -= offset * 60; |
| 112 | 109 | ||
| 113 | yday = ((__mon_yday[__isleap(src.year)][src.month - 1]) + src.day - 1); | 110 | yday = ((__mon_yday[__isleap(src.year)][src.month - 1]) + src.day - 1); |
| 114 | *dest += (((yday * 24) + src.hour) * 60 + src.minute) * 60 + src.second; | 111 | dest->tv_sec += (((yday * 24) + src.hour) * 60 + src.minute) * 60 + src.second; |
| 115 | *dest_usec = src.centiseconds * 10000 + | 112 | dest->tv_nsec = 1000 * (src.centiseconds * 10000 + |
| 116 | src.hundredsOfMicroseconds * 100 + src.microseconds; | 113 | src.hundredsOfMicroseconds * 100 + src.microseconds); |
| 117 | return dest; | 114 | return dest; |
| 118 | } | 115 | } |
| 119 | 116 | ||
