From: Fabian Ebner <f.ebner@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH v3 proxmox-backup 2/3] disks: also check for file systems with lsblk
Date: Fri, 9 Jul 2021 12:32:34 +0200 [thread overview]
Message-ID: <20210709103235.79800-2-f.ebner@proxmox.com> (raw)
In-Reply-To: <20210709103235.79800-1-f.ebner@proxmox.com>
Reported-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
---
Changes from v2:
* rebase because of moved file
Ideally, we'd also show the type in the result, but the api macro
currently does not support enums with fields:
FileSystem(String)
Mounted(String) // showing the fs type here would also be nice
An alternative would be replacing the DiskUsageType with a String in
the DiskUsage struct, but that's not very nice...
src/tools/disks/mod.rs | 34 ++++++++++++++++++++++++++++++++--
1 file changed, 32 insertions(+), 2 deletions(-)
diff --git a/src/tools/disks/mod.rs b/src/tools/disks/mod.rs
index 6e68954c..af7f7fe1 100644
--- a/src/tools/disks/mod.rs
+++ b/src/tools/disks/mod.rs
@@ -54,6 +54,9 @@ pub struct LsblkInfo {
/// Partition type GUID.
#[serde(rename = "parttype")]
partition_type: Option<String>,
+ /// File system label.
+ #[serde(rename = "fstype")]
+ file_system_type: Option<String>,
}
impl DiskManage {
@@ -565,11 +568,11 @@ pub struct BlockDevStat {
pub io_ticks: u64, // milliseconds
}
-/// Use lsblk to read partition type uuids.
+/// Use lsblk to read partition type uuids and file system types.
pub fn get_lsblk_info() -> Result<Vec<LsblkInfo>, Error> {
let mut command = std::process::Command::new("lsblk");
- command.args(&["--json", "-o", "path,parttype"]);
+ command.args(&["--json", "-o", "path,parttype,fstype"]);
let output = crate::tools::run_command(command, None)?;
@@ -578,6 +581,25 @@ pub fn get_lsblk_info() -> Result<Vec<LsblkInfo>, Error> {
Ok(serde_json::from_value(output["blockdevices"].take())?)
}
+/// Get set of devices with a file system label.
+///
+/// The set is indexed by using the unix raw device number (dev_t is u64)
+fn get_file_system_devices(
+ lsblk_info: &[LsblkInfo],
+) -> Result<HashSet<u64>, Error> {
+
+ let mut device_set: HashSet<u64> = HashSet::new();
+
+ for info in lsblk_info.iter() {
+ if info.file_system_type.is_some() {
+ let meta = std::fs::metadata(&info.path)?;
+ device_set.insert(meta.rdev());
+ }
+ }
+
+ Ok(device_set)
+}
+
#[api()]
#[derive(Debug, Serialize, Deserialize, PartialEq)]
#[serde(rename_all="lowercase")]
@@ -594,6 +616,8 @@ pub enum DiskUsageType {
DeviceMapper,
/// Disk has partitions
Partitions,
+ /// Disk contains a file system label
+ FileSystem,
}
#[api(
@@ -740,6 +764,8 @@ pub fn get_disks(
let lvm_devices = get_lvm_devices(&lsblk_info)?;
+ let file_system_devices = get_file_system_devices(&lsblk_info)?;
+
// fixme: ceph journals/volumes
let mut result = HashMap::new();
@@ -815,6 +841,10 @@ pub fn get_disks(
};
}
+ if usage == DiskUsageType::Unused && file_system_devices.contains(&devnum) {
+ usage = DiskUsageType::FileSystem;
+ }
+
if usage == DiskUsageType::Unused && disk.has_holders()? {
usage = DiskUsageType::DeviceMapper;
}
--
2.30.2
next prev parent reply other threads:[~2021-07-09 10:32 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-09 10:32 [pbs-devel] [PATCH v3 proxmox-backup 1/3] disks: refactor partition type handling Fabian Ebner
2021-07-09 10:32 ` Fabian Ebner [this message]
2021-07-09 10:32 ` [pbs-devel] [PATCH v3 proxmox-backup 3/3] api: disk list: sort by name Fabian Ebner
2021-07-09 11:02 ` [pbs-devel] applied-series: [PATCH v3 proxmox-backup 1/3] disks: refactor partition type handling Thomas Lamprecht
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210709103235.79800-2-f.ebner@proxmox.com \
--to=f.ebner@proxmox.com \
--cc=pbs-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox