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

Function Ext2SaveBuffer

Ext4Fsd/ext3/generic.c:882–947  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

880
881
882BOOLEAN
883Ext2SaveBuffer( IN PEXT2_IRP_CONTEXT IrpContext,
884 IN PEXT2_VCB Vcb,
885 IN LONGLONG offset,
886 IN ULONG size,
887 IN PVOID buf )
888{
889 struct buffer_head *bh = NULL;
890 BOOLEAN rc = 0;
891
892 __try {
893
894 while (size) {
895
896 sector_t block;
897 ULONG len = 0, delta = 0;
898
899 block = (sector_t) (offset >> BLOCK_BITS);
900 delta = (ULONG)offset & (BLOCK_SIZE - 1);
901 len = BLOCK_SIZE - delta;
902 if (size < len)
903 len = size;
904
905 if (delta == 0 && len >= BLOCK_SIZE) {
906 bh = sb_getblk_zero(&Vcb->sb, block);
907 } else {
908 bh = sb_getblk(&Vcb->sb, block);
909 }
910
911 if (!bh) {
912 DEBUG(DL_ERR, ("Ext2SaveBuffer: can't load block %I64u\n", block));
913 DbgBreak();
914 __leave;
915 }
916
917 if (!buffer_uptodate(bh)) {
918 int err = bh_submit_read(bh);
919 if (err < 0) {
920 DEBUG(DL_ERR, ("Ext2SaveBuffer: bh_submit_read failed: %d\n", err));
921 __leave;
922 }
923 }
924
925 __try {
926 RtlCopyMemory(bh->b_data + delta, buf, len);
927 mark_buffer_dirty(bh);
928 } __finally {
929 fini_bh(&bh);
930 }
931
932 buf = (PUCHAR)buf + len;
933 offset = offset + len;
934 size = size - len;
935 }
936
937 rc = TRUE;
938
939 } __finally {

Callers 4

Ext2WriteInodeFunction · 0.85
Ext2SaveSuperFunction · 0.85
Ext2SaveInodeFunction · 0.85
Ext2SaveInodeXattrFunction · 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