- if ( udf_stamp_to_time(&convtime, &convtime_usec,
- lets_to_cpu(fe->accessTime)) )
- {
- inode->i_atime.tv_sec = convtime;
- inode->i_atime.tv_nsec = convtime_usec * 1000;
- }
- else
- {
- inode->i_atime = UDF_SB_RECORDTIME(inode->i_sb);
- }
-
- if ( udf_stamp_to_time(&convtime, &convtime_usec,
- lets_to_cpu(fe->modificationTime)) )
- {
- inode->i_mtime.tv_sec = convtime;
- inode->i_mtime.tv_nsec = convtime_usec * 1000;
- }
- else
- {
- inode->i_mtime = UDF_SB_RECORDTIME(inode->i_sb);
- }
-
- if ( udf_stamp_to_time(&convtime, &convtime_usec,
- lets_to_cpu(fe->attrTime)) )
- {
- inode->i_ctime.tv_sec = convtime;
- inode->i_ctime.tv_nsec = convtime_usec * 1000;
- }
- else
- {
- inode->i_ctime = UDF_SB_RECORDTIME(inode->i_sb);
- }
-
- UDF_I_UNIQUE(inode) = le64_to_cpu(fe->uniqueID);
- UDF_I_LENEATTR(inode) = le32_to_cpu(fe->lengthExtendedAttr);
- UDF_I_LENALLOC(inode) = le32_to_cpu(fe->lengthAllocDescs);
- offset = sizeof(struct fileEntry) + UDF_I_LENEATTR(inode);
- }
- else
- {
- inode->i_blocks = le64_to_cpu(efe->logicalBlocksRecorded) <<
- (inode->i_sb->s_blocksize_bits - 9);
-
- if ( udf_stamp_to_time(&convtime, &convtime_usec,
- lets_to_cpu(efe->accessTime)) )
- {
- inode->i_atime.tv_sec = convtime;
- inode->i_atime.tv_nsec = convtime_usec * 1000;
- }
- else
- {
- inode->i_atime = UDF_SB_RECORDTIME(inode->i_sb);
- }
-
- if ( udf_stamp_to_time(&convtime, &convtime_usec,
- lets_to_cpu(efe->modificationTime)) )
- {
- inode->i_mtime.tv_sec = convtime;
- inode->i_mtime.tv_nsec = convtime_usec * 1000;
- }
- else
- {
- inode->i_mtime = UDF_SB_RECORDTIME(inode->i_sb);
- }
-
- if ( udf_stamp_to_time(&convtime, &convtime_usec,
- lets_to_cpu(efe->createTime)) )
- {
- UDF_I_CRTIME(inode).tv_sec = convtime;
- UDF_I_CRTIME(inode).tv_nsec = convtime_usec * 1000;
- }
- else
- {
- UDF_I_CRTIME(inode) = UDF_SB_RECORDTIME(inode->i_sb);
- }
-
- if ( udf_stamp_to_time(&convtime, &convtime_usec,
- lets_to_cpu(efe->attrTime)) )
- {
- inode->i_ctime.tv_sec = convtime;
- inode->i_ctime.tv_nsec = convtime_usec * 1000;
- }
+ if (!udf_disk_stamp_to_time(&inode->i_atime, fe->accessTime))
+ inode->i_atime = sbi->s_record_time;
+
+ if (!udf_disk_stamp_to_time(&inode->i_mtime,
+ fe->modificationTime))
+ inode->i_mtime = sbi->s_record_time;
+
+ if (!udf_disk_stamp_to_time(&inode->i_ctime, fe->attrTime))
+ inode->i_ctime = sbi->s_record_time;
+
+ iinfo->i_unique = le64_to_cpu(fe->uniqueID);
+ iinfo->i_lenEAttr = le32_to_cpu(fe->lengthExtendedAttr);
+ iinfo->i_lenAlloc = le32_to_cpu(fe->lengthAllocDescs);
+ offset = sizeof(struct fileEntry) + iinfo->i_lenEAttr;
+ } else {
+ inode->i_blocks = le64_to_cpu(efe->logicalBlocksRecorded) <<
+ (inode->i_sb->s_blocksize_bits - 9);
+
+ if (!udf_disk_stamp_to_time(&inode->i_atime, efe->accessTime))
+ inode->i_atime = sbi->s_record_time;
+
+ if (!udf_disk_stamp_to_time(&inode->i_mtime,
+ efe->modificationTime))
+ inode->i_mtime = sbi->s_record_time;
+
+ if (!udf_disk_stamp_to_time(&iinfo->i_crtime, efe->createTime))
+ iinfo->i_crtime = sbi->s_record_time;
+
+ if (!udf_disk_stamp_to_time(&inode->i_ctime, efe->attrTime))
+ inode->i_ctime = sbi->s_record_time;
+
+ iinfo->i_unique = le64_to_cpu(efe->uniqueID);
+ iinfo->i_lenEAttr = le32_to_cpu(efe->lengthExtendedAttr);
+ iinfo->i_lenAlloc = le32_to_cpu(efe->lengthAllocDescs);
+ offset = sizeof(struct extendedFileEntry) +
+ iinfo->i_lenEAttr;
+ }
+
+ switch (fe->icbTag.fileType) {
+ case ICBTAG_FILE_TYPE_DIRECTORY:
+ inode->i_op = &udf_dir_inode_operations;
+ inode->i_fop = &udf_dir_operations;
+ inode->i_mode |= S_IFDIR;
+ inc_nlink(inode);
+ break;
+ case ICBTAG_FILE_TYPE_REALTIME:
+ case ICBTAG_FILE_TYPE_REGULAR:
+ case ICBTAG_FILE_TYPE_UNDEF:
+ case ICBTAG_FILE_TYPE_VAT20:
+ if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
+ inode->i_data.a_ops = &udf_adinicb_aops;