diff --git a/carry.c b/carry.c index 13a03f4..af582e8 100644 --- a/carry.c +++ b/carry.c @@ -198,6 +198,7 @@ int reiser4_carry(carry_level * doing /* set of carry operations to be * NULL in most cases */) { int result = 0; + gfp_t old_mask; /* queue of new requests */ carry_level *todo; ON_DEBUG(STORE_COUNTERS); @@ -212,6 +213,9 @@ int reiser4_carry(carry_level * doing /* set of carry operations to be done = todo + 1; init_carry_level(done, doing->pool); + old_mask = get_current_context()->gfp_mask; + get_current_context()->gfp_mask |= __GFP_NOFAIL; + /* iterate until there is nothing more to do */ while (result == 0 && doing->ops_num > 0) { carry_level *tmp; @@ -271,6 +275,7 @@ int reiser4_carry(carry_level * doing /* set of carry operations to be /* give other threads chance to run */ reiser4_preempt_point(); } + get_current_context()->gfp_mask = old_mask; done_carry_level(done); /* all counters, but x_refs should remain the same. x_refs can change