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

Commit 6b38e842 authored by Al Viro's avatar Al Viro
Browse files

nfsd race fixes: ext4



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent c38012da
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -826,7 +826,10 @@ struct inode *ext4_new_inode(handle_t *handle, struct inode *dir, int mode)
	ext4_set_inode_flags(inode);
	if (IS_DIRSYNC(inode))
		handle->h_sync = 1;
	insert_inode_hash(inode);
	if (insert_inode_locked(inode) < 0) {
		err = -EINVAL;
		goto fail_drop;
	}
	spin_lock(&sbi->s_next_gen_lock);
	inode->i_generation = sbi->s_next_generation++;
	spin_unlock(&sbi->s_next_gen_lock);
@@ -881,6 +884,7 @@ struct inode *ext4_new_inode(handle_t *handle, struct inode *dir, int mode)
	DQUOT_DROP(inode);
	inode->i_flags |= S_NOQUOTA;
	inode->i_nlink = 0;
	unlock_new_inode(inode);
	iput(inode);
	brelse(bitmap_bh);
	return ERR_PTR(err);
+13 −1
Original line number Diff line number Diff line
@@ -1693,9 +1693,11 @@ static int ext4_add_nondir(handle_t *handle,
	if (!err) {
		ext4_mark_inode_dirty(handle, inode);
		d_instantiate(dentry, inode);
		unlock_new_inode(inode);
		return 0;
	}
	drop_nlink(inode);
	unlock_new_inode(inode);
	iput(inode);
	return err;
}
@@ -1830,6 +1832,7 @@ static int ext4_mkdir(struct inode *dir, struct dentry *dentry, int mode)
	if (err) {
out_clear_inode:
		clear_nlink(inode);
		unlock_new_inode(inode);
		ext4_mark_inode_dirty(handle, inode);
		iput(inode);
		goto out_stop;
@@ -1838,6 +1841,7 @@ static int ext4_mkdir(struct inode *dir, struct dentry *dentry, int mode)
	ext4_update_dx_flag(dir);
	ext4_mark_inode_dirty(handle, dir);
	d_instantiate(dentry, inode);
	unlock_new_inode(inode);
out_stop:
	ext4_journal_stop(handle);
	if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries))
@@ -2212,6 +2216,7 @@ static int ext4_symlink(struct inode *dir,
				mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS);
		if (err) {
			clear_nlink(inode);
			unlock_new_inode(inode);
			ext4_mark_inode_dirty(handle, inode);
			iput(inode);
			goto out_stop;
@@ -2262,7 +2267,14 @@ static int ext4_link(struct dentry *old_dentry,
	ext4_inc_count(handle, inode);
	atomic_inc(&inode->i_count);

	err = ext4_add_nondir(handle, dentry, inode);
	err = ext4_add_entry(handle, dentry, inode);
	if (!err) {
		ext4_mark_inode_dirty(handle, inode);
		d_instantiate(dentry, inode);
	} else {
		drop_nlink(inode);
		iput(inode);
	}
	ext4_journal_stop(handle);
	if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries))
		goto retry;