[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20210104141953.GF4018@quack2.suse.cz>
Date: Mon, 4 Jan 2021 15:19:53 +0100
From: Jan Kara <jack@...e.cz>
To: yangerkun <yangerkun@...wei.com>
Cc: linux-ext4@...r.kernel.org, tytso@....edu,
adilger.kernel@...ger.ca, jack@...e.cz, yi.zhang@...wei.com,
lihaotian9@...wei.com, lutianxiong@...wei.com,
linfeilong@...wei.com
Subject: Re: [PATCH v2] ext4: fix bug for rename with RENAME_WHITEOUT
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 <yangerkun@...wei.com>
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 <jack@...e.com>
SUSE Labs, CR
Powered by blists - more mailing lists