|
@@ -1416,10 +1416,19 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
|
|
|
frame->at = entries;
|
|
|
frame->bh = bh;
|
|
|
bh = bh2;
|
|
|
+ /*
|
|
|
+ * Mark buffers dirty here so that if do_split() fails we write a
|
|
|
+ * consistent set of buffers to disk.
|
|
|
+ */
|
|
|
+ ext3_journal_dirty_metadata(handle, frame->bh);
|
|
|
+ ext3_journal_dirty_metadata(handle, bh);
|
|
|
de = do_split(handle,dir, &bh, frame, &hinfo, &retval);
|
|
|
- dx_release (frames);
|
|
|
- if (!(de))
|
|
|
+ if (!de) {
|
|
|
+ ext3_mark_inode_dirty(handle, dir);
|
|
|
+ dx_release(frames);
|
|
|
return retval;
|
|
|
+ }
|
|
|
+ dx_release(frames);
|
|
|
|
|
|
return add_dirent_to_buf(handle, dentry, inode, de, bh);
|
|
|
}
|
|
@@ -2282,7 +2291,7 @@ out_stop:
|
|
|
return err;
|
|
|
err_drop_inode:
|
|
|
unlock_new_inode(inode);
|
|
|
- iput (inode);
|
|
|
+ iput(inode);
|
|
|
return err;
|
|
|
}
|
|
|
|