aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2018-06-13 11:30:14 -0400
committerJan Kara <jack@suse.cz>2018-06-20 05:05:49 -0400
commitf2e83347119acc0412941c5a23d895624c9300e2 (patch)
tree7c57d33e7bc50b49fff6c5edc73a8992bfae83ff
parentfa65653e575fbd958bdf5fb9c4a71a324e39510d (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.c5
-rw-r--r--fs/udf/namei.c14
-rw-r--r--fs/udf/udfdecl.h6
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,
132extern int udf_write_fi(struct inode *inode, struct fileIdentDesc *, 132extern 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 *);
135static 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 */
137extern long udf_ioctl(struct file *, unsigned int, unsigned long); 143extern long udf_ioctl(struct file *, unsigned int, unsigned long);