mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 13:35:47 +00:00
[BTRFS][UBTRFS][SHELLBTRFS] Upgrade to 1.7.8 (#4417)
v1.7.8.1 (2021-06-13): - Fixed bug preventing new directories from appearing in listings - Fixed Release version of driver still not working on XP v1.7.8 (2021-06-09): - ~~Upgraded zstd to version 1.5.0~~ Not in ReactOS as it introduces deprecated code - Fixed regression stopping driver from working under XP - Fixed compilation on clang - Fixed corruption issue when Linux mount option inode_cache had been used - Fixed recursion issue involving virtual directory \$Root
This commit is contained in:
parent
98654b54b4
commit
3cfd8ab775
19 changed files with 79 additions and 67 deletions
|
@ -68,10 +68,6 @@ typedef struct {
|
|||
LIST_ENTRY list_entry;
|
||||
} data_reloc_ref;
|
||||
|
||||
#ifndef _MSC_VER // not in mingw yet
|
||||
#define DEVICE_DSM_FLAG_TRIM_NOT_FS_ALLOCATED 0x80000000
|
||||
#endif
|
||||
|
||||
#define BALANCE_UNIT 0x100000 // only read 1 MB at a time
|
||||
|
||||
static NTSTATUS add_metadata_reloc(_Requires_exclusive_lock_held_(_Curr_->tree_lock) device_extension* Vcb, LIST_ENTRY* items, traverse_ptr* tp,
|
||||
|
|
|
@ -397,7 +397,7 @@ static bool get_last_inode(_In_ _Requires_exclusive_lock_held_(_Curr_->tree_lock
|
|||
return false;
|
||||
}
|
||||
|
||||
if (tp.item->key.obj_type == TYPE_INODE_ITEM || (tp.item->key.obj_type == TYPE_ROOT_ITEM && !(tp.item->key.obj_id & 0x8000000000000000))) {
|
||||
if ((tp.item->key.obj_type == TYPE_INODE_ITEM || tp.item->key.obj_type == TYPE_ROOT_ITEM) && tp.item->key.obj_id <= BTRFS_LAST_FREE_OBJECTID) {
|
||||
r->lastinode = tp.item->key.obj_id;
|
||||
TRACE("last inode for tree %I64x is %I64x\n", r->id, r->lastinode);
|
||||
return true;
|
||||
|
@ -408,7 +408,7 @@ static bool get_last_inode(_In_ _Requires_exclusive_lock_held_(_Curr_->tree_lock
|
|||
|
||||
TRACE("moving on to %I64x,%x,%I64x\n", tp.item->key.obj_id, tp.item->key.obj_type, tp.item->key.offset);
|
||||
|
||||
if (tp.item->key.obj_type == TYPE_INODE_ITEM || (tp.item->key.obj_type == TYPE_ROOT_ITEM && !(tp.item->key.obj_id & 0x8000000000000000))) {
|
||||
if ((tp.item->key.obj_type == TYPE_INODE_ITEM || tp.item->key.obj_type == TYPE_ROOT_ITEM) && tp.item->key.obj_id <= BTRFS_LAST_FREE_OBJECTID) {
|
||||
r->lastinode = tp.item->key.obj_id;
|
||||
TRACE("last inode for tree %I64x is %I64x\n", r->id, r->lastinode);
|
||||
return true;
|
||||
|
|
|
@ -15,6 +15,7 @@ static const uint64_t superblock_addrs[] = { 0x10000, 0x4000000, 0x4000000000, 0
|
|||
#define BTRFS_MAGIC 0x4d5f53665248425f
|
||||
#define MAX_LABEL_SIZE 0x100
|
||||
#define SUBVOL_ROOT_INODE 0x100
|
||||
#define BTRFS_LAST_FREE_OBJECTID 0xffffffffffffff00
|
||||
|
||||
#define TYPE_INODE_ITEM 0x01
|
||||
#define TYPE_INODE_REF 0x0C
|
||||
|
|
|
@ -10,7 +10,7 @@ Signature = "$Windows NT$"
|
|||
Class = Volume
|
||||
ClassGuid = {71a27cdd-812a-11d0-bec7-08002be2092f}
|
||||
Provider = %Me%
|
||||
DriverVer = 04/12/2021,1.7.7.0
|
||||
DriverVer = 06/07/2021,1.7.8.0
|
||||
CatalogFile = btrfs.cat
|
||||
|
||||
[DestinationDirs]
|
||||
|
|
|
@ -51,8 +51,8 @@ END
|
|||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 1,7,7,0
|
||||
PRODUCTVERSION 1,7,7,0
|
||||
FILEVERSION 1,7,8,0
|
||||
PRODUCTVERSION 1,7,8,0
|
||||
FILEFLAGSMASK 0x17L
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
|
@ -68,12 +68,12 @@ BEGIN
|
|||
BLOCK "080904b0"
|
||||
BEGIN
|
||||
VALUE "FileDescription", "WinBtrfs"
|
||||
VALUE "FileVersion", "1.7.7"
|
||||
VALUE "FileVersion", "1.7.8"
|
||||
VALUE "InternalName", "btrfs"
|
||||
VALUE "LegalCopyright", "Copyright (c) Mark Harmstone 2016-21"
|
||||
VALUE "OriginalFilename", "btrfs.sys"
|
||||
VALUE "ProductName", "WinBtrfs"
|
||||
VALUE "ProductVersion", "1.7.7"
|
||||
VALUE "ProductVersion", "1.7.8"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
|
|
|
@ -126,7 +126,7 @@ C_ASSERT(sizeof(bool) == 1);
|
|||
|
||||
#define BTRFS_VOLUME_PREFIX L"\\Device\\Btrfs{"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#if defined(_MSC_VER) || defined(__clang__)
|
||||
#define try __try
|
||||
#define except __except
|
||||
#define finally __finally
|
||||
|
@ -1633,7 +1633,7 @@ extern BTRFS_UUID boot_uuid;
|
|||
// not in mingw yet
|
||||
#ifndef _MSC_VER
|
||||
typedef struct {
|
||||
FSRTL_COMMON_FCB_HEADER DUMMYSTRUCTNAME;
|
||||
FSRTL_COMMON_FCB_HEADER Header;
|
||||
PFAST_MUTEX FastMutex;
|
||||
LIST_ENTRY FilterContexts;
|
||||
EX_PUSH_LOCK PushLock;
|
||||
|
@ -1652,7 +1652,7 @@ typedef struct {
|
|||
#endif
|
||||
#else
|
||||
typedef struct {
|
||||
FSRTL_COMMON_FCB_HEADER DUMMYSTRUCTNAME;
|
||||
FSRTL_COMMON_FCB_HEADER Header;
|
||||
PFAST_MUTEX FastMutex;
|
||||
LIST_ENTRY FilterContexts;
|
||||
EX_PUSH_LOCK PushLock;
|
||||
|
|
|
@ -727,6 +727,13 @@ next:
|
|||
if (!dc)
|
||||
return STATUS_NO_MORE_FILES;
|
||||
|
||||
if (dc->root_dir && fileref->parent) { // hide $Root dir unless in apparent root, to avoid recursion
|
||||
if (dc->list_entry_index.Flink == &fileref->fcb->dir_children_index)
|
||||
return STATUS_NO_MORE_FILES;
|
||||
|
||||
dc = CONTAINING_RECORD(dc->list_entry_index.Flink, dir_child, list_entry_index);
|
||||
}
|
||||
|
||||
de->key = dc->key;
|
||||
de->name = dc->name;
|
||||
de->type = dc->type;
|
||||
|
|
|
@ -46,10 +46,6 @@ typedef struct {
|
|||
static NTSTATUS create_chunk(device_extension* Vcb, chunk* c, PIRP Irp);
|
||||
static NTSTATUS update_tree_extents(device_extension* Vcb, tree* t, PIRP Irp, LIST_ENTRY* rollback);
|
||||
|
||||
#ifndef _MSC_VER // not in mingw yet
|
||||
#define DEVICE_DSM_FLAG_TRIM_NOT_FS_ALLOCATED 0x80000000
|
||||
#endif
|
||||
|
||||
_Function_class_(IO_COMPLETION_ROUTINE)
|
||||
static NTSTATUS __stdcall write_completion(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID conptr) {
|
||||
write_context* context = conptr;
|
||||
|
|
|
@ -36,10 +36,6 @@
|
|||
|
||||
#define SEF_AVOID_PRIVILEGE_CHECK 0x08 // on MSDN but not in any header files(?)
|
||||
|
||||
#ifndef _MSC_VER // not in mingw yet
|
||||
#define DEVICE_DSM_FLAG_TRIM_NOT_FS_ALLOCATED 0x80000000
|
||||
#endif
|
||||
|
||||
#define SEF_SACL_AUTO_INHERIT 0x02
|
||||
|
||||
extern LIST_ENTRY VcbList;
|
||||
|
@ -5030,7 +5026,7 @@ static NTSTATUS get_retrieval_pointers(device_extension* Vcb, PFILE_OBJECT FileO
|
|||
|
||||
ExAcquireResourceSharedLite(fcb->Header.Resource, true);
|
||||
|
||||
try {
|
||||
_SEH2_TRY {
|
||||
LIST_ENTRY* le = fcb->extents.Flink;
|
||||
extent* first_ext = NULL;
|
||||
unsigned int num_extents = 0, first_extent_num = 0, i;
|
||||
|
@ -5067,7 +5063,7 @@ static NTSTATUS get_retrieval_pointers(device_extension* Vcb, PFILE_OBJECT FileO
|
|||
|
||||
if (!first_ext) {
|
||||
Status = STATUS_END_OF_FILE;
|
||||
leave;
|
||||
_SEH2_LEAVE;
|
||||
}
|
||||
|
||||
out->ExtentCount = num_extents - first_extent_num;
|
||||
|
@ -5090,7 +5086,7 @@ static NTSTATUS get_retrieval_pointers(device_extension* Vcb, PFILE_OBJECT FileO
|
|||
if (ext->offset > last_off) {
|
||||
if (outlen < sizeof(LARGE_INTEGER) + sizeof(LARGE_INTEGER)) {
|
||||
Status = STATUS_BUFFER_OVERFLOW;
|
||||
leave;
|
||||
_SEH2_LEAVE;
|
||||
}
|
||||
|
||||
out->Extents[i].NextVcn.QuadPart = ext->offset >> Vcb->sector_shift;
|
||||
|
@ -5103,7 +5099,7 @@ static NTSTATUS get_retrieval_pointers(device_extension* Vcb, PFILE_OBJECT FileO
|
|||
|
||||
if (outlen < sizeof(LARGE_INTEGER) + sizeof(LARGE_INTEGER)) {
|
||||
Status = STATUS_BUFFER_OVERFLOW;
|
||||
leave;
|
||||
_SEH2_LEAVE;
|
||||
}
|
||||
|
||||
out->Extents[i].NextVcn.QuadPart = (ext->offset + ext->extent_data.decoded_size) >> Vcb->sector_shift;
|
||||
|
@ -5125,7 +5121,7 @@ static NTSTATUS get_retrieval_pointers(device_extension* Vcb, PFILE_OBJECT FileO
|
|||
if (num_sectors << Vcb->sector_shift > last_off) {
|
||||
if (outlen < sizeof(LARGE_INTEGER) + sizeof(LARGE_INTEGER)) {
|
||||
Status = STATUS_BUFFER_OVERFLOW;
|
||||
leave;
|
||||
_SEH2_LEAVE;
|
||||
}
|
||||
|
||||
out->Extents[i].NextVcn.QuadPart = num_sectors;
|
||||
|
@ -5136,9 +5132,9 @@ static NTSTATUS get_retrieval_pointers(device_extension* Vcb, PFILE_OBJECT FileO
|
|||
}
|
||||
|
||||
Status = STATUS_SUCCESS;
|
||||
} finally {
|
||||
} _SEH2_FINALLY {
|
||||
ExReleaseResourceLite(fcb->Header.Resource);
|
||||
}
|
||||
} _SEH2_END;
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
@ -5235,7 +5231,7 @@ static NTSTATUS get_csum_info(device_extension* Vcb, PFILE_OBJECT FileObject, bt
|
|||
|
||||
ExAcquireResourceSharedLite(fcb->Header.Resource, true);
|
||||
|
||||
try {
|
||||
_SEH2_TRY {
|
||||
LIST_ENTRY* le;
|
||||
uint8_t* ptr;
|
||||
uint64_t last_off;
|
||||
|
@ -5244,17 +5240,17 @@ static NTSTATUS get_csum_info(device_extension* Vcb, PFILE_OBJECT FileObject, bt
|
|||
|
||||
if (fcb->ads) {
|
||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
leave;
|
||||
_SEH2_LEAVE;
|
||||
}
|
||||
|
||||
if (fcb->type == BTRFS_TYPE_DIRECTORY) {
|
||||
Status = STATUS_FILE_IS_A_DIRECTORY;
|
||||
leave;
|
||||
_SEH2_LEAVE;
|
||||
}
|
||||
|
||||
if (fcb->inode_item.flags & BTRFS_INODE_NODATASUM) {
|
||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
leave;
|
||||
_SEH2_LEAVE;
|
||||
}
|
||||
|
||||
buf->csum_type = Vcb->superblock.csum_type;
|
||||
|
@ -5273,7 +5269,7 @@ static NTSTATUS get_csum_info(device_extension* Vcb, PFILE_OBJECT FileObject, bt
|
|||
buf->num_sectors = 0;
|
||||
*retlen = offsetof(btrfs_csum_info, data[0]);
|
||||
Status = STATUS_SUCCESS;
|
||||
leave;
|
||||
_SEH2_LEAVE;
|
||||
}
|
||||
|
||||
le = le->Flink;
|
||||
|
@ -5284,7 +5280,7 @@ static NTSTATUS get_csum_info(device_extension* Vcb, PFILE_OBJECT FileObject, bt
|
|||
if (buflen < offsetof(btrfs_csum_info, data[0]) + (buf->csum_length * buf->num_sectors)) {
|
||||
Status = STATUS_BUFFER_OVERFLOW;
|
||||
*retlen = offsetof(btrfs_csum_info, data[0]);
|
||||
leave;
|
||||
_SEH2_LEAVE;
|
||||
}
|
||||
|
||||
ptr = buf->data;
|
||||
|
@ -5333,9 +5329,9 @@ static NTSTATUS get_csum_info(device_extension* Vcb, PFILE_OBJECT FileObject, bt
|
|||
|
||||
*retlen = offsetof(btrfs_csum_info, data[0]) + (buf->csum_length * buf->num_sectors);
|
||||
Status = STATUS_SUCCESS;
|
||||
} finally {
|
||||
} _SEH2_FINALLY {
|
||||
ExReleaseResourceLite(fcb->Header.Resource);
|
||||
}
|
||||
} _SEH2_END;
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue