* along with WinBtrfs. If not, see <http://www.gnu.org/licenses/>. */
#include "btrfs_drv.h"
+#include "crc32c.h"
// Number of increments in the size of each cache inode, in sectors. Should
// this be a constant number of sectors, a constant 256 KB, or what?
Status = open_fcb(Vcb, Vcb->root_root, inode, BTRFS_TYPE_FILE, NULL, false, NULL, &fcb, PagedPool, Irp);
if (!NT_SUCCESS(Status)) {
- ERR("open_fcb returned %08x\n", Status);
+ ERR("open_fcb returned %08lx\n", Status);
return Status;
}
if (fcb->inode_item.st_size > 0) {
Status = excise_extents(fcb->Vcb, fcb, 0, sector_align(fcb->inode_item.st_size, fcb->Vcb->superblock.sector_size), Irp, rollback);
if (!NT_SUCCESS(Status)) {
- ERR("excise_extents returned %08x\n", Status);
+ ERR("excise_extents returned %08lx\n", Status);
return Status;
}
}
Status = flush_fcb(fcb, false, batchlist, Irp);
if (!NT_SUCCESS(Status)) {
- ERR("flush_fcb returned %08x\n", Status);
+ ERR("flush_fcb returned %08lx\n", Status);
free_fcb(fcb);
return Status;
}
Status = find_item(Vcb, Vcb->root_root, &tp, &searchkey, false, Irp);
if (!NT_SUCCESS(Status)) {
- ERR("error - find_item returned %08x\n", Status);
+ ERR("error - find_item returned %08lx\n", Status);
return Status;
}
if (tp.item->key.obj_id == searchkey.obj_id && tp.item->key.obj_type == searchkey.obj_type) {
Status = delete_tree_item(Vcb, &tp);
if (!NT_SUCCESS(Status)) {
- ERR("delete_tree_item returned %08x\n", Status);
+ ERR("delete_tree_item returned %08lx\n", Status);
return Status;
}
Status = remove_free_space_inode(Vcb, fsi->key.obj_id, batchlist, Irp, &rollback);
if (!NT_SUCCESS(Status))
- ERR("remove_free_space_inode for (%I64x,%x,%I64x) returned %08x\n", fsi->key.obj_id, fsi->key.obj_type, fsi->key.offset, Status);
+ ERR("remove_free_space_inode for (%I64x,%x,%I64x) returned %08lx\n", fsi->key.obj_id, fsi->key.obj_type, fsi->key.offset, Status);
le = Vcb->chunks.Flink;
while (le != &Vcb->chunks) {
}
}
} else
- WARN("(%I64x,%x,%I64x) was %u bytes, expected %u\n", tp.item->key.obj_id, tp.item->key.obj_type, tp.item->key.offset, tp.item->size, sizeof(FREE_SPACE_ITEM));
+ WARN("(%I64x,%x,%I64x) was %u bytes, expected %Iu\n", tp.item->key.obj_id, tp.item->key.obj_type, tp.item->key.offset, tp.item->size, sizeof(FREE_SPACE_ITEM));
}
b = find_next_item(Vcb, &tp, &next_tp, false, Irp);
Status = find_item(Vcb, Vcb->space_root, &tp, &searchkey, false, Irp);
if (!NT_SUCCESS(Status)) {
- ERR("find_item returned %08x\n", Status);
+ ERR("find_item returned %08lx\n", Status);
return Status;
}
do {
Status = delete_tree_item(Vcb, &tp);
if (!NT_SUCCESS(Status)) {
- ERR("delete_tree_item returned %08x\n", Status);
+ ERR("delete_tree_item returned %08lx\n", Status);
return Status;
}
Status = load_cache_chunk(Vcb, c, NULL);
if (!NT_SUCCESS(Status)) {
- ERR("load_cache_chunk(%I64x) returned %08x\n", c->offset, Status);
+ ERR("load_cache_chunk(%I64x) returned %08lx\n", c->offset, Status);
release_chunk_lock(c, Vcb);
ExReleaseResourceLite(&Vcb->chunk_lock);
return Status;
Status = add_superblock_stripe(&stripes, off_start / ci->stripe_length, 1);
if (!NT_SUCCESS(Status)) {
- ERR("add_superblock_stripe returned %08x\n", Status);
+ ERR("add_superblock_stripe returned %08lx\n", Status);
goto end;
}
}
Status = add_superblock_stripe(&stripes, off_start / ci->stripe_length, (off_end - off_start) / ci->stripe_length);
if (!NT_SUCCESS(Status)) {
- ERR("add_superblock_stripe returned %08x\n", Status);
+ ERR("add_superblock_stripe returned %08lx\n", Status);
goto end;
}
}
Status = add_superblock_stripe(&stripes, off_start / ci->stripe_length, (off_end - off_start) / ci->stripe_length);
if (!NT_SUCCESS(Status)) {
- ERR("add_superblock_stripe returned %08x\n", Status);
+ ERR("add_superblock_stripe returned %08lx\n", Status);
goto end;
}
}
}
- } else { // SINGLE, DUPLICATE, RAID1
+ } else { // SINGLE, DUPLICATE, RAID1, RAID1C3, RAID1C4
for (j = 0; j < ci->num_stripes; j++) {
if (cis[j].offset + ci->size > superblock_addrs[i] && cis[j].offset <= superblock_addrs[i] + sizeof(superblock)) {
off_start = ((superblock_addrs[i] - cis[j].offset) / c->chunk_item->stripe_length) * c->chunk_item->stripe_length;
Status = add_superblock_stripe(&stripes, off_start / ci->stripe_length, (off_end - off_start) / ci->stripe_length);
if (!NT_SUCCESS(Status)) {
- ERR("add_superblock_stripe returned %08x\n", Status);
+ ERR("add_superblock_stripe returned %08lx\n", Status);
goto end;
}
}
Status = find_item(Vcb, Vcb->root_root, &tp, &searchkey, false, Irp);
if (!NT_SUCCESS(Status)) {
- ERR("error - find_item returned %08x\n", Status);
+ ERR("error - find_item returned %08lx\n", Status);
return Status;
}
}
if (tp.item->size < sizeof(FREE_SPACE_ITEM)) {
- WARN("(%I64x,%x,%I64x) was %u bytes, expected %u\n", tp.item->key.obj_id, tp.item->key.obj_type, tp.item->key.offset, tp.item->size, sizeof(FREE_SPACE_ITEM));
+ WARN("(%I64x,%x,%I64x) was %u bytes, expected %Iu\n", tp.item->key.obj_id, tp.item->key.obj_type, tp.item->key.offset, tp.item->size, sizeof(FREE_SPACE_ITEM));
return STATUS_NOT_FOUND;
}
Status = open_fcb(Vcb, Vcb->root_root, inode, BTRFS_TYPE_FILE, NULL, false, NULL, &c->cache, PagedPool, Irp);
if (!NT_SUCCESS(Status)) {
- ERR("open_fcb returned %08x\n", Status);
+ ERR("open_fcb returned %08lx\n", Status);
return STATUS_NOT_FOUND;
}
Status = read_file(c->cache, data, 0, c->cache->inode_item.st_size, NULL, NULL);
if (!NT_SUCCESS(Status)) {
- ERR("read_file returned %08x\n", Status);
+ ERR("read_file returned %08lx\n", Status);
ExFreePool(data);
c->cache->deleted = true;
num_valid_sectors = (ULONG)((sector_align(extent_length, Vcb->superblock.sector_size) / Vcb->superblock.sector_size) + num_bitmaps);
if (num_valid_sectors > num_sectors) {
- ERR("free space cache for %I64x was %I64x sectors, expected at least %I64x\n", c->offset, num_sectors, num_valid_sectors);
+ ERR("free space cache for %I64x was %u sectors, expected at least %u\n", c->offset, num_sectors, num_valid_sectors);
goto clearcache;
}
crc32 = ~calc_crc32c(0xffffffff, &data[sizeof(uint32_t) * num_sectors], ((i + 1) * Vcb->superblock.sector_size) - (sizeof(uint32_t) * num_sectors));
if (crc32 != checksums[i]) {
- WARN("checksum %I64u was %08x, expected %08x\n", i, crc32, checksums[i]);
+ WARN("checksum %u was %08x, expected %08x\n", i, crc32, checksums[i]);
goto clearcache;
}
}
if (fse->type == FREE_SPACE_EXTENT) {
Status = add_space_entry(&c->space, &c->space_size, fse->offset, fse->size);
if (!NT_SUCCESS(Status)) {
- ERR("add_space_entry returned %08x\n", Status);
+ ERR("add_space_entry returned %08lx\n", Status);
ExFreePool(data);
return Status;
}
Status = get_superblock_size(c, &superblock_size);
if (!NT_SUCCESS(Status)) {
- ERR("get_superblock_size returned %08x\n", Status);
+ ERR("get_superblock_size returned %08lx\n", Status);
ExFreePool(data);
return Status;
}
Status = delete_tree_item(Vcb, &tp);
if (!NT_SUCCESS(Status)) {
- ERR("delete_tree_item returned %08x\n", Status);
+ ERR("delete_tree_item returned %08lx\n", Status);
return Status;
}
Status = excise_extents(Vcb, c->cache, 0, c->cache->inode_item.st_size, Irp, &rollback);
if (!NT_SUCCESS(Status)) {
- ERR("excise_extents returned %08x\n", Status);
+ ERR("excise_extents returned %08lx\n", Status);
do_rollback(Vcb, &rollback);
return Status;
}
Status = find_item(Vcb, Vcb->space_root, &tp, &searchkey, false, Irp);
if (!NT_SUCCESS(Status)) {
- ERR("find_item returned %08x\n", Status);
+ ERR("find_item returned %08lx\n", Status);
return Status;
}
}
if (tp.item->size < sizeof(FREE_SPACE_INFO)) {
- WARN("(%I64x,%x,%I64x) was %u bytes, expected %u\n", tp.item->key.obj_id, tp.item->key.obj_type, tp.item->key.offset, tp.item->size, sizeof(FREE_SPACE_INFO));
+ WARN("(%I64x,%x,%I64x) was %u bytes, expected %Iu\n", tp.item->key.obj_id, tp.item->key.obj_type, tp.item->key.offset, tp.item->size, sizeof(FREE_SPACE_INFO));
return STATUS_NOT_FOUND;
}
if (tp.item->key.obj_type == TYPE_FREE_SPACE_EXTENT) {
Status = add_space_entry(&c->space, &c->space_size, tp.item->key.obj_id, tp.item->key.offset);
if (!NT_SUCCESS(Status)) {
- ERR("add_space_entry returned %08x\n", Status);
+ ERR("add_space_entry returned %08lx\n", Status);
if (bmparr) ExFreePool(bmparr);
return Status;
}
explen = (ULONG)(tp.item->key.offset / (Vcb->superblock.sector_size * 8));
if (tp.item->size < explen) {
- WARN("(%I64x,%x,%I64x) was %u bytes, expected %u\n", tp.item->key.obj_id, tp.item->key.obj_type, tp.item->key.offset, tp.item->size, explen);
+ WARN("(%I64x,%x,%I64x) was %u bytes, expected %lu\n", tp.item->key.obj_id, tp.item->key.obj_type, tp.item->key.offset, tp.item->size, explen);
return STATUS_NOT_FOUND;
} else if (tp.item->size == 0) {
WARN("(%I64x,%x,%I64x) has size of 0\n", tp.item->key.obj_id, tp.item->key.obj_type, tp.item->key.offset);
if (runstart > lastoff) {
Status = add_space_entry(&c->space, &c->space_size, lastoff, runstart - lastoff);
if (!NT_SUCCESS(Status)) {
- ERR("add_space_entry returned %08x\n", Status);
+ ERR("add_space_entry returned %08lx\n", Status);
if (bmparr) ExFreePool(bmparr);
return Status;
}
if (lastoff < tp.item->key.obj_id + tp.item->key.offset) {
Status = add_space_entry(&c->space, &c->space_size, lastoff, tp.item->key.obj_id + tp.item->key.offset - lastoff);
if (!NT_SUCCESS(Status)) {
- ERR("add_space_entry returned %08x\n", Status);
+ ERR("add_space_entry returned %08lx\n", Status);
if (bmparr) ExFreePool(bmparr);
return Status;
}
Status = load_stored_free_space_tree(Vcb, c, Irp);
if (!NT_SUCCESS(Status) && Status != STATUS_NOT_FOUND) {
- ERR("load_stored_free_space_tree returned %08x\n", Status);
+ ERR("load_stored_free_space_tree returned %08lx\n", Status);
return Status;
}
} else if (Vcb->superblock.generation - 1 == Vcb->superblock.cache_generation) {
Status = load_stored_free_space_cache(Vcb, c, false, Irp);
if (!NT_SUCCESS(Status) && Status != STATUS_NOT_FOUND) {
- ERR("load_stored_free_space_cache returned %08x\n", Status);
+ ERR("load_stored_free_space_cache returned %08lx\n", Status);
return Status;
}
} else
Status = find_item(Vcb, Vcb->extent_root, &tp, &searchkey, false, Irp);
if (!NT_SUCCESS(Status)) {
- ERR("error - find_item returned %08x\n", Status);
+ ERR("error - find_item returned %08lx\n", Status);
return Status;
}
Status = load_free_space_cache(Vcb, c, Irp);
if (!NT_SUCCESS(Status)) {
- ERR("load_free_space_cache returned %08x\n", Status);
+ ERR("load_free_space_cache returned %08lx\n", Status);
return Status;
}
Status = alloc_chunk(fcb->Vcb, flags, &c, false);
if (!NT_SUCCESS(Status)) {
- ERR("alloc_chunk returned %08x\n", Status);
+ ERR("alloc_chunk returned %08lx\n", Status);
return Status;
}
Status = find_item(Vcb, Vcb->root_root, &tp, &searchkey, false, Irp);
if (!NT_SUCCESS(Status)) {
- ERR("error - find_item returned %08x\n", Status);
+ ERR("error - find_item returned %08lx\n", Status);
ExFreePool(fsi);
reap_fcb(c->cache);
c->cache = NULL;
if (!keycmp(searchkey, tp.item->key)) {
Status = delete_tree_item(Vcb, &tp);
if (!NT_SUCCESS(Status)) {
- ERR("delete_tree_item returned %08x\n", Status);
+ ERR("delete_tree_item returned %08lx\n", Status);
ExFreePool(fsi);
reap_fcb(c->cache);
c->cache = NULL;
Status = insert_tree_item(Vcb, Vcb->root_root, FREE_SPACE_CACHE_ID, 0, c->offset, fsi, sizeof(FREE_SPACE_ITEM), NULL, Irp);
if (!NT_SUCCESS(Status)) {
- ERR("insert_tree_item returned %08x\n", Status);
+ ERR("insert_tree_item returned %08lx\n", Status);
ExFreePool(fsi);
reap_fcb(c->cache);
c->cache = NULL;
Status = insert_cache_extent(c->cache, 0, new_cache_size, rollback);
if (!NT_SUCCESS(Status)) {
- ERR("insert_cache_extent returned %08x\n", Status);
+ ERR("insert_cache_extent returned %08lx\n", Status);
reap_fcb(c->cache);
c->cache = NULL;
return Status;
Status = flush_fcb(c->cache, true, batchlist, Irp);
if (!NT_SUCCESS(Status)) {
- ERR("flush_fcb returned %08x\n", Status);
+ ERR("flush_fcb returned %08lx\n", Status);
free_fcb(c->cache);
c->cache = NULL;
return Status;
Status = find_item(Vcb, Vcb->root_root, &tp, &searchkey, false, Irp);
if (!NT_SUCCESS(Status)) {
- ERR("error - find_item returned %08x\n", Status);
+ ERR("error - find_item returned %08lx\n", Status);
return Status;
}
}
if (tp.item->size < sizeof(FREE_SPACE_ITEM)) {
- ERR("(%I64x,%x,%I64x) was %u bytes, expected %u\n", tp.item->key.obj_id, tp.item->key.obj_type, tp.item->key.offset, tp.item->size, sizeof(FREE_SPACE_ITEM));
+ ERR("(%I64x,%x,%I64x) was %u bytes, expected %Iu\n", tp.item->key.obj_id, tp.item->key.obj_type, tp.item->key.offset, tp.item->size, sizeof(FREE_SPACE_ITEM));
return STATUS_INTERNAL_ERROR;
}
Status = excise_extents(Vcb, c->cache, 0, c->cache->inode_item.st_size, Irp, rollback);
if (!NT_SUCCESS(Status)) {
- ERR("excise_extents returned %08x\n", Status);
+ ERR("excise_extents returned %08lx\n", Status);
return Status;
}
}
Status = insert_cache_extent(c->cache, 0, new_cache_size, rollback);
if (!NT_SUCCESS(Status)) {
- ERR("insert_cache_extent returned %08x\n", Status);
+ ERR("insert_cache_extent returned %08lx\n", Status);
return Status;
}
Status = flush_fcb(c->cache, true, batchlist, Irp);
if (!NT_SUCCESS(Status)) {
- ERR("flush_fcb returned %08x\n", Status);
+ ERR("flush_fcb returned %08lx\n", Status);
return Status;
}
Status = find_item(Vcb, Vcb->root_root, &tp, &searchkey, false, Irp);
if (!NT_SUCCESS(Status)) {
- ERR("error - find_item returned %08x\n", Status);
+ ERR("error - find_item returned %08lx\n", Status);
return Status;
}
Status = insert_tree_item(Vcb, Vcb->root_root, c->cache->inode, TYPE_INODE_ITEM, 0, ii, sizeof(INODE_ITEM), NULL, Irp);
if (!NT_SUCCESS(Status)) {
- ERR("insert_tree_item returned %08x\n", Status);
+ ERR("insert_tree_item returned %08lx\n", Status);
ExFreePool(ii);
return Status;
}
*changed = true;
} else {
if (tp.item->size < sizeof(INODE_ITEM)) {
- ERR("(%I64x,%x,%I64x) was %u bytes, expected %u\n", tp.item->key.obj_id, tp.item->key.obj_type, tp.item->key.offset, tp.item->size, sizeof(INODE_ITEM));
+ ERR("(%I64x,%x,%I64x) was %u bytes, expected %Iu\n", tp.item->key.obj_id, tp.item->key.obj_type, tp.item->key.offset, tp.item->size, sizeof(INODE_ITEM));
return STATUS_INTERNAL_ERROR;
}
Status = find_item(Vcb, Vcb->root_root, &tp, &searchkey, false, Irp);
if (!NT_SUCCESS(Status)) {
- ERR("error - find_item returned %08x\n", Status);
+ ERR("error - find_item returned %08lx\n", Status);
return Status;
}
}
if (tp.item->size < sizeof(FREE_SPACE_ITEM)) {
- ERR("(%I64x,%x,%I64x) was %u bytes, expected %u\n", tp.item->key.obj_id, tp.item->key.obj_type, tp.item->key.offset, tp.item->size, sizeof(FREE_SPACE_ITEM));
+ ERR("(%I64x,%x,%I64x) was %u bytes, expected %Iu\n", tp.item->key.obj_id, tp.item->key.obj_type, tp.item->key.offset, tp.item->size, sizeof(FREE_SPACE_ITEM));
return STATUS_INTERNAL_ERROR;
}
*changed = true;
if (!NT_SUCCESS(Status)) {
- ERR("allocate_cache_chunk(%I64x) returned %08x\n", c->offset, Status);
+ ERR("allocate_cache_chunk(%I64x) returned %08lx\n", c->offset, Status);
ExReleaseResourceLite(&Vcb->chunk_lock);
clear_batch_list(Vcb, &batchlist);
return Status;
Status = commit_batch_list(Vcb, &batchlist, Irp);
if (!NT_SUCCESS(Status)) {
- ERR("commit_batch_list returned %08x\n", Status);
+ ERR("commit_batch_list returned %08lx\n", Status);
return Status;
}
Status = flush_fcb(c->cache, true, batchlist, Irp);
if (!NT_SUCCESS(Status)) {
- ERR("flush_fcb returned %08x\n", Status);
+ ERR("flush_fcb returned %08lx\n", Status);
goto end;
}
Status = find_item(Vcb, Vcb->root_root, &tp, &searchkey, false, Irp);
if (!NT_SUCCESS(Status)) {
- ERR("error - find_item returned %08x\n", Status);
+ ERR("error - find_item returned %08lx\n", Status);
goto end;
}
}
if (tp.item->size < sizeof(FREE_SPACE_ITEM)) {
- ERR("(%I64x,%x,%I64x) was %u bytes, expected %u\n", tp.item->key.obj_id, tp.item->key.obj_type, tp.item->key.offset, tp.item->size, sizeof(FREE_SPACE_ITEM));
+ ERR("(%I64x,%x,%I64x) was %u bytes, expected %Iu\n", tp.item->key.obj_id, tp.item->key.obj_type, tp.item->key.offset, tp.item->size, sizeof(FREE_SPACE_ITEM));
Status = STATUS_INTERNAL_ERROR;
goto end;
}
Status = do_write_file(c->cache, 0, c->cache->inode_item.st_size, data, NULL, false, 0, rollback);
if (!NT_SUCCESS(Status)) {
- ERR("do_write_file returned %08x\n", Status);
+ ERR("do_write_file returned %08lx\n", Status);
// Writing the cache isn't critical, so we don't return an error if writing fails. This means
// we can still flush on a degraded mount if metadata is RAID1 but data is RAID0.
Status = insert_tree_item_batch(batchlist, Vcb, Vcb->space_root, s->address, TYPE_FREE_SPACE_EXTENT, s->size,
NULL, 0, Batch_Insert);
if (!NT_SUCCESS(Status)) {
- ERR("insert_tree_item_batch returned %08x\n", Status);
+ ERR("insert_tree_item_batch returned %08lx\n", Status);
ExFreePool(fsi);
return Status;
}
Status = insert_tree_item_batch(batchlist, Vcb, Vcb->space_root, c->offset, TYPE_FREE_SPACE_INFO, c->chunk_item->size,
NULL, 0, Batch_DeleteFreeSpace);
if (!NT_SUCCESS(Status)) {
- ERR("insert_tree_item_batch returned %08x\n", Status);
+ ERR("insert_tree_item_batch returned %08lx\n", Status);
ExFreePool(fsi);
return Status;
}
Status = insert_tree_item_batch(batchlist, Vcb, Vcb->space_root, c->offset, TYPE_FREE_SPACE_INFO, c->chunk_item->size,
fsi, sizeof(FREE_SPACE_INFO), Batch_Insert);
if (!NT_SUCCESS(Status)) {
- ERR("insert_tree_item_batch returned %08x\n", Status);
+ ERR("insert_tree_item_batch returned %08lx\n", Status);
ExFreePool(fsi);
return Status;
}
release_chunk_lock(c, Vcb);
if (!NT_SUCCESS(Status)) {
- ERR("update_chunk_cache(%I64x) returned %08x\n", c->offset, Status);
+ ERR("update_chunk_cache(%I64x) returned %08lx\n", c->offset, Status);
clear_batch_list(Vcb, &batchlist);
return Status;
}
Status = commit_batch_list(Vcb, &batchlist, Irp);
if (!NT_SUCCESS(Status)) {
- ERR("commit_batch_list returned %08x\n", Status);
+ ERR("commit_batch_list returned %08lx\n", Status);
return Status;
}
ExFreePool(ps);
if (!NT_SUCCESS(Status)) {
- ERR("flush_partial_stripe returned %08x\n", Status);
+ ERR("flush_partial_stripe returned %08lx\n", Status);
ExReleaseResourceLite(&c->partial_stripes_lock);
return Status;
}
release_chunk_lock(c, Vcb);
if (!NT_SUCCESS(Status)) {
- ERR("update_chunk_cache_tree(%I64x) returned %08x\n", c->offset, Status);
+ ERR("update_chunk_cache_tree(%I64x) returned %08lx\n", c->offset, Status);
ExReleaseResourceLite(&Vcb->chunk_lock);
clear_batch_list(Vcb, &batchlist);
return Status;
Status = commit_batch_list(Vcb, &batchlist, Irp);
if (!NT_SUCCESS(Status)) {
- ERR("commit_batch_list returned %08x\n", Status);
+ ERR("commit_batch_list returned %08lx\n", Status);
return Status;
}