• K
    jffs2: GC deadlock reading a page that is used in jffs2_write_begin() · aa39cc67
    Kyeong Yoo 提交于
    GC task can deadlock in read_cache_page() because it may attempt
    to release a page that is actually allocated by another task in
    jffs2_write_begin().
    The reason is that in jffs2_write_begin() there is a small window
    a cache page is allocated for use but not set Uptodate yet.
    
    This ends up with a deadlock between two tasks:
    1) A task (e.g. file copy)
       - jffs2_write_begin() locks a cache page
       - jffs2_write_end() tries to lock "alloc_sem" from
    	 jffs2_reserve_space() <-- STUCK
    2) GC task (jffs2_gcd_mtd3)
       - jffs2_garbage_collect_pass() locks "alloc_sem"
       - try to lock the same cache page in read_cache_page() <-- STUCK
    
    So to avoid this deadlock, hold "alloc_sem" in jffs2_write_begin()
    while reading data in a cache page.
    Signed-off-by: NKyeong Yoo <kyeong.yoo@alliedtelesis.co.nz>
    Signed-off-by: NRichard Weinberger <richard@nod.at>
    aa39cc67
file.c 9.4 KB