mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-09-19 15:58:25 +00:00
Merge pull request #1457 from mxpv/shared
agent: don't error of virtiofs share is already mounted
This commit is contained in:
@@ -43,6 +43,8 @@ pub const DRIVER_LOCAL_TYPE: &str = "local";
|
||||
|
||||
pub const TYPE_ROOTFS: &str = "rootfs";
|
||||
|
||||
pub const MOUNT_GUEST_TAG: &str = "kataShared";
|
||||
|
||||
#[rustfmt::skip]
|
||||
lazy_static! {
|
||||
pub static ref FLAGS: HashMap<&'static str, (bool, MsFlags)> = {
|
||||
@@ -382,6 +384,14 @@ async fn nvdimm_storage_handler(
|
||||
fn mount_storage(logger: &Logger, storage: &Storage) -> Result<()> {
|
||||
let logger = logger.new(o!("subsystem" => "mount"));
|
||||
|
||||
// Check share before attempting to mount to see if the destination is already a mount point.
|
||||
// If so, skip doing the mount. This facilitates mounting the sharedfs automatically
|
||||
// in the guest before the agent service starts.
|
||||
if storage.source == MOUNT_GUEST_TAG && is_mounted(&storage.mount_point)? {
|
||||
warn!(logger, "kataShared already mounted, ignoring...");
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
match storage.fstype.as_str() {
|
||||
DRIVER_9P_TYPE | DRIVER_VIRTIOFS_TYPE => {
|
||||
let dest_path = Path::new(storage.mount_point.as_str());
|
||||
@@ -417,6 +427,24 @@ fn mount_storage(logger: &Logger, storage: &Storage) -> Result<()> {
|
||||
bare_mount.mount()
|
||||
}
|
||||
|
||||
/// Looks for `mount_point` entry in the /proc/mounts.
|
||||
fn is_mounted(mount_point: &str) -> Result<bool> {
|
||||
let mount_point = mount_point.trim_end_matches('/');
|
||||
let found = fs::metadata(mount_point).is_ok()
|
||||
// Looks through /proc/mounts and check if the mount exists
|
||||
&& fs::read_to_string("/proc/mounts")?
|
||||
.lines()
|
||||
.any(|line| {
|
||||
// The 2nd column reveals the mount point.
|
||||
line.split_whitespace()
|
||||
.nth(1)
|
||||
.map(|target| mount_point.eq(target))
|
||||
.unwrap_or(false)
|
||||
});
|
||||
|
||||
Ok(found)
|
||||
}
|
||||
|
||||
fn parse_mount_flags_and_options(options_vec: Vec<&str>) -> (MsFlags, String) {
|
||||
let mut flags = MsFlags::empty();
|
||||
let mut options: String = "".to_string();
|
||||
@@ -896,6 +924,14 @@ mod tests {
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_is_mounted() {
|
||||
assert!(is_mounted("/proc").unwrap());
|
||||
assert!(!is_mounted("").unwrap());
|
||||
assert!(!is_mounted("!").unwrap());
|
||||
assert!(!is_mounted("/not_existing_path").unwrap());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_remove_mounts() {
|
||||
skip_if_not_root!();
|
||||
|
Reference in New Issue
Block a user