27#ifndef FSCTL_CSV_CONTROL
28#define FSCTL_CSV_CONTROL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 181, METHOD_BUFFERED, FILE_ANY_ACCESS)
31#ifndef FSCTL_QUERY_VOLUME_CONTAINER_STATE
32#define FSCTL_QUERY_VOLUME_CONTAINER_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 228, METHOD_BUFFERED, FILE_ANY_ACCESS)
37#define SEF_AVOID_PRIVILEGE_CHECK 0x08
39#define SEF_SACL_AUTO_INHERIT 0x02
79 for (
i = 0;
i < 16;
i+=2) {
98 ERR(
"out of memory\n");
105 Status =
read_data(
Vcb,
addr,
Vcb->superblock.node_size,
NULL,
true,
buf,
NULL,
NULL,
Irp, 0,
false,
NormalPagePriority);
107 ERR(
"read_data returned %08lx\n",
Status);
115 t.header.level = th->
level;
116 t.header.tree_id =
t.root->id;
120 ERR(
"get_tree_new_address returned %08lx\n",
Status);
124 if (!
t.has_new_address) {
125 ERR(
"tree new address not set\n");
133 c->used +=
Vcb->superblock.node_size;
135 ERR(
"could not find chunk for address %I64x\n",
t.new_address);
145 if (th->
level == 0) {
160 ERR(
"increase_extent_refcount_data returned %08lx\n",
Status);
178 ERR(
"increase_extent_refcount returned %08lx\n",
Status);
192 ERR(
"write_data returned %08lx\n",
Status);
197 bool need_wait =
false;
233 *newaddr =
t.new_address;
249 while (le != &subvol->
fcbs) {
277 ERR(
"error - ccb was NULL\n");
282 WARN(
"insufficient privileges\n");
305 ERR(
"do_write returned %08lx\n",
Status);
317 ERR(
"create_root returned %08lx\n",
Status);
321 r->lastinode =
subvol->lastinode;
323 if (!
Vcb->uuid_root) {
326 TRACE(
"uuid root doesn't exist, creating it\n");
331 ERR(
"create_root returned %08lx\n",
Status);
335 Vcb->uuid_root = uuid_root;
340 ERR(
"out of memory\n");
361 ERR(
"insert_tree_item returned %08lx\n",
Status);
368 searchkey.
offset = 0xffffffffffffffff;
372 ERR(
"error - find_item returned %08lx\n",
Status);
378 ERR(
"snapshot_tree_copy returned %08lx\n",
Status);
385 r->root_item.inode.generation = 1;
386 r->root_item.inode.st_size = 3;
387 r->root_item.inode.st_blocks =
subvol->root_item.inode.st_blocks;
388 r->root_item.inode.st_nlink = 1;
390 r->root_item.inode.flags = 0x80000000;
391 r->root_item.inode.flags_ro = 0xffffffff;
392 r->root_item.generation =
Vcb->superblock.generation;
393 r->root_item.objid =
subvol->root_item.objid;
394 r->root_item.block_number =
address;
395 r->root_item.bytes_used =
subvol->root_item.bytes_used;
396 r->root_item.last_snapshot_generation =
Vcb->superblock.generation;
397 r->root_item.root_level =
subvol->root_item.root_level;
398 r->root_item.generation2 =
Vcb->superblock.generation;
399 r->root_item.parent_uuid =
subvol->root_item.uuid;
400 r->root_item.ctransid =
subvol->root_item.ctransid;
401 r->root_item.otransid =
Vcb->superblock.generation;
402 r->root_item.ctime =
subvol->root_item.ctime;
403 r->root_item.otime =
now;
413 ERR(
"error - could not find ROOT_ITEM for subvol %I64x\n",
r->id);
422 subvol->root_item.last_snapshot_generation =
Vcb->superblock.generation;
430 ERR(
"out of memory\n");
437 ERR(
"open_fcb returned %08lx\n",
Status);
446 WARN(
"add_dir_child returned %08lx\n",
Status);
483 fcb->
subvol->root_item.ctransid =
Vcb->superblock.generation;
489 while (le != &
subvol->fcbs) {
493 while (le2 != &fcb2->
extents) {
510 ERR(
"do_write returned %08lx\n",
Status);
527 bool readonly, posix;
536 if (IoIs32bitProcess(
Irp)) {
545 subvolh = Handle32ToHandle(bcs32->
subvol);
551 posix = bcs32->
posix;
586 ERR(
"fileref was NULL\n");
591 WARN(
"insufficient privileges\n");
609 ERR(
"utf16_to_utf8 failed with error %08lx\n",
Status);
614 ERR(
"utf16_to_utf8 returned a length of 0\n");
619 ERR(
"len was too long\n");
627 ERR(
"out of memory\n");
633 ERR(
"utf16_to_utf8 failed with error %08lx\n",
Status);
644 WARN(
"file already exists\n");
651 ERR(
"open_fileref returned %08lx\n",
Status);
657 ERR(
"ObReferenceObjectByHandle returned %08lx\n",
Status);
661 if (subvol_obj->DeviceObject !=
FileObject->DeviceObject) {
666 subvol_fcb = subvol_obj->FsContext;
672 if (subvol_fcb->
inode != subvol_fcb->
subvol->root_item.objid) {
673 WARN(
"handle inode was %I64x, expected %I64x\n", subvol_fcb->
inode, subvol_fcb->
subvol->root_item.objid);
678 ccb = subvol_obj->FsContext2;
686 WARN(
"insufficient privileges\n");
691 if (
fcb ==
Vcb->dummy_fcb) {
700 while (le != &subvol_fcb->
subvol->fcbs) {
706 while (le2 != &openfcb->
extents) {
726 ERR(
"open_fileref returned %08lx\n",
Status);
772 ERR(
"error - fcb was NULL\n");
778 ERR(
"error - ccb was NULL\n");
785 ERR(
"parent FCB was not a directory\n");
790 ERR(
"fileref was NULL\n");
795 ERR(
"parent has been deleted\n");
800 WARN(
"insufficient privileges\n");
810 if (
fcb ==
Vcb->dummy_fcb)
832 ERR(
"utf16_to_utf8 failed with error %08lx\n",
Status);
837 ERR(
"utf16_to_utf8 returned a length of 0\n");
842 ERR(
"len was too long\n");
850 ERR(
"out of memory\n");
856 ERR(
"utf16_to_utf8 failed with error %08lx\n",
Status);
870 WARN(
"file already exists\n");
877 ERR(
"open_fileref returned %08lx\n",
Status);
885 ERR(
"create_root returned %08lx\n",
Status);
889 TRACE(
"created root %I64x\n",
id);
891 if (!
Vcb->uuid_root) {
894 TRACE(
"uuid root doesn't exist, creating it\n");
899 ERR(
"create_root returned %08lx\n",
Status);
903 Vcb->uuid_root = uuid_root;
908 ERR(
"out of memory\n");
929 ERR(
"insert_tree_item returned %08lx\n",
Status);
934 r->root_item.inode.generation = 1;
935 r->root_item.inode.st_size = 3;
936 r->root_item.inode.st_blocks =
Vcb->superblock.node_size;
937 r->root_item.inode.st_nlink = 1;
939 r->root_item.inode.flags = 0x80000000;
940 r->root_item.inode.flags_ro = 0xffffffff;
946 r->root_item.bytes_used =
Vcb->superblock.node_size;
947 r->root_item.ctransid =
Vcb->superblock.generation;
948 r->root_item.otransid =
Vcb->superblock.generation;
949 r->root_item.ctime =
now;
950 r->root_item.otime =
now;
956 ERR(
"out of memory\n");
985 ERR(
"SeAssignSecurity returned %08lx\n",
Status);
990 ERR(
"SeAssignSecurity returned NULL security descriptor\n");
997 ERR(
"RtlGetOwnerSecurityDescriptor returned %08lx\n",
Status);
1009 acquire_fcb_lock_exclusive(
Vcb);
1013 release_fcb_lock(
Vcb);
1016 rootfcb->
Header.AllocationSize.QuadPart = 0;
1017 rootfcb->
Header.FileSize.QuadPart = 0;
1018 rootfcb->
Header.ValidDataLength.QuadPart = 0;
1028 r->lastinode = rootfcb->
inode;
1035 ERR(
"out of memory\n");
1046 ERR(
"insert_tree_item returned %08lx\n",
Status);
1055 ERR(
"out of memory\n");
1071 WARN(
"add_dir_child returned %08lx\n",
Status);
1078 ERR(
"out of memory\n");
1088 ERR(
"out of memory\n");
1110 fcb->
subvol->root_item.ctransid =
Vcb->superblock.generation;
1137 }
else if (rootfcb) {
1185 WARN(
"insufficient privileges\n");
1224 bool extents_inline =
false;
1231 if (!old_style &&
ext->offset > last_end)
1236 last_end =
ext->offset +
ext->extent_data.decoded_size;
1237 extents_inline =
true;
1243 switch (
ext->extent_data.compression) {
1346 WARN(
"insufficient privileges\n");
1351 WARN(
"insufficient privileges\n");
1362 WARN(
"trying to change inode on readonly subvolume\n");
1375 WARN(
"trying to change nocow flag on non-empty file\n");
1451 le =
Vcb->devices.Flink;
1452 while (le != &
Vcb->devices) {
1475 dev->missing =
false;
1478 dev->missing =
true;
1481 dev->next_entry = 0;
1483 dev->readonly = (
Vcb->readonly || dev2->
readonly) ?
true :
false;
1521 if (!
Vcb->chunk_usage_found) {
1524 if (!
Vcb->chunk_usage_found)
1532 ERR(
"find_chunk_usage returned %08lx\n",
Status);
1541 le =
Vcb->chunks.Flink;
1542 while (le != &
Vcb->chunks) {
1543 bool addnew =
false;
1555 if (bue->
type ==
c->chunk_item->type) {
1588 bue->
type =
c->chunk_item->type;
1594 factor =
c->chunk_item->num_stripes;
1596 factor =
c->chunk_item->num_stripes /
c->chunk_item->sub_stripes;
1598 factor =
c->chunk_item->num_stripes - 1;
1600 factor =
c->chunk_item->num_stripes - 2;
1605 while (le2 != &
Vcb->chunks) {
1666 bool verify =
false;
1671 le =
Vcb->devices.Flink;
1672 while (le != &
Vcb->devices) {
1675 if (
dev->devobj &&
dev->removable) {
1687 dev->change_count =
cc;
1708 WARN(
"STUB: FSCTL_FILESYSTEM_GET_STATISTICS\n");
1728 FILE_SET_SPARSE_BUFFER* fssb =
data;
1735 if (
data &&
length <
sizeof(FILE_SET_SPARSE_BUFFER))
1739 ERR(
"FileObject was NULL\n");
1746 ERR(
"FCB was NULL\n");
1751 ERR(
"CCB was NULL\n");
1756 WARN(
"insufficient privileges\n");
1761 ERR(
"no fileref\n");
1774 WARN(
"FileObject did not point to a file\n");
1780 set = fssb->SetSparse;
1790 fcb->
atts &= ~FILE_ATTRIBUTE_SPARSE_FILE;
1840 ERR(
"out of memory\n");
1850 ERR(
"read_file returned %08lx\n",
Status);
1864 ERR(
"excise_extents returned %08lx\n",
Status);
1880 ERR(
"add_extent_to_fcb returned %08lx\n",
Status);
1894 ERR(
"write_compressed returned %08lx\n",
Status);
1903 ERR(
"do_write_file returned %08lx\n",
Status);
1912 FILE_ZERO_DATA_INFORMATION* fzdi =
data;
1924 if (!
data ||
length <
sizeof(FILE_ZERO_DATA_INFORMATION))
1928 ERR(
"FileObject was NULL\n");
1932 if (fzdi->BeyondFinalZero.QuadPart <= fzdi->FileOffset.QuadPart) {
1933 WARN(
"BeyondFinalZero was less than or equal to FileOffset (%I64x <= %I64x)\n", fzdi->BeyondFinalZero.QuadPart, fzdi->FileOffset.QuadPart);
1940 ERR(
"FCB was NULL\n");
1947 ERR(
"ccb was NULL\n");
1952 WARN(
"insufficient privileges\n");
1959 ERR(
"fileref was NULL\n");
1971 WARN(
"FileObject did not point to a file\n");
1977 ERR(
"FileObject is stream\n");
1992 if (!
ext2->ignore) {
2008 ERR(
"zero_data returned %08lx\n",
Status);
2017 end = (fzdi->BeyondFinalZero.QuadPart >>
Vcb->sector_shift) <<
Vcb->sector_shift;
2022 ERR(
"zero_data returned %08lx\n",
Status);
2029 ERR(
"zero_data returned %08lx\n",
Status);
2034 if (
end < (
uint64_t)fzdi->BeyondFinalZero.QuadPart) {
2037 ERR(
"zero_data returned %08lx\n",
Status);
2045 ERR(
"excise_extents returned %08lx\n",
Status);
2072 fcb->
subvol->root_item.ctransid =
Vcb->superblock.generation;
2093 FILE_ALLOCATED_RANGE_BUFFER* ranges = outbuf;
2097 TRACE(
"FSCTL_QUERY_ALLOCATED_RANGES\n");
2100 ERR(
"FileObject was NULL\n");
2104 if (!
inbuf || inbuflen <
sizeof(FILE_ALLOCATED_RANGE_BUFFER) || !outbuf)
2110 ERR(
"FCB was NULL\n");
2121 else if (outbuflen <
sizeof(FILE_ALLOCATED_RANGE_BUFFER))
2124 ranges[
i].FileOffset.QuadPart = 0;
2146 if (
ext->offset > last_end) {
2147 if (last_end > last_start) {
2148 if ((
i + 1) *
sizeof(FILE_ALLOCATED_RANGE_BUFFER) <= outbuflen) {
2149 ranges[
i].FileOffset.QuadPart = last_start;
2158 last_start =
ext->offset;
2161 last_end =
ext->offset +
len;
2167 if (last_end > last_start) {
2168 if ((
i + 1) *
sizeof(FILE_ALLOCATED_RANGE_BUFFER) <= outbuflen) {
2169 ranges[
i].FileOffset.QuadPart = last_start;
2181 *retlen =
i *
sizeof(FILE_ALLOCATED_RANGE_BUFFER);
2194 ERR(
"FileObject was NULL\n");
2198 if (!
buf || buflen <
sizeof(FILE_OBJECTID_BUFFER))
2204 ERR(
"FCB was NULL\n");
2217 *retlen =
sizeof(FILE_OBJECTID_BUFFER);
2225 le =
Vcb->all_fcbs.Flink;
2226 while (le != &
Vcb->all_fcbs) {
2241 bool lock_paused_balance =
false;
2243 TRACE(
"FSCTL_LOCK_VOLUME\n");
2245 if (
Vcb->scrub.thread) {
2246 WARN(
"cannot lock while scrub running\n");
2250 if (
Vcb->balance.thread) {
2251 WARN(
"cannot lock while balance running\n");
2255 TRACE(
"locking volume\n");
2277 lock_paused_balance =
true;
2284 if (
Vcb->need_write && !
Vcb->readonly)
2294 ERR(
"do_write returned %08lx\n",
Status);
2304 Vcb->lock_paused_balance = lock_paused_balance;
2309 if (lock_paused_balance)
2331 Vcb->locked =
false;
2332 Vcb->Vpb->Flags &= ~VPB_LOCKED;
2337 if (
Vcb->lock_paused_balance)
2344 TRACE(
"FSCTL_UNLOCK_VOLUME\n");
2349 TRACE(
"unlocking volume\n");
2367 TRACE(
"FSCTL_INVALIDATE_VOLUMES\n");
2373 if (IoIs32bitProcess(
Irp)) {
2391 ERR(
"ObReferenceObjectByHandle returned %08lx\n",
Status);
2395 devobj = fileobj->DeviceObject;
2404 if (
Vcb->Vpb &&
Vcb->Vpb->RealDevice == devobj) {
2405 if (
Vcb->Vpb == devobj->Vpb) {
2408 bool free_newvpb =
false;
2412 ERR(
"out of memory\n");
2423 Vcb->removing =
true;
2433 if (
Vcb->need_write && !
Vcb->readonly)
2441 ERR(
"do_write returned %08lx\n",
Status);
2460 devobj->Vpb = newvpb;
2469 if (
Vcb->open_files == 0)
2495 if (
Irp->AssociatedIrp.SystemBuffer) {
2496 volstate =
Irp->AssociatedIrp.SystemBuffer;
2497 }
else if (
Irp->MdlAddress !=
NULL) {
2513 Irp->IoStatus.Information =
sizeof(
ULONG);
2522 TRACE(
"FSCTL_GET_COMPRESSION\n");
2524 if (
Irp->AssociatedIrp.SystemBuffer) {
2526 }
else if (
Irp->MdlAddress !=
NULL) {
2539 Irp->IoStatus.Information =
sizeof(
USHORT);
2548 TRACE(
"FSCTL_SET_COMPRESSION\n");
2588 TRACE(
"FSCTL_DISMOUNT_VOLUME\n");
2594 if (
Vcb->disallow_dismount ||
Vcb->page_file_count != 0) {
2595 WARN(
"attempting to dismount boot volume or one containing a pagefile\n");
2601 WARN(
"FsRtlNotifyVolumeEvent returned %08lx\n",
Status);
2610 if (
Vcb->need_write && !
Vcb->readonly) {
2614 ERR(
"do_write returned %08lx\n",
Status);
2620 Vcb->removing =
true;
2622 open_files =
Vcb->open_files > 0;
2626 Vcb->vde->mounted_device =
NULL;
2648 ERR(
"out of memory\n");
2654 ERR(
"sync_read_phys returned %08lx\n",
Status);
2660 TRACE(
"device is not Btrfs\n");
2666 TRACE(
"device has Btrfs magic, but invalid superblock checksum\n");
2688 if (
Vcb->superblock.num_devices > 1) {
2689 le2 =
Vcb->devices.Flink;
2690 while (le2 != &
Vcb->devices) {
2732 WARN(
"IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES returned %08lx\n",
Status);
2755 const GUID* pnp_guid;
2764 WARN(
"not allowing second device to be added to non-PNP device\n");
2772 if (IoIs32bitProcess(
Irp)) {
2790 ERR(
"ObReferenceObjectByHandle returned %08lx\n",
Status);
2798 ERR(
"get_device_pnp_name returned %08lx\n",
Status);
2809 ERR(
"IOCTL_DISK_IS_WRITABLE returned %08lx\n",
Status);
2816 ERR(
"is_device_part_of_mounted_btrfs_raid returned %08lx\n",
Status);
2824 DRIVE_LAYOUT_INFORMATION_EX* dli =
NULL;
2836 ERR(
"out of memory\n");
2846 ERR(
"not adding disk which has partitions\n");
2858 WARN(
"device was not disk\n");
2868 &gli,
sizeof(gli),
true,
NULL);
2870 ERR(
"error reading length information: %08lx\n",
Status);
2877 if (
size < 0x100000) {
2878 ERR(
"device was not large enough to hold FS (%I64x bytes, need at least 1 MB)\n",
size);
2887 if (
Vcb->need_write)
2895 ERR(
"do_write returned %08lx\n",
Status);
2901 ERR(
"out of memory\n");
2909 dev->fileobj = fileobj;
2910 dev->seeding =
false;
2915 if (
size > 0x100000) {
2918 ERR(
"add_space_entry returned %08lx\n",
Status);
2925 le =
Vcb->devices.Flink;
2926 while (le != &
Vcb->devices) {
2938 dev->devitem.num_bytes =
size;
2939 dev->devitem.bytes_used = 0;
2940 dev->devitem.optimal_io_align =
Vcb->superblock.sector_size;
2941 dev->devitem.optimal_io_width =
Vcb->superblock.sector_size;
2942 dev->devitem.minimal_io_size =
Vcb->superblock.sector_size;
2943 dev->devitem.type = 0;
2944 dev->devitem.generation = 0;
2945 dev->devitem.start_offset = 0;
2946 dev->devitem.dev_group = 0;
2947 dev->devitem.seek_speed = 0;
2948 dev->devitem.bandwidth = 0;
2950 dev->devitem.fs_uuid =
Vcb->superblock.uuid;
2954 ERR(
"out of memory\n");
2962 ERR(
"insert_tree_item returned %08lx\n",
Status);
2970 ERR(
"out of memory\n");
2983 ERR(
"error - find_item returned %08lx\n",
Status);
2991 ERR(
"delete_tree_item returned %08lx\n",
Status);
2999 ERR(
"insert_tree_item returned %08lx\n",
Status);
3004 if (
dev->trim && !
dev->readonly && !
Vcb->options.no_trim)
3010 ERR(
"out of memory\n");
3019 ERR(
"write_data_phys returned %08lx\n",
Status);
3031 ERR(
"out of memory\n");
3036 vc->
uuid =
dev->devitem.device_uuid;
3047 WARN(
"IoRegisterPlugPlayNotification returned %08lx\n",
Status);
3049 pnp_name2 = pnp_name;
3052 pnp_name.
Buffer[2] ==
'?' && pnp_name.
Buffer[3] ==
'\\') {
3060 if (pnp_name2.
Length == 0)
3065 ERR(
"out of memory\n");
3088 ERR(
"IoGetDeviceObjectPointer returned %08lx\n",
Status);
3092 WARN(
"remove_drive_letter returned %08lx\n",
Status);
3099 Vcb->superblock.num_devices++;
3100 Vcb->superblock.total_bytes +=
size;
3101 Vcb->devices_loaded++;
3110 ERR(
"do_write returned %08lx\n",
Status);
3135 TRACE(
"FSCTL_ALLOW_EXTENDED_DASD_IO\n");
3146 if (
fcb !=
Vcb->volume_fcb)
3184 le =
Vcb->devices.Flink;
3186 while (le != &
Vcb->devices) {
3191 dev->stats_changed =
true;
3192 Vcb->stats_changed =
true;
3193 Vcb->need_write =
true;
3201 WARN(
"device %I64x not found\n", devid);
3213 TRACE(
"FSCTL_GET_INTEGRITY_INFORMATION\n");
3233 TRACE(
"FSCTL_SET_INTEGRITY_INFORMATION\n");
3290 WARN(
"insufficient privileges\n");
3299 ERR(
"ObReferenceObjectByHandle returned %08lx\n",
Status);
3303 if (sourcefo->DeviceObject !=
FileObject->DeviceObject) {
3304 WARN(
"source and destination are on different volumes\n");
3309 sourcefcb = sourcefo->FsContext;
3310 sourceccb = sourcefo->FsContext2;
3312 if (!sourcefcb || !sourceccb || sourcefcb ==
Vcb->volume_fcb) {
3317 if (!sourcefcb->ads && !
fcb->
ads) {
3330 WARN(
"insufficient privileges\n");
3340 sourcelen = sourcefcb->ads ? sourcefcb->adsdata.Length : sourcefcb->inode_item.st_size;
3347 if (
fcb == sourcefcb &&
3350 WARN(
"source and destination are the same, and the ranges overlap\n");
3368 if (
fcb != sourcefcb)
3385 ULONG bytes_read, dataoff, datalen2;
3400 ERR(
"out of memory\n");
3412 ERR(
"read_file returned %08lx\n",
Status);
3418 if (sourcefcb->ads) {
3421 ERR(
"read_stream returned %08lx\n",
Status);
3428 ERR(
"read_file returned %08lx\n",
Status);
3434 if (dataoff + bytes_read < datalen2)
3439 else if (make_inline) {
3445 ERR(
"excise_extents returned %08lx\n",
Status);
3454 ERR(
"out of memory\n");
3471 ERR(
"add_extent_to_fcb returned %08lx\n",
Status);
3482 ERR(
"do_write_file returned %08lx\n",
Status);
3492 le = sourcefcb->extents.
Flink;
3493 while (le != &sourcefcb->extents) {
3515 ERR(
"out of memory\n");
3526 ext2->unique =
false;
3527 ext2->ignore =
false;
3528 ext2->inserted =
true;
3530 ext2->extent_data.generation =
Vcb->superblock.generation;
3531 ext2->extent_data.decoded_size =
ext->extent_data.decoded_size;
3532 ext2->extent_data.compression =
ext->extent_data.compression;
3533 ext2->extent_data.encryption =
ext->extent_data.encryption;
3534 ext2->extent_data.encoding =
ext->extent_data.encoding;
3535 ext2->extent_data.type =
ext->extent_data.type;
3554 ERR(
"out of memory\n");
3565 ERR(
"out of memory\n");
3580 ERR(
"get_chunk_from_address(%I64x) failed\n", ed2s->
address);
3588 ERR(
"update_changed_extent_ref returned %08lx\n",
Status);
3601 ERR(
"excise_extents returned %08lx\n",
Status);
3612 le = sourcefcb->extents.
Flink;
3613 while (le != &sourcefcb->extents) {
3620 le2 = newexts.
Flink;
3621 while (le2 != &newexts) {
3628 ext->unique =
false;
3645 lastextle = &
ext->list_entry;
3678 if (
FileObject->SectionObjectPointer->DataSectionObject)
3691 if (
fcb != sourcefcb)
3711 while (le != &
subvol->fcbs) {
3725 searchkey.
offset = 0xffffffffffffffff;
3729 ERR(
"find_item returned %08lx\n",
Status);