From 7babd0d5ea84ca13c0101f6a1b1e1c4d3c82efee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sun, 24 Oct 2010 09:13:47 +0000 Subject: [PATCH] added large files feature support git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39120 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/file_systems/ext2/Inode.cpp | 6 ++++++ src/add-ons/kernel/file_systems/ext2/Volume.cpp | 15 +++++++++++++++ src/add-ons/kernel/file_systems/ext2/Volume.h | 1 + src/add-ons/kernel/file_systems/ext2/ext2.h | 6 ++++-- 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/add-ons/kernel/file_systems/ext2/Inode.cpp b/src/add-ons/kernel/file_systems/ext2/Inode.cpp index 96337ad140..a9e05b9ece 100644 --- a/src/add-ons/kernel/file_systems/ext2/Inode.cpp +++ b/src/add-ons/kernel/file_systems/ext2/Inode.cpp @@ -129,6 +129,12 @@ Inode::WriteBack(Transaction& transaction) if (status != B_OK) return status; + if (Node().Size() > 0x7fffffffLL) { + status = fVolume->ActivateLargeFiles(transaction); + if (status != B_OK) + return status; + } + CachedBlock cached(fVolume); uint8* inodeBlockData = cached.SetToWritable(transaction, inodeBlock); if (inodeBlockData == NULL) diff --git a/src/add-ons/kernel/file_systems/ext2/Volume.cpp b/src/add-ons/kernel/file_systems/ext2/Volume.cpp index d3cf95bf82..3fd4ed28c9 100644 --- a/src/add-ons/kernel/file_systems/ext2/Volume.cpp +++ b/src/add-ons/kernel/file_systems/ext2/Volume.cpp @@ -496,6 +496,7 @@ Volume::_UnsupportedIncompatibleFeatures(ext2_super_block& superBlock) Volume::_UnsupportedReadOnlyFeatures(ext2_super_block& superBlock) { uint32 supportedReadOnly = EXT2_READ_ONLY_FEATURE_SPARSE_SUPER + | EXT2_READ_ONLY_FEATURE_LARGE_FILE | EXT2_READ_ONLY_FEATURE_HUGE_FILE; // TODO actually implement EXT2_READ_ONLY_FEATURE_SPARSE_SUPER when // implementing superblock backup copies @@ -588,6 +589,20 @@ Volume::WriteBlockGroup(Transaction& transaction, int32 index) } +status_t +Volume::ActivateLargeFiles(Transaction& transaction) +{ + if ((fSuperBlock.ReadOnlyFeatures() + & EXT2_READ_ONLY_FEATURE_LARGE_FILE) != 0) + return B_OK; + + fSuperBlock.SetReadOnlyFeatures(fSuperBlock.ReadOnlyFeatures() + | EXT2_READ_ONLY_FEATURE_LARGE_FILE); + + return WriteSuperBlock(transaction); +} + + status_t Volume::SaveOrphan(Transaction& transaction, ino_t newID, ino_t& oldID) { diff --git a/src/add-ons/kernel/file_systems/ext2/Volume.h b/src/add-ons/kernel/file_systems/ext2/Volume.h index a993736cbb..d9b4377c86 100644 --- a/src/add-ons/kernel/file_systems/ext2/Volume.h +++ b/src/add-ons/kernel/file_systems/ext2/Volume.h @@ -82,6 +82,7 @@ public: bool HugeFiles() const { return (fSuperBlock.ReadOnlyFeatures() & EXT2_READ_ONLY_FEATURE_HUGE_FILE) != 0; } + status_t ActivateLargeFiles(Transaction& transaction); status_t SaveOrphan(Transaction& transaction, ino_t newID, ino_t &oldID); diff --git a/src/add-ons/kernel/file_systems/ext2/ext2.h b/src/add-ons/kernel/file_systems/ext2/ext2.h index 2d0b331129..369cd66eb9 100644 --- a/src/add-ons/kernel/file_systems/ext2/ext2.h +++ b/src/add-ons/kernel/file_systems/ext2/ext2.h @@ -123,7 +123,9 @@ struct ext2_super_block { { free_blocks = B_HOST_TO_LENDIAN_INT32(freeBlocks); } void SetLastOrphan(ino_t id) { last_orphan = B_HOST_TO_LENDIAN_INT32((uint32)id); } - + void SetReadOnlyFeatures(uint32 readOnlyFeatures) const + { readOnlyFeatures = B_HOST_TO_LENDIAN_INT32(readOnlyFeatures); } + bool IsValid(); // implemented in Volume.cpp } _PACKED; @@ -147,7 +149,7 @@ struct ext2_super_block { // read-only compatible features #define EXT2_READ_ONLY_FEATURE_SPARSE_SUPER 0x0001 -#define EXT2_READ_ONLY_FEATURE_LARGE_FILE 0x0002 +#define EXT2_READ_ONLY_FEATURE_LARGE_FILE 0x0002 #define EXT2_READ_ONLY_FEATURE_BTREE_DIRECTORY 0x0004 #define EXT2_READ_ONLY_FEATURE_HUGE_FILE 0x0008