• Jia Guo's avatar
    ocfs2: clear zero in unaligned direct IO · 7a243c82
    Jia Guo authored
    Unused portion of a part-written fs-block-sized block is not set to zero
    in unaligned append direct write.This can lead to serious data
    inconsistencies.
    
    Ocfs2 manage disk with cluster size(for example, 1M), part-written in
    one cluster will change the cluster state from UN-WRITTEN to WRITTEN,
    VFS(function dio_zero_block) doesn't do the cleaning because bh's state
    is not set to NEW in function ocfs2_dio_wr_get_block when we write a
    WRITTEN cluster.  For example, the cluster size is 1M, file size is 8k
    and we direct write from 14k to 15k, then 12k~14k and 15k~16k will
    contain dirty data.
    
    We have to deal with two cases:
     1.The starting position of direct write is outside the file.
     2.The starting position of direct write is located in the file.
    
    We need set bh's state to NEW in the first case.  In the second case, we
    need mapped twice because bh's state of area out file should be set to
    NEW while area in file not.
    
    [akpm@linux-foundation.org: coding style fixes]
    Link: http://lkml.kernel.org/r/5292e287-8f1a-fd4a-1a14-661e555e0bed@huawei.comSigned-off-by: default avatarJia Guo <guojia12@huawei.com>
    Reviewed-by: default avatarYiwen Jiang <jiangyiwen@huawei.com>
    Cc: Mark Fasheh <mark@fasheh.com>
    Cc: Joel Becker <jlbec@evilplan.org>
    Cc: Junxiao Bi <junxiao.bi@oracle.com>
    Cc: Joseph Qi <joseph.qi@huawei.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    7a243c82
aops.c 62.2 KB