Thread (5 messages) 5 messages, 3 authors, 2021-01-05

Re: [PATCH v2] ext4: fix bug for rename with RENAME_WHITEOUT

From: yangerkun <hidden>
Date: 2021-01-05 05:59:07


在 2021/1/4 22:19, Jan Kara 写道:
On Tue 29-12-20 17:02:08, yangerkun wrote:
quoted
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:
quoted
  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...
Thanks a lot! This is actually a bug and sorry for that. We need check
retval to prevent call for ext4_setent for the correct case. I will
resend the patch!
									Honza
quoted
  		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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help