From 823a23829a5f584fbf019f74fa060ec7d3327418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Tue, 18 Jan 2011 19:03:46 +0000 Subject: [PATCH] * support for setting volume label (bug #7100). * minor cleanup git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40243 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/file_systems/ext2/ExtentStream.cpp | 2 +- src/add-ons/kernel/file_systems/ext2/HTree.h | 2 +- .../kernel/file_systems/ext2/Volume.cpp | 7 +++++ src/add-ons/kernel/file_systems/ext2/Volume.h | 10 ++++++- .../file_systems/ext2/kernel_interface.cpp | 27 +++++++++++++++++-- 5 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/add-ons/kernel/file_systems/ext2/ExtentStream.cpp b/src/add-ons/kernel/file_systems/ext2/ExtentStream.cpp index c92b5b5e71..491ff15f07 100644 --- a/src/add-ons/kernel/file_systems/ext2/ExtentStream.cpp +++ b/src/add-ons/kernel/file_systems/ext2/ExtentStream.cpp @@ -83,7 +83,7 @@ ExtentStream::FindBlock(off_t offset, fsblock_t& block, uint32 *_count) int32 high = stream->extent_header.NumEntries() - 1; int32 middle = 0; while (low <= high) { - middle = (high + low) / 2; + middle = (high + low) >> 1; if (stream->extent_entries[middle].LogicalBlock() == index) break; if (stream->extent_entries[middle].LogicalBlock() < index) diff --git a/src/add-ons/kernel/file_systems/ext2/HTree.h b/src/add-ons/kernel/file_systems/ext2/HTree.h index 384ac52123..77c975b86e 100644 --- a/src/add-ons/kernel/file_systems/ext2/HTree.h +++ b/src/add-ons/kernel/file_systems/ext2/HTree.h @@ -88,7 +88,7 @@ struct HTreeRoot { HTreeCountLimit count_limit[0]; - bool IsValid() const; + bool IsValid() const; // Implemented in HTree.cpp } _PACKED; diff --git a/src/add-ons/kernel/file_systems/ext2/Volume.cpp b/src/add-ons/kernel/file_systems/ext2/Volume.cpp index 0c6010bd90..adb47497e2 100644 --- a/src/add-ons/kernel/file_systems/ext2/Volume.cpp +++ b/src/add-ons/kernel/file_systems/ext2/Volume.cpp @@ -266,6 +266,13 @@ Volume::Name() const } +void +Volume::SetName(const char* name) +{ + strlcpy(fSuperBlock.name, name, sizeof(fSuperBlock.name)); +} + + status_t Volume::Mount(const char* deviceName, uint32 flags) { diff --git a/src/add-ons/kernel/file_systems/ext2/Volume.h b/src/add-ons/kernel/file_systems/ext2/Volume.h index 09e2f7af5e..4e7637a9ab 100644 --- a/src/add-ons/kernel/file_systems/ext2/Volume.h +++ b/src/add-ons/kernel/file_systems/ext2/Volume.h @@ -34,7 +34,7 @@ public: bool IsValidSuperBlock(); bool IsReadOnly() const { return (fFlags & VOLUME_READ_ONLY) != 0; } - + mutex& Lock(); bool HasExtendedAttributes() const; Inode* RootNode() const { return fRootNode; } @@ -44,6 +44,7 @@ public: { return fFSVolume ? fFSVolume->id : -1; } fs_volume* FSVolume() const { return fFSVolume; } const char* Name() const; + void SetName(const char* name); uint32 NumInodes() const { return fNumInodes; } @@ -174,4 +175,11 @@ private: Inode* fRootNode; }; + +inline mutex& +Volume::Lock() +{ + return fLock; +} + #endif // VOLUME_H diff --git a/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp b/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp index e4bebb1093..e32086e398 100644 --- a/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp @@ -177,6 +177,28 @@ ext2_read_fs_info(fs_volume* _volume, struct fs_info* info) } +static status_t +ext2_write_fs_info(fs_volume* _volume, const struct fs_info* info, uint32 mask) +{ + Volume* volume = (Volume*)_volume->private_volume; + + if (volume->IsReadOnly()) + return B_READ_ONLY_DEVICE; + + MutexLocker locker(volume->Lock()); + + status_t status = B_BAD_VALUE; + + if (mask & FS_WRITE_FSINFO_NAME) { + Transaction transaction(volume->GetJournal()); + volume->SetName(info->volume_name); + status = volume->WriteSuperBlock(transaction); + transaction.Done(); + } + return status; +} + + static status_t ext2_sync(fs_volume* _volume) { @@ -1629,7 +1651,7 @@ ext2_remove_attr(fs_volume* _volume, fs_vnode* vnode, fs_volume_ops gExt2VolumeOps = { &ext2_unmount, &ext2_read_fs_info, - NULL, // write_fs_info() + &ext2_write_fs_info, &ext2_sync, &ext2_get_vnode, }; @@ -1717,7 +1739,8 @@ static file_system_module_info sExt2FileSystem = { "ext2", // short_name "Ext2 File System", // pretty_name - B_DISK_SYSTEM_SUPPORTS_WRITING, // DDM flags + B_DISK_SYSTEM_SUPPORTS_WRITING + | B_DISK_SYSTEM_SUPPORTS_CONTENT_NAME, // DDM flags // scanning ext2_identify_partition,