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

Commit c38012da authored by Al Viro's avatar Al Viro
Browse files

nfsd race fixes: ext3



ext3 analog of the previous patch

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 41080b5a
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -579,7 +579,10 @@ struct inode *ext3_new_inode(handle_t *handle, struct inode * dir, int mode)
	ext3_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);
@@ -627,6 +630,7 @@ struct inode *ext3_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);
+14 −1
Original line number Diff line number Diff line
@@ -1652,9 +1652,11 @@ static int ext3_add_nondir(handle_t *handle,
	if (!err) {
		ext3_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;
}
@@ -1765,6 +1767,7 @@ static int ext3_mkdir(struct inode * dir, struct dentry * dentry, int mode)
	dir_block = ext3_bread (handle, inode, 0, 1, &err);
	if (!dir_block) {
		drop_nlink(inode); /* is this nlink == 0? */
		unlock_new_inode(inode);
		ext3_mark_inode_dirty(handle, inode);
		iput (inode);
		goto out_stop;
@@ -1792,6 +1795,7 @@ static int ext3_mkdir(struct inode * dir, struct dentry * dentry, int mode)
	err = ext3_add_entry (handle, dentry, inode);
	if (err) {
		inode->i_nlink = 0;
		unlock_new_inode(inode);
		ext3_mark_inode_dirty(handle, inode);
		iput (inode);
		goto out_stop;
@@ -1800,6 +1804,7 @@ static int ext3_mkdir(struct inode * dir, struct dentry * dentry, int mode)
	ext3_update_dx_flag(dir);
	ext3_mark_inode_dirty(handle, dir);
	d_instantiate(dentry, inode);
	unlock_new_inode(inode);
out_stop:
	ext3_journal_stop(handle);
	if (err == -ENOSPC && ext3_should_retry_alloc(dir->i_sb, &retries))
@@ -2174,6 +2179,7 @@ static int ext3_symlink (struct inode * dir,
				mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS);
		if (err) {
			drop_nlink(inode);
			unlock_new_inode(inode);
			ext3_mark_inode_dirty(handle, inode);
			iput (inode);
			goto out_stop;
@@ -2221,7 +2227,14 @@ static int ext3_link (struct dentry * old_dentry,
	inc_nlink(inode);
	atomic_inc(&inode->i_count);

	err = ext3_add_nondir(handle, dentry, inode);
	err = ext3_add_entry(handle, dentry, inode);
	if (!err) {
		ext3_mark_inode_dirty(handle, inode);
		d_instantiate(dentry, inode);
	} else {
		drop_nlink(inode);
		iput(inode);
	}
	ext3_journal_stop(handle);
	if (err == -ENOSPC && ext3_should_retry_alloc(dir->i_sb, &retries))
		goto retry;