|
@@ -278,22 +278,16 @@ static int start_this_handle(journal_t *journal, handle_t *handle,
|
|
|
|
|
|
alloc_transaction:
|
|
|
if (!journal->j_running_transaction) {
|
|
|
+ /*
|
|
|
+ * If __GFP_FS is not present, then we may be being called from
|
|
|
+ * inside the fs writeback layer, so we MUST NOT fail.
|
|
|
+ */
|
|
|
+ if ((gfp_mask & __GFP_FS) == 0)
|
|
|
+ gfp_mask |= __GFP_NOFAIL;
|
|
|
new_transaction = kmem_cache_zalloc(transaction_cache,
|
|
|
gfp_mask);
|
|
|
- if (!new_transaction) {
|
|
|
- /*
|
|
|
- * If __GFP_FS is not present, then we may be
|
|
|
- * being called from inside the fs writeback
|
|
|
- * layer, so we MUST NOT fail. Since
|
|
|
- * __GFP_NOFAIL is going away, we will arrange
|
|
|
- * to retry the allocation ourselves.
|
|
|
- */
|
|
|
- if ((gfp_mask & __GFP_FS) == 0) {
|
|
|
- congestion_wait(BLK_RW_ASYNC, HZ/50);
|
|
|
- goto alloc_transaction;
|
|
|
- }
|
|
|
+ if (!new_transaction)
|
|
|
return -ENOMEM;
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
jbd_debug(3, "New handle %p going live.\n", handle);
|