Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4cdeed86 authored by Aneesh Kumar K.V's avatar Aneesh Kumar K.V Committed by Theodore Ts'o
Browse files

ext4: Don't leave behind a half-created inode if ext4_mkdir() fails



If ext4_mkdir() fails to allocate the initial block for the directory,
don't leave behind a half-created directory inode with the link count
left at one.  This was caused by an inappropriate call to ext4_dec_count().

Signed-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: default avatarMingming Cao <cmm@us.ibm.com>
Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
parent b73fce69
Loading
Loading
Loading
Loading
+4 −7
Original line number Diff line number Diff line
@@ -1804,12 +1804,8 @@ static int ext4_mkdir(struct inode * dir, struct dentry * dentry, int mode)
	inode->i_fop = &ext4_dir_operations;
	inode->i_size = EXT4_I(inode)->i_disksize = inode->i_sb->s_blocksize;
	dir_block = ext4_bread (handle, inode, 0, 1, &err);
	if (!dir_block) {
		ext4_dec_count(handle, inode); /* is this nlink == 0? */
		ext4_mark_inode_dirty(handle, inode);
		iput (inode);
		goto out_stop;
	}
	if (!dir_block)
		goto out_clear_inode;
	BUFFER_TRACE(dir_block, "get_write_access");
	ext4_journal_get_write_access(handle, dir_block);
	de = (struct ext4_dir_entry_2 *) dir_block->b_data;
@@ -1832,7 +1828,8 @@ static int ext4_mkdir(struct inode * dir, struct dentry * dentry, int mode)
	ext4_mark_inode_dirty(handle, inode);
	err = ext4_add_entry (handle, dentry, inode);
	if (err) {
		inode->i_nlink = 0;
out_clear_inode:
		clear_nlink(inode);
		ext4_mark_inode_dirty(handle, inode);
		iput (inode);
		goto out_stop;