ext4: prevent fsreentrance deadlock for inline_data
authorDmitry Monakhov <dmonakhov@openvz.org>
Tue, 2 Dec 2014 21:09:50 +0000 (16:09 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 2 Dec 2014 21:09:50 +0000 (16:09 -0500)
ext4_da_convert_inline_data_to_extent() invokes
grab_cache_page_write_begin().  grab_cache_page_write_begin performs
memory allocation, so fs-reentrance should be prohibited because we
are inside journal transaction.

Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/inline.c

index 3ea62695abce7b40e8d0e4969ad3fc1041358e4a..efdcede40c227ee26c2cff437a7f612265904754 100644 (file)
@@ -870,6 +870,12 @@ retry_journal:
                        goto out_journal;
        }
 
+       /*
+        * We cannot recurse into the filesystem as the transaction
+        * is already started.
+        */
+       flags |= AOP_FLAG_NOFS;
+
        if (ret == -ENOSPC) {
                ret = ext4_da_convert_inline_data_to_extent(mapping,
                                                            inode,
@@ -882,11 +888,6 @@ retry_journal:
                goto out;
        }
 
-       /*
-        * We cannot recurse into the filesystem as the transaction
-        * is already started.
-        */
-       flags |= AOP_FLAG_NOFS;
 
        page = grab_cache_page_write_begin(mapping, 0, flags);
        if (!page) {