- retval = add_dirent_to_buf(handle, dentry, inode, de, bh);
- brelse(bh);
+ retval = add_dirent_to_buf(handle, dentry, inode, de, bh2);
+out_frames:
+ /*
+ * Even if the block split failed, we have to properly write
+ * out all the changes we did so far. Otherwise we can end up
+ * with corrupted filesystem.
+ */
+ if (retval)
+ ext4_mark_inode_dirty(handle, dir);
+ dx_release(frames);
+ brelse(bh2);