[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:
Vincent Franchomme 2022-04-28 21:35:40 +02:00 committed by Hermès BÉLUSCA - MAÏTO
parent 98654b54b4
commit 3cfd8ab775
19 changed files with 79 additions and 67 deletions

View file

@ -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,

View file

@ -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;

View file

@ -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

View file

@ -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]

View file

@ -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"

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;
}