• F
    kill-the-bkl/reiserfs: lock only once on reiserfs_get_block() · 26931309
    Frederic Weisbecker 提交于
    reiserfs_get_block() is one of these sites where the write lock might
    be acquired recursively.
    
    It's a particular problem because this function is called very often.
    It's a hot spot which needs to reschedule() periodically while converting
    direct items to indirect ones because it can take some time.
    
    Then if we are applying the write lock release/reacquire pattern on
    schedule() here, it may not produce the desired effect since we may have
    locked in more than one depth.
    
    The solution is to use reiserfs_write_lock_once() which won't try
    to reacquire the lock recursively. Then the lock will be *really*
    released before schedule().
    
    Also, we only release the lock if TIF_NEED_RESCHED is set to not
    create wasteful numerous contentions.
    
    [ Impact: fix a too long holded lock case in reiserfs_get_block() ]
    
    Cc: Jeff Mahoney <jeffm@suse.com>
    Cc: Chris Mason <chris.mason@oracle.com>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Alexander Beregalov <a.beregalov@gmail.com>
    Signed-off-by: NFrederic Weisbecker <fweisbec@gmail.com>
    26931309
inode.c 91.1 KB