• Younger Liu's avatar
    ocfs2: lighten up allocate transaction · 2b1e55c3
    Younger Liu authored
    The issue scenario is as following:
    
    When fallocating a very large disk space for a small file,
    __ocfs2_extend_allocation attempts to get a very large transaction.  For
    some journal sizes, there may be not enough room for this transaction,
    and the fallocate will fail.
    
    The patch below extends & restarts the transaction as necessary while
    allocating space, and should work with even the smallest journal.  This
    patch refers ext4 resize.
    
    Test:
    # mkfs.ocfs2 -b 4K -C 32K -T datafiles /dev/sdc
    ...(jounral size is 32M)
    # mount.ocfs2 /dev/sdc /mnt/ocfs2/
    # touch /mnt/ocfs2/1.log
    # fallocate -o 0 -l 400G /mnt/ocfs2/1.log
    fallocate: /mnt/ocfs2/1.log: fallocate failed: Cannot allocate memory
    # tail -f /var/log/messages
    [ 7372.278591] JBD: fallocate wants too many credits (2051 > 2048)
    [ 7372.278597] (fallocate,6438,0):__ocfs2_extend_allocation:709 ERROR: status = -12
    [ 7372.278603] (fallocate,6438,0):ocfs2_allocate_unwritten_extents:1504 ERROR: status = -12
    [ 7372.278607] (fallocate,6438,0):__ocfs2_change_file_space:1955 ERROR: status = -12
    ^C
    With this patch, the test works well.
    Signed-off-by: default avatarYounger Liu <younger.liu@huawei.com>
    Cc: Jie Liu <jeff.liu@oracle.com>
    Cc: Joel Becker <jlbec@evilplan.org>
    Cc: Mark Fasheh <mfasheh@suse.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    2b1e55c3
journal.h 22.4 KB