Re: [PATCH v2] ext4: fix bug for rename with RENAME_WHITEOUT
From: Jan Kara <jack@suse.cz>
Date: 2021-01-04 14:20:36
On Tue 29-12-20 17:02:08, yangerkun wrote:
ext4_rename will create a special inode for whiteout and use this 'ino' to replace the source file's dir entry 'ino'. Once error happens latter(small ext4 img, and consume all space, so the rename with dst path not exist will fail due to the ENOSPC return from ext4_add_entry in ext4_rename), the cleanup do drop the nlink for whiteout, but forget to restore 'ino' with source file. This will lead to "deleted inode referenced". Signed-off-by: yangerkun <redacted>
Thanks for the patch! It looks mostly good, just one comment below:
end_rename:
- brelse(old.dir_bh);
- brelse(old.bh);
- brelse(new.bh);
if (whiteout) {
+ ext4_setent(handle, &old,
+ old.inode->i_ino, old_file_type);I'm wondering here - how is it correct to reset the 'old' entry whenever whiteout != NULL? I'd expect this to be guarded by the if (retval) check... Honza
if (retval) drop_nlink(whiteout); unlock_new_inode(whiteout); iput(whiteout); } + brelse(old.dir_bh); + brelse(old.bh); + brelse(new.bh); if (handle) ext4_journal_stop(handle); return retval; -- 2.25.4
-- Jan Kara [off-list ref] SUSE Labs, CR