summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2019-06-21 15:49:26 -0400
committerTheodore Ts'o <tytso@mit.edu>2019-06-21 15:49:26 -0400
commitf036adb39976467cf57f577490269594994f9eb4 (patch)
tree26e5148f7e5e23ef833d58d630538ddddf57a5ff
parent4e19d6b65fb4fc42e352ce9883649e049da14743 (diff)
ext4: rename "dirent_csum" functions to use "dirblock"
Functions such as ext4_dirent_csum_verify() and ext4_dirent_csum_set() don't actually operate on a directory entry, but a directory block. And while they take a struct ext4_dir_entry *dirent as an argument, it had better be the first directory at the beginning of the direct block, or things will go very wrong. Rename the following functions so that things make more sense, and remove a lot of confusing casts along the way: ext4_dirent_csum_verify -> ext4_dirblock_csum_verify ext4_dirent_csum_set -> ext4_dirblock_csum_set ext4_dirent_csum -> ext4_dirblock_csum ext4_handle_dirty_dirent_node -> ext4_handle_dirty_dirblock Signed-off-by: Theodore Ts'o <tytso@mit.edu>
-rw-r--r--fs/ext4/dir.c3
-rw-r--r--fs/ext4/ext4.h9
-rw-r--r--fs/ext4/inline.c2
-rw-r--r--fs/ext4/namei.c62
4 files changed, 35 insertions, 41 deletions
diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c
index 3a77b7affd09..86054f31fe4d 100644
--- a/fs/ext4/dir.c
+++ b/fs/ext4/dir.c
@@ -194,8 +194,7 @@ static int ext4_readdir(struct file *file, struct dir_context *ctx)
194 194
195 /* Check the checksum */ 195 /* Check the checksum */
196 if (!buffer_verified(bh) && 196 if (!buffer_verified(bh) &&
197 !ext4_dirent_csum_verify(inode, 197 !ext4_dirblock_csum_verify(inode, bh)) {
198 (struct ext4_dir_entry *)bh->b_data)) {
199 EXT4_ERROR_FILE(file, 0, "directory fails checksum " 198 EXT4_ERROR_FILE(file, 0, "directory fails checksum "
200 "at offset %llu", 199 "at offset %llu",
201 (unsigned long long)ctx->pos); 200 (unsigned long long)ctx->pos);
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 7215a2a2a0de..5b86df7ec326 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -2602,8 +2602,8 @@ extern int ext4_ext_migrate(struct inode *);
2602extern int ext4_ind_migrate(struct inode *inode); 2602extern int ext4_ind_migrate(struct inode *inode);
2603 2603
2604/* namei.c */ 2604/* namei.c */
2605extern int ext4_dirent_csum_verify(struct inode *inode, 2605extern int ext4_dirblock_csum_verify(struct inode *inode,
2606 struct ext4_dir_entry *dirent); 2606 struct buffer_head *bh);
2607extern int ext4_orphan_add(handle_t *, struct inode *); 2607extern int ext4_orphan_add(handle_t *, struct inode *);
2608extern int ext4_orphan_del(handle_t *, struct inode *); 2608extern int ext4_orphan_del(handle_t *, struct inode *);
2609extern int ext4_htree_fill_tree(struct file *dir_file, __u32 start_hash, 2609extern int ext4_htree_fill_tree(struct file *dir_file, __u32 start_hash,
@@ -3149,9 +3149,8 @@ extern struct ext4_dir_entry_2 *ext4_init_dot_dotdot(struct inode *inode,
3149 unsigned int parent_ino, int dotdot_real_len); 3149 unsigned int parent_ino, int dotdot_real_len);
3150extern void initialize_dirent_tail(struct ext4_dir_entry_tail *t, 3150extern void initialize_dirent_tail(struct ext4_dir_entry_tail *t,
3151 unsigned int blocksize); 3151 unsigned int blocksize);
3152extern int ext4_handle_dirty_dirent_node(handle_t *handle, 3152extern int ext4_handle_dirty_dirblock(handle_t *handle, struct inode *inode,
3153 struct inode *inode, 3153 struct buffer_head *bh);
3154 struct buffer_head *bh);
3155extern int ext4_ci_compare(const struct inode *parent, 3154extern int ext4_ci_compare(const struct inode *parent,
3156 const struct qstr *fname, 3155 const struct qstr *fname,
3157 const struct qstr *entry, bool quick); 3156 const struct qstr *entry, bool quick);
diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c
index f73bc3925282..f19dd5a08d0d 100644
--- a/fs/ext4/inline.c
+++ b/fs/ext4/inline.c
@@ -1164,7 +1164,7 @@ static int ext4_finish_convert_inline_dir(handle_t *handle,
1164 initialize_dirent_tail(t, inode->i_sb->s_blocksize); 1164 initialize_dirent_tail(t, inode->i_sb->s_blocksize);
1165 } 1165 }
1166 set_buffer_uptodate(dir_block); 1166 set_buffer_uptodate(dir_block);
1167 err = ext4_handle_dirty_dirent_node(handle, inode, dir_block); 1167 err = ext4_handle_dirty_dirblock(handle, inode, dir_block);
1168 if (err) 1168 if (err)
1169 return err; 1169 return err;
1170 set_buffer_verified(dir_block); 1170 set_buffer_verified(dir_block);
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index 0cda080f3fd5..4f0bcbbcfe96 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -163,7 +163,7 @@ static struct buffer_head *__ext4_read_dirblock(struct inode *inode,
163 } 163 }
164 } 164 }
165 if (!is_dx_block) { 165 if (!is_dx_block) {
166 if (ext4_dirent_csum_verify(inode, dirent)) 166 if (ext4_dirblock_csum_verify(inode, bh))
167 set_buffer_verified(bh); 167 set_buffer_verified(bh);
168 else { 168 else {
169 ext4_error_inode(inode, func, line, block, 169 ext4_error_inode(inode, func, line, block,
@@ -304,17 +304,17 @@ void initialize_dirent_tail(struct ext4_dir_entry_tail *t,
304 304
305/* Walk through a dirent block to find a checksum "dirent" at the tail */ 305/* Walk through a dirent block to find a checksum "dirent" at the tail */
306static struct ext4_dir_entry_tail *get_dirent_tail(struct inode *inode, 306static struct ext4_dir_entry_tail *get_dirent_tail(struct inode *inode,
307 struct ext4_dir_entry *de) 307 struct buffer_head *bh)
308{ 308{
309 struct ext4_dir_entry_tail *t; 309 struct ext4_dir_entry_tail *t;
310 310
311#ifdef PARANOID 311#ifdef PARANOID
312 struct ext4_dir_entry *d, *top; 312 struct ext4_dir_entry *d, *top;
313 313
314 d = de; 314 d = (struct ext4_dir_entry *)bh->b_data;
315 top = (struct ext4_dir_entry *)(((void *)de) + 315 top = (struct ext4_dir_entry *)(bh->b_data +
316 (EXT4_BLOCK_SIZE(inode->i_sb) - 316 (EXT4_BLOCK_SIZE(inode->i_sb) -
317 sizeof(struct ext4_dir_entry_tail))); 317 sizeof(struct ext4_dir_entry_tail)));
318 while (d < top && d->rec_len) 318 while (d < top && d->rec_len)
319 d = (struct ext4_dir_entry *)(((void *)d) + 319 d = (struct ext4_dir_entry *)(((void *)d) +
320 le16_to_cpu(d->rec_len)); 320 le16_to_cpu(d->rec_len));
@@ -324,7 +324,7 @@ static struct ext4_dir_entry_tail *get_dirent_tail(struct inode *inode,
324 324
325 t = (struct ext4_dir_entry_tail *)d; 325 t = (struct ext4_dir_entry_tail *)d;
326#else 326#else
327 t = EXT4_DIRENT_TAIL(de, EXT4_BLOCK_SIZE(inode->i_sb)); 327 t = EXT4_DIRENT_TAIL(bh->b_data, EXT4_BLOCK_SIZE(inode->i_sb));
328#endif 328#endif
329 329
330 if (t->det_reserved_zero1 || 330 if (t->det_reserved_zero1 ||
@@ -336,8 +336,7 @@ static struct ext4_dir_entry_tail *get_dirent_tail(struct inode *inode,
336 return t; 336 return t;
337} 337}
338 338
339static __le32 ext4_dirent_csum(struct inode *inode, 339static __le32 ext4_dirblock_csum(struct inode *inode, void *dirent, int size)
340 struct ext4_dir_entry *dirent, int size)
341{ 340{
342 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); 341 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
343 struct ext4_inode_info *ei = EXT4_I(inode); 342 struct ext4_inode_info *ei = EXT4_I(inode);
@@ -357,49 +356,49 @@ static void __warn_no_space_for_csum(struct inode *inode, const char *func,
357 "No space for directory leaf checksum. Please run e2fsck -D."); 356 "No space for directory leaf checksum. Please run e2fsck -D.");
358} 357}
359 358
360int ext4_dirent_csum_verify(struct inode *inode, struct ext4_dir_entry *dirent) 359int ext4_dirblock_csum_verify(struct inode *inode, struct buffer_head *bh)
361{ 360{
362 struct ext4_dir_entry_tail *t; 361 struct ext4_dir_entry_tail *t;
363 362
364 if (!ext4_has_metadata_csum(inode->i_sb)) 363 if (!ext4_has_metadata_csum(inode->i_sb))
365 return 1; 364 return 1;
366 365
367 t = get_dirent_tail(inode, dirent); 366 t = get_dirent_tail(inode, bh);
368 if (!t) { 367 if (!t) {
369 warn_no_space_for_csum(inode); 368 warn_no_space_for_csum(inode);
370 return 0; 369 return 0;
371 } 370 }
372 371
373 if (t->det_checksum != ext4_dirent_csum(inode, dirent, 372 if (t->det_checksum != ext4_dirblock_csum(inode, bh->b_data,
374 (void *)t - (void *)dirent)) 373 (char *)t - bh->b_data))
375 return 0; 374 return 0;
376 375
377 return 1; 376 return 1;
378} 377}
379 378
380static void ext4_dirent_csum_set(struct inode *inode, 379static void ext4_dirblock_csum_set(struct inode *inode,
381 struct ext4_dir_entry *dirent) 380 struct buffer_head *bh)
382{ 381{
383 struct ext4_dir_entry_tail *t; 382 struct ext4_dir_entry_tail *t;
384 383
385 if (!ext4_has_metadata_csum(inode->i_sb)) 384 if (!ext4_has_metadata_csum(inode->i_sb))
386 return; 385 return;
387 386
388 t = get_dirent_tail(inode, dirent); 387 t = get_dirent_tail(inode, bh);
389 if (!t) { 388 if (!t) {
390 warn_no_space_for_csum(inode); 389 warn_no_space_for_csum(inode);
391 return; 390 return;
392 } 391 }
393 392
394 t->det_checksum = ext4_dirent_csum(inode, dirent, 393 t->det_checksum = ext4_dirblock_csum(inode, bh->b_data,
395 (void *)t - (void *)dirent); 394 (char *)t - bh->b_data);
396} 395}
397 396
398int ext4_handle_dirty_dirent_node(handle_t *handle, 397int ext4_handle_dirty_dirblock(handle_t *handle,
399 struct inode *inode, 398 struct inode *inode,
400 struct buffer_head *bh) 399 struct buffer_head *bh)
401{ 400{
402 ext4_dirent_csum_set(inode, (struct ext4_dir_entry *)bh->b_data); 401 ext4_dirblock_csum_set(inode, bh);
403 return ext4_handle_dirty_metadata(handle, inode, bh); 402 return ext4_handle_dirty_metadata(handle, inode, bh);
404} 403}
405 404
@@ -1530,8 +1529,7 @@ restart:
1530 if (!buffer_verified(bh) && 1529 if (!buffer_verified(bh) &&
1531 !is_dx_internal_node(dir, block, 1530 !is_dx_internal_node(dir, block,
1532 (struct ext4_dir_entry *)bh->b_data) && 1531 (struct ext4_dir_entry *)bh->b_data) &&
1533 !ext4_dirent_csum_verify(dir, 1532 !ext4_dirblock_csum_verify(dir, bh)) {
1534 (struct ext4_dir_entry *)bh->b_data)) {
1535 EXT4_ERROR_INODE(dir, "checksumming directory " 1533 EXT4_ERROR_INODE(dir, "checksumming directory "
1536 "block %lu", (unsigned long)block); 1534 "block %lu", (unsigned long)block);
1537 brelse(bh); 1535 brelse(bh);
@@ -1894,7 +1892,7 @@ static struct ext4_dir_entry_2 *do_split(handle_t *handle, struct inode *dir,
1894 de = de2; 1892 de = de2;
1895 } 1893 }
1896 dx_insert_block(frame, hash2 + continued, newblock); 1894 dx_insert_block(frame, hash2 + continued, newblock);
1897 err = ext4_handle_dirty_dirent_node(handle, dir, bh2); 1895 err = ext4_handle_dirty_dirblock(handle, dir, bh2);
1898 if (err) 1896 if (err)
1899 goto journal_error; 1897 goto journal_error;
1900 err = ext4_handle_dirty_dx_node(handle, dir, frame->bh); 1898 err = ext4_handle_dirty_dx_node(handle, dir, frame->bh);
@@ -2022,7 +2020,7 @@ static int add_dirent_to_buf(handle_t *handle, struct ext4_filename *fname,
2022 inode_inc_iversion(dir); 2020 inode_inc_iversion(dir);
2023 ext4_mark_inode_dirty(handle, dir); 2021 ext4_mark_inode_dirty(handle, dir);
2024 BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata"); 2022 BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata");
2025 err = ext4_handle_dirty_dirent_node(handle, dir, bh); 2023 err = ext4_handle_dirty_dirblock(handle, dir, bh);
2026 if (err) 2024 if (err)
2027 ext4_std_error(dir->i_sb, err); 2025 ext4_std_error(dir->i_sb, err);
2028 return 0; 2026 return 0;
@@ -2126,7 +2124,7 @@ static int make_indexed_dir(handle_t *handle, struct ext4_filename *fname,
2126 retval = ext4_handle_dirty_dx_node(handle, dir, frame->bh); 2124 retval = ext4_handle_dirty_dx_node(handle, dir, frame->bh);
2127 if (retval) 2125 if (retval)
2128 goto out_frames; 2126 goto out_frames;
2129 retval = ext4_handle_dirty_dirent_node(handle, dir, bh2); 2127 retval = ext4_handle_dirty_dirblock(handle, dir, bh2);
2130 if (retval) 2128 if (retval)
2131 goto out_frames; 2129 goto out_frames;
2132 2130
@@ -2512,7 +2510,7 @@ static int ext4_delete_entry(handle_t *handle,
2512 goto out; 2510 goto out;
2513 2511
2514 BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata"); 2512 BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata");
2515 err = ext4_handle_dirty_dirent_node(handle, dir, bh); 2513 err = ext4_handle_dirty_dirblock(handle, dir, bh);
2516 if (unlikely(err)) 2514 if (unlikely(err))
2517 goto out; 2515 goto out;
2518 2516
@@ -2744,7 +2742,7 @@ static int ext4_init_new_dir(handle_t *handle, struct inode *dir,
2744 } 2742 }
2745 2743
2746 BUFFER_TRACE(dir_block, "call ext4_handle_dirty_metadata"); 2744 BUFFER_TRACE(dir_block, "call ext4_handle_dirty_metadata");
2747 err = ext4_handle_dirty_dirent_node(handle, inode, dir_block); 2745 err = ext4_handle_dirty_dirblock(handle, inode, dir_block);
2748 if (err) 2746 if (err)
2749 goto out; 2747 goto out;
2750 set_buffer_verified(dir_block); 2748 set_buffer_verified(dir_block);
@@ -3492,9 +3490,8 @@ static int ext4_rename_dir_finish(handle_t *handle, struct ext4_renament *ent,
3492 ent->inode, 3490 ent->inode,
3493 ent->dir_bh); 3491 ent->dir_bh);
3494 } else { 3492 } else {
3495 retval = ext4_handle_dirty_dirent_node(handle, 3493 retval = ext4_handle_dirty_dirblock(handle, ent->inode,
3496 ent->inode, 3494 ent->dir_bh);
3497 ent->dir_bh);
3498 } 3495 }
3499 } else { 3496 } else {
3500 retval = ext4_mark_inode_dirty(handle, ent->inode); 3497 retval = ext4_mark_inode_dirty(handle, ent->inode);
@@ -3524,8 +3521,7 @@ static int ext4_setent(handle_t *handle, struct ext4_renament *ent,
3524 ext4_mark_inode_dirty(handle, ent->dir); 3521 ext4_mark_inode_dirty(handle, ent->dir);
3525 BUFFER_TRACE(ent->bh, "call ext4_handle_dirty_metadata"); 3522 BUFFER_TRACE(ent->bh, "call ext4_handle_dirty_metadata");
3526 if (!ent->inlined) { 3523 if (!ent->inlined) {
3527 retval = ext4_handle_dirty_dirent_node(handle, 3524 retval = ext4_handle_dirty_dirblock(handle, ent->dir, ent->bh);
3528 ent->dir, ent->bh);
3529 if (unlikely(retval)) { 3525 if (unlikely(retval)) {
3530 ext4_std_error(ent->dir->i_sb, retval); 3526 ext4_std_error(ent->dir->i_sb, retval);
3531 return retval; 3527 return retval;