Commit 23dd561a authored by Yi Li's avatar Yi Li Committed by Theodore Ts'o

ext4: use IS_ERR instead of IS_ERR_OR_NULL and set inode null when IS_ERR

1: ext4_iget/ext4_find_extent never returns NULL, use IS_ERR
instead of IS_ERR_OR_NULL to fix this.

2: ext4_fc_replay_inode should set the inode to NULL when IS_ERR.
and go to call iput properly.

Fixes: 8016e29f ("ext4: fast commit recovery path")
Signed-off-by: default avatarYi Li <yili@winhong.com>
Reviewed-by: default avatarJan Kara <jack@suse.cz>
Link: https://lore.kernel.org/r/20201230033827.3996064-1-yili@winhong.comSigned-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
Cc: stable@kernel.org
parent 5a3b590d
...@@ -1318,14 +1318,14 @@ static int ext4_fc_replay_unlink(struct super_block *sb, struct ext4_fc_tl *tl) ...@@ -1318,14 +1318,14 @@ static int ext4_fc_replay_unlink(struct super_block *sb, struct ext4_fc_tl *tl)
entry.len = darg.dname_len; entry.len = darg.dname_len;
inode = ext4_iget(sb, darg.ino, EXT4_IGET_NORMAL); inode = ext4_iget(sb, darg.ino, EXT4_IGET_NORMAL);
if (IS_ERR_OR_NULL(inode)) { if (IS_ERR(inode)) {
jbd_debug(1, "Inode %d not found", darg.ino); jbd_debug(1, "Inode %d not found", darg.ino);
return 0; return 0;
} }
old_parent = ext4_iget(sb, darg.parent_ino, old_parent = ext4_iget(sb, darg.parent_ino,
EXT4_IGET_NORMAL); EXT4_IGET_NORMAL);
if (IS_ERR_OR_NULL(old_parent)) { if (IS_ERR(old_parent)) {
jbd_debug(1, "Dir with inode %d not found", darg.parent_ino); jbd_debug(1, "Dir with inode %d not found", darg.parent_ino);
iput(inode); iput(inode);
return 0; return 0;
...@@ -1410,7 +1410,7 @@ static int ext4_fc_replay_link(struct super_block *sb, struct ext4_fc_tl *tl) ...@@ -1410,7 +1410,7 @@ static int ext4_fc_replay_link(struct super_block *sb, struct ext4_fc_tl *tl)
darg.parent_ino, darg.dname_len); darg.parent_ino, darg.dname_len);
inode = ext4_iget(sb, darg.ino, EXT4_IGET_NORMAL); inode = ext4_iget(sb, darg.ino, EXT4_IGET_NORMAL);
if (IS_ERR_OR_NULL(inode)) { if (IS_ERR(inode)) {
jbd_debug(1, "Inode not found."); jbd_debug(1, "Inode not found.");
return 0; return 0;
} }
...@@ -1466,10 +1466,11 @@ static int ext4_fc_replay_inode(struct super_block *sb, struct ext4_fc_tl *tl) ...@@ -1466,10 +1466,11 @@ static int ext4_fc_replay_inode(struct super_block *sb, struct ext4_fc_tl *tl)
trace_ext4_fc_replay(sb, tag, ino, 0, 0); trace_ext4_fc_replay(sb, tag, ino, 0, 0);
inode = ext4_iget(sb, ino, EXT4_IGET_NORMAL); inode = ext4_iget(sb, ino, EXT4_IGET_NORMAL);
if (!IS_ERR_OR_NULL(inode)) { if (!IS_ERR(inode)) {
ext4_ext_clear_bb(inode); ext4_ext_clear_bb(inode);
iput(inode); iput(inode);
} }
inode = NULL;
ext4_fc_record_modified_inode(sb, ino); ext4_fc_record_modified_inode(sb, ino);
...@@ -1512,7 +1513,7 @@ static int ext4_fc_replay_inode(struct super_block *sb, struct ext4_fc_tl *tl) ...@@ -1512,7 +1513,7 @@ static int ext4_fc_replay_inode(struct super_block *sb, struct ext4_fc_tl *tl)
/* Given that we just wrote the inode on disk, this SHOULD succeed. */ /* Given that we just wrote the inode on disk, this SHOULD succeed. */
inode = ext4_iget(sb, ino, EXT4_IGET_NORMAL); inode = ext4_iget(sb, ino, EXT4_IGET_NORMAL);
if (IS_ERR_OR_NULL(inode)) { if (IS_ERR(inode)) {
jbd_debug(1, "Inode not found."); jbd_debug(1, "Inode not found.");
return -EFSCORRUPTED; return -EFSCORRUPTED;
} }
...@@ -1564,7 +1565,7 @@ static int ext4_fc_replay_create(struct super_block *sb, struct ext4_fc_tl *tl) ...@@ -1564,7 +1565,7 @@ static int ext4_fc_replay_create(struct super_block *sb, struct ext4_fc_tl *tl)
goto out; goto out;
inode = ext4_iget(sb, darg.ino, EXT4_IGET_NORMAL); inode = ext4_iget(sb, darg.ino, EXT4_IGET_NORMAL);
if (IS_ERR_OR_NULL(inode)) { if (IS_ERR(inode)) {
jbd_debug(1, "inode %d not found.", darg.ino); jbd_debug(1, "inode %d not found.", darg.ino);
inode = NULL; inode = NULL;
ret = -EINVAL; ret = -EINVAL;
...@@ -1577,7 +1578,7 @@ static int ext4_fc_replay_create(struct super_block *sb, struct ext4_fc_tl *tl) ...@@ -1577,7 +1578,7 @@ static int ext4_fc_replay_create(struct super_block *sb, struct ext4_fc_tl *tl)
* dot and dot dot dirents are setup properly. * dot and dot dot dirents are setup properly.
*/ */
dir = ext4_iget(sb, darg.parent_ino, EXT4_IGET_NORMAL); dir = ext4_iget(sb, darg.parent_ino, EXT4_IGET_NORMAL);
if (IS_ERR_OR_NULL(dir)) { if (IS_ERR(dir)) {
jbd_debug(1, "Dir %d not found.", darg.ino); jbd_debug(1, "Dir %d not found.", darg.ino);
goto out; goto out;
} }
...@@ -1653,7 +1654,7 @@ static int ext4_fc_replay_add_range(struct super_block *sb, ...@@ -1653,7 +1654,7 @@ static int ext4_fc_replay_add_range(struct super_block *sb,
inode = ext4_iget(sb, le32_to_cpu(fc_add_ex->fc_ino), inode = ext4_iget(sb, le32_to_cpu(fc_add_ex->fc_ino),
EXT4_IGET_NORMAL); EXT4_IGET_NORMAL);
if (IS_ERR_OR_NULL(inode)) { if (IS_ERR(inode)) {
jbd_debug(1, "Inode not found."); jbd_debug(1, "Inode not found.");
return 0; return 0;
} }
...@@ -1777,7 +1778,7 @@ ext4_fc_replay_del_range(struct super_block *sb, struct ext4_fc_tl *tl) ...@@ -1777,7 +1778,7 @@ ext4_fc_replay_del_range(struct super_block *sb, struct ext4_fc_tl *tl)
le32_to_cpu(lrange->fc_ino), cur, remaining); le32_to_cpu(lrange->fc_ino), cur, remaining);
inode = ext4_iget(sb, le32_to_cpu(lrange->fc_ino), EXT4_IGET_NORMAL); inode = ext4_iget(sb, le32_to_cpu(lrange->fc_ino), EXT4_IGET_NORMAL);
if (IS_ERR_OR_NULL(inode)) { if (IS_ERR(inode)) {
jbd_debug(1, "Inode %d not found", le32_to_cpu(lrange->fc_ino)); jbd_debug(1, "Inode %d not found", le32_to_cpu(lrange->fc_ino));
return 0; return 0;
} }
...@@ -1832,7 +1833,7 @@ static void ext4_fc_set_bitmaps_and_counters(struct super_block *sb) ...@@ -1832,7 +1833,7 @@ static void ext4_fc_set_bitmaps_and_counters(struct super_block *sb)
for (i = 0; i < state->fc_modified_inodes_used; i++) { for (i = 0; i < state->fc_modified_inodes_used; i++) {
inode = ext4_iget(sb, state->fc_modified_inodes[i], inode = ext4_iget(sb, state->fc_modified_inodes[i],
EXT4_IGET_NORMAL); EXT4_IGET_NORMAL);
if (IS_ERR_OR_NULL(inode)) { if (IS_ERR(inode)) {
jbd_debug(1, "Inode %d not found.", jbd_debug(1, "Inode %d not found.",
state->fc_modified_inodes[i]); state->fc_modified_inodes[i]);
continue; continue;
...@@ -1849,7 +1850,7 @@ static void ext4_fc_set_bitmaps_and_counters(struct super_block *sb) ...@@ -1849,7 +1850,7 @@ static void ext4_fc_set_bitmaps_and_counters(struct super_block *sb)
if (ret > 0) { if (ret > 0) {
path = ext4_find_extent(inode, map.m_lblk, NULL, 0); path = ext4_find_extent(inode, map.m_lblk, NULL, 0);
if (!IS_ERR_OR_NULL(path)) { if (!IS_ERR(path)) {
for (j = 0; j < path->p_depth; j++) for (j = 0; j < path->p_depth; j++)
ext4_mb_mark_bb(inode->i_sb, ext4_mb_mark_bb(inode->i_sb,
path[j].p_block, 1, 1); path[j].p_block, 1, 1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment