From d9e730c80839fba5199363ddd344d446f7c734a7 Mon Sep 17 00:00:00 2001 From: PulkoMandy Date: Sun, 24 Jul 2022 16:55:10 +0200 Subject: [PATCH] libroot: generate a name for nameless volumes Generate a name indicating the volume size and filesystem. Remove code that was doing that or similar things in various filesystems. Change-Id: I6b993735e58cdfaf1f19af575e918614c7fe5679 Reviewed-on: https://review.haiku-os.org/c/haiku/+/5381 Tested-by: Commit checker robot Reviewed-by: Jessica Hamilton Reviewed-by: John Scipione --- .../kernel/file_systems/ext2/Volume.cpp | 26 ++---------------- src/add-ons/kernel/file_systems/ext2/Volume.h | 1 - src/add-ons/kernel/file_systems/fat/dosfs.cpp | 8 +++--- src/system/kernel/lib/Jamfile | 2 +- src/system/libroot/os/Jamfile | 2 +- .../libroot/os/{fs_info.c => fs_info.cpp} | 27 +++++++++++++++++-- 6 files changed, 34 insertions(+), 32 deletions(-) rename src/system/libroot/os/{fs_info.c => fs_info.cpp} (58%) diff --git a/src/add-ons/kernel/file_systems/ext2/Volume.cpp b/src/add-ons/kernel/file_systems/ext2/Volume.cpp index cce2cba784..4d7ec75daa 100644 --- a/src/add-ons/kernel/file_systems/ext2/Volume.cpp +++ b/src/add-ons/kernel/file_systems/ext2/Volume.cpp @@ -109,10 +109,8 @@ Volume::HasExtendedAttributes() const const char* Volume::Name() const { - if (fSuperBlock.name[0]) - return fSuperBlock.name; - - return fName; + // The name may be empty, in that case, userspace will generate one. + return fSuperBlock.name; } @@ -333,26 +331,6 @@ Volume::Mount(const char* deviceName, uint32 flags) // all went fine opener.Keep(); - if (!fSuperBlock.name[0]) { - // generate a more or less descriptive volume name - off_t divisor = 1ULL << 40; - char unit = 'T'; - if (diskSize < divisor) { - divisor = 1UL << 30; - unit = 'G'; - if (diskSize < divisor) { - divisor = 1UL << 20; - unit = 'M'; - } - } - - double size = double((10 * diskSize + divisor - 1) / divisor); - // %g in the kernel does not support precision... - - snprintf(fName, sizeof(fName), "%g %cB Ext2 Volume", - size / 10, unit); - } - return B_OK; } diff --git a/src/add-ons/kernel/file_systems/ext2/Volume.h b/src/add-ons/kernel/file_systems/ext2/Volume.h index 369b88394e..b11c2da571 100644 --- a/src/add-ons/kernel/file_systems/ext2/Volume.h +++ b/src/add-ons/kernel/file_systems/ext2/Volume.h @@ -166,7 +166,6 @@ private: fs_volume* fFSVolume; int fDevice; ext2_super_block fSuperBlock; - char fName[32]; BlockAllocator* fBlockAllocator; InodeAllocator fInodeAllocator; diff --git a/src/add-ons/kernel/file_systems/fat/dosfs.cpp b/src/add-ons/kernel/file_systems/fat/dosfs.cpp index a34c21f034..e546455934 100644 --- a/src/add-ons/kernel/file_systems/fat/dosfs.cpp +++ b/src/add-ons/kernel/file_systems/fat/dosfs.cpp @@ -710,7 +710,7 @@ dosfs_identify_partition(int fd, partition_data *partition, void **_cookie) if (buf[0x15] != 0xf0 && buf[0x15] < 0xf8) return -1; - strcpy(name, "no name"); + name[0] = 0; sectors_per_fat = read16(buf, 0x16); if (sectors_per_fat == 0) { total_sectors = read32(buf, 0x20); @@ -995,8 +995,10 @@ dosfs_read_fs_stat(fs_volume *_vol, struct fs_info * fss) if (vol->vol_entry > -2) strlcpy(fss->volume_name, vol->vol_label, sizeof(fss->volume_name)); - else - strcpy(fss->volume_name, "no name"); + else { + // No name defined, let userspace decide of one + fss->volume_name[0] = 0; + } sanitize_name(fss->volume_name, 12); diff --git a/src/system/kernel/lib/Jamfile b/src/system/kernel/lib/Jamfile index becc8e3dd4..19cc853e69 100644 --- a/src/system/kernel/lib/Jamfile +++ b/src/system/kernel/lib/Jamfile @@ -21,7 +21,7 @@ local posixSources = [ FDirName $(librootSources) posix ] ; local sources = driver_settings.cpp find_directory.cpp - fs_info.c + fs_info.cpp system_revision.c wait_for_objects.cpp ; diff --git a/src/system/libroot/os/Jamfile b/src/system/libroot/os/Jamfile index 97137fc5b8..39cf782491 100644 --- a/src/system/libroot/os/Jamfile +++ b/src/system/libroot/os/Jamfile @@ -24,7 +24,7 @@ for architectureObject in [ MultiArchSubDirSetup ] { find_paths.cpp fs_attr.cpp fs_index.c - fs_info.c + fs_info.cpp fs_query.cpp fs_volume.c image.cpp diff --git a/src/system/libroot/os/fs_info.c b/src/system/libroot/os/fs_info.cpp similarity index 58% rename from src/system/libroot/os/fs_info.c rename to src/system/libroot/os/fs_info.cpp index 54a0681316..8718ae3e2c 100644 --- a/src/system/libroot/os/fs_info.c +++ b/src/system/libroot/os/fs_info.cpp @@ -6,9 +6,10 @@ #include -#include -#include #include +#include +#include +#include #include #include @@ -40,6 +41,28 @@ fs_stat_dev(dev_t device, fs_info *info) { status_t status = _kern_read_fs_info(device, info); + if (info != NULL) { + if (info->volume_name[0] == 0) { + // Give a default name to unnamed volumes + off_t divisor = 1ULL << 40; + off_t diskSize = info->total_blocks * info->block_size; + + char unit = 'T'; + if (diskSize < divisor) { + divisor = 1UL << 30; + unit = 'G'; + if (diskSize < divisor) { + divisor = 1UL << 20; + unit = 'M'; + } + } + + double size = double((10 * diskSize + divisor - 1) / divisor); + + sprintf(info->volume_name, "%g %ciB %s volume", size / 10, unit, info->fsh_name); + } + } + RETURN_AND_SET_ERRNO(status); }