diff options
author | Jan Kara <jack@suse.cz> | 2018-06-13 11:30:14 -0400 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2018-06-20 05:05:49 -0400 |
commit | f2e83347119acc0412941c5a23d895624c9300e2 (patch) | |
tree | 7c57d33e7bc50b49fff6c5edc73a8992bfae83ff | |
parent | fa65653e575fbd958bdf5fb9c4a71a324e39510d (diff) |
udf: Provide function for calculating dir entry length
Provide function for calculating directory entry length and use to
reduce code duplication.
Signed-off-by: Jan Kara <jack@suse.cz>
-rw-r--r-- | fs/udf/directory.c | 5 | ||||
-rw-r--r-- | fs/udf/namei.c | 14 | ||||
-rw-r--r-- | fs/udf/udfdecl.h | 6 |
3 files changed, 10 insertions, 15 deletions
diff --git a/fs/udf/directory.c b/fs/udf/directory.c index 3835f983cc99..d9523013096f 100644 --- a/fs/udf/directory.c +++ b/fs/udf/directory.c | |||
@@ -141,10 +141,7 @@ struct fileIdentDesc *udf_fileident_read(struct inode *dir, loff_t *nf_pos, | |||
141 | fibh->ebh->b_data, | 141 | fibh->ebh->b_data, |
142 | sizeof(struct fileIdentDesc) + fibh->soffset); | 142 | sizeof(struct fileIdentDesc) + fibh->soffset); |
143 | 143 | ||
144 | fi_len = (sizeof(struct fileIdentDesc) + | 144 | fi_len = udf_dir_entry_len(cfi); |
145 | cfi->lengthFileIdent + | ||
146 | le16_to_cpu(cfi->lengthOfImpUse) + 3) & ~3; | ||
147 | |||
148 | *nf_pos += fi_len - (fibh->eoffset - fibh->soffset); | 145 | *nf_pos += fi_len - (fibh->eoffset - fibh->soffset); |
149 | fibh->eoffset = fibh->soffset + fi_len; | 146 | fibh->eoffset = fibh->soffset + fi_len; |
150 | } else { | 147 | } else { |
diff --git a/fs/udf/namei.c b/fs/udf/namei.c index c586026508db..06f37ddd2997 100644 --- a/fs/udf/namei.c +++ b/fs/udf/namei.c | |||
@@ -351,8 +351,6 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir, | |||
351 | loff_t f_pos; | 351 | loff_t f_pos; |
352 | loff_t size = udf_ext0_offset(dir) + dir->i_size; | 352 | loff_t size = udf_ext0_offset(dir) + dir->i_size; |
353 | int nfidlen; | 353 | int nfidlen; |
354 | uint8_t lfi; | ||
355 | uint16_t liu; | ||
356 | udf_pblk_t block; | 354 | udf_pblk_t block; |
357 | struct kernel_lb_addr eloc; | 355 | struct kernel_lb_addr eloc; |
358 | uint32_t elen = 0; | 356 | uint32_t elen = 0; |
@@ -383,7 +381,7 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir, | |||
383 | namelen = 0; | 381 | namelen = 0; |
384 | } | 382 | } |
385 | 383 | ||
386 | nfidlen = (sizeof(struct fileIdentDesc) + namelen + 3) & ~3; | 384 | nfidlen = ALIGN(sizeof(struct fileIdentDesc) + namelen, UDF_NAME_PAD); |
387 | 385 | ||
388 | f_pos = udf_ext0_offset(dir); | 386 | f_pos = udf_ext0_offset(dir); |
389 | 387 | ||
@@ -424,12 +422,8 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir, | |||
424 | goto out_err; | 422 | goto out_err; |
425 | } | 423 | } |
426 | 424 | ||
427 | liu = le16_to_cpu(cfi->lengthOfImpUse); | ||
428 | lfi = cfi->lengthFileIdent; | ||
429 | |||
430 | if ((cfi->fileCharacteristics & FID_FILE_CHAR_DELETED) != 0) { | 425 | if ((cfi->fileCharacteristics & FID_FILE_CHAR_DELETED) != 0) { |
431 | if (((sizeof(struct fileIdentDesc) + | 426 | if (udf_dir_entry_len(cfi) == nfidlen) { |
432 | liu + lfi + 3) & ~3) == nfidlen) { | ||
433 | cfi->descTag.tagSerialNum = cpu_to_le16(1); | 427 | cfi->descTag.tagSerialNum = cpu_to_le16(1); |
434 | cfi->fileVersionNum = cpu_to_le16(1); | 428 | cfi->fileVersionNum = cpu_to_le16(1); |
435 | cfi->fileCharacteristics = 0; | 429 | cfi->fileCharacteristics = 0; |
@@ -1201,9 +1195,7 @@ static int udf_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
1201 | 1195 | ||
1202 | if (dir_fi) { | 1196 | if (dir_fi) { |
1203 | dir_fi->icb.extLocation = cpu_to_lelb(UDF_I(new_dir)->i_location); | 1197 | dir_fi->icb.extLocation = cpu_to_lelb(UDF_I(new_dir)->i_location); |
1204 | udf_update_tag((char *)dir_fi, | 1198 | udf_update_tag((char *)dir_fi, udf_dir_entry_len(dir_fi)); |
1205 | (sizeof(struct fileIdentDesc) + | ||
1206 | le16_to_cpu(dir_fi->lengthOfImpUse) + 3) & ~3); | ||
1207 | if (old_iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) | 1199 | if (old_iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) |
1208 | mark_inode_dirty(old_inode); | 1200 | mark_inode_dirty(old_inode); |
1209 | else | 1201 | else |
diff --git a/fs/udf/udfdecl.h b/fs/udf/udfdecl.h index bae311b59400..ed890bc4416d 100644 --- a/fs/udf/udfdecl.h +++ b/fs/udf/udfdecl.h | |||
@@ -132,6 +132,12 @@ struct inode *udf_find_metadata_inode_efe(struct super_block *sb, | |||
132 | extern int udf_write_fi(struct inode *inode, struct fileIdentDesc *, | 132 | extern int udf_write_fi(struct inode *inode, struct fileIdentDesc *, |
133 | struct fileIdentDesc *, struct udf_fileident_bh *, | 133 | struct fileIdentDesc *, struct udf_fileident_bh *, |
134 | uint8_t *, uint8_t *); | 134 | uint8_t *, uint8_t *); |
135 | static inline unsigned int udf_dir_entry_len(struct fileIdentDesc *cfi) | ||
136 | { | ||
137 | return ALIGN(sizeof(struct fileIdentDesc) + | ||
138 | le16_to_cpu(cfi->lengthOfImpUse) + cfi->lengthFileIdent, | ||
139 | UDF_NAME_PAD); | ||
140 | } | ||
135 | 141 | ||
136 | /* file.c */ | 142 | /* file.c */ |
137 | extern long udf_ioctl(struct file *, unsigned int, unsigned long); | 143 | extern long udf_ioctl(struct file *, unsigned int, unsigned long); |