| 809 | |
| 810 | |
| 811 | BOOLEAN |
| 812 | Ext2ZeroBuffer( 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 |
no test coverage detected