Re: [PATCH 2/3] jffs2: avoid soft-lockup in jffs2_reserve_space_gc()

From: Li Zefan
Date: Tue Feb 11 2014 - 20:42:57 EST


>> --- a/fs/jffs2/nodemgmt.c
>> +++ b/fs/jffs2/nodemgmt.c
>> @@ -216,15 +216,20 @@ int jffs2_reserve_space_gc(struct jffs2_sb_info *c, uint32_t minsize,
>>
>> jffs2_dbg(1, "%s(): Requested 0x%x bytes\n", __func__, minsize);
>>
>> - spin_lock(&c->erase_completion_lock);
>> - while(ret == -EAGAIN) {
>> + while (true) {
>> + spin_lock(&c->erase_completion_lock);
>> ret = jffs2_do_reserve_space(c, minsize, len, sumsize);
>> if (ret) {
>> jffs2_dbg(1, "%s(): looping, ret is %d\n",
>> __func__, ret);
>> }
>> + spin_unlock(&c->erase_completion_lock);
>> +
>> + if (ret == -EAGAIN)
>> + cond_resched();
>> + else
>> + break;
>> }
>> - spin_unlock(&c->erase_completion_lock);
>> if (!ret)
>> ret = jffs2_prealloc_raw_node_refs(c, c->nextblock, 1);
>
> Looks OK. We can do this:
>

Yeah, thanks for the cleanup.

> --- a/fs/jffs2/nodemgmt.c~jffs2-avoid-soft-lockup-in-jffs2_reserve_space_gc-fix
> +++ a/fs/jffs2/nodemgmt.c
> @@ -211,7 +211,7 @@ out:
> int jffs2_reserve_space_gc(struct jffs2_sb_info *c, uint32_t minsize,
> uint32_t *len, uint32_t sumsize)
> {
> - int ret = -EAGAIN;
> + int ret;
> minsize = PAD(minsize);
>
> jffs2_dbg(1, "%s(): Requested 0x%x bytes\n", __func__, minsize);
> _

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/