ext4: Fix fs corruption when make_indexed_dir() fails
[firefly-linux-kernel-4.4.55.git] / fs / ext4 / namei.c
index 67fd0b0258589ae64428d26530807b898e79854b..cadf04b924aadbd164e9e33da10b5089be665a7f 100644 (file)
@@ -1414,9 +1414,19 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
        frame->bh = bh;
        bh = bh2;
        de = do_split(handle,dir, &bh, frame, &hinfo, &retval);
-       dx_release (frames);
-       if (!(de))
+       if (!de) {
+               /*
+                * 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.
+                */
+               ext4_mark_inode_dirty(handle, dir);
+               ext4_handle_dirty_metadata(handle, dir, frame->bh);
+               ext4_handle_dirty_metadata(handle, dir, bh);
+               dx_release(frames);
                return retval;
+       }
+       dx_release(frames);
 
        retval = add_dirent_to_buf(handle, dentry, inode, de, bh);
        brelse(bh);