MCPcopy Create free account
hub / github.com/bobranten/Ext4Fsd / Ext2ZeroBuffer

Function Ext2ZeroBuffer

Ext4Fsd/ext3/generic.c:811–879  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

809
810
811BOOLEAN
812Ext2ZeroBuffer( IN PEXT2_IRP_CONTEXT IrpContext,
813 IN PEXT2_VCB Vcb,
814 IN LONGLONG offset,
815 IN ULONG size
816 )
817{
818 struct buffer_head *bh = NULL;
819 BOOLEAN rc = 0;
820
821 __try {
822
823 while (size) {
824
825 sector_t block;
826 ULONG len = 0, delta = 0;
827
828 block = (sector_t) (offset >> BLOCK_BITS);
829 delta = (ULONG)offset & (BLOCK_SIZE - 1);
830 len = BLOCK_SIZE - delta;
831 if (size < len)
832 len = size;
833
834 if (delta == 0 && len >= BLOCK_SIZE) {
835 bh = sb_getblk_zero(&Vcb->sb, block);
836 } else {
837 bh = sb_getblk(&Vcb->sb, block);
838 }
839
840 if (!bh) {
841 DEBUG(DL_ERR, ("Ext2SaveBuffer: can't load block %I64u\n", block));
842 DbgBreak();
843 __leave;
844 }
845
846 if (!buffer_uptodate(bh)) {
847 int err = bh_submit_read(bh);
848 if (err < 0) {
849 DEBUG(DL_ERR, ("Ext2SaveBuffer: bh_submit_read failed: %d\n", err));
850 __leave;
851 }
852 }
853
854 __try {
855 if (delta == 0 && len >= BLOCK_SIZE) {
856 /* bh (cache) was already cleaned as zero */
857 } else {
858 RtlZeroMemory(bh->b_data + delta, len);
859 }
860 mark_buffer_dirty(bh);
861 } __finally {
862 fini_bh(&bh);
863 }
864
865 offset = offset + len;
866 size = size - len;
867 }
868

Callers 1

Ext2ClearInodeFunction · 0.85

Calls 5

sb_getblk_zeroFunction · 0.85
sb_getblkFunction · 0.85
bh_submit_readFunction · 0.85
mark_buffer_dirtyFunction · 0.85
fini_bhFunction · 0.85

Tested by

no test coverage detected