mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-04-28 19:54:35 +00:00
mount: fix the issue of missing check file exists
It's better to check whether the destination file exists before creating them, if it had been existed, then return directly. Fixes: #2247 Signed-off-by: fupan.lfp <fupan.lfp@antgroup.com>
This commit is contained in:
parent
594ff3a5bd
commit
5371b9214f
@ -822,19 +822,21 @@ pub fn remove_mounts(mounts: &[String]) -> Result<()> {
|
||||
#[instrument]
|
||||
fn ensure_destination_exists(destination: &str, fs_type: &str) -> Result<()> {
|
||||
let d = Path::new(destination);
|
||||
if !d.exists() {
|
||||
let dir = d
|
||||
.parent()
|
||||
.ok_or_else(|| anyhow!("mount destination {} doesn't exist", destination))?;
|
||||
if !dir.exists() {
|
||||
fs::create_dir_all(dir).context(format!("create dir all failed on {:?}", dir))?;
|
||||
}
|
||||
if d.exists() {
|
||||
return Ok(());
|
||||
}
|
||||
let dir = d
|
||||
.parent()
|
||||
.ok_or_else(|| anyhow!("mount destination {} doesn't exist", destination))?;
|
||||
|
||||
if !dir.exists() {
|
||||
fs::create_dir_all(dir).context(format!("create dir all {:?}", dir))?;
|
||||
}
|
||||
|
||||
if fs_type != "bind" || d.is_dir() {
|
||||
fs::create_dir_all(d).context(format!("create dir all failed on {:?}", d))?;
|
||||
fs::create_dir_all(d).context(format!("create dir all {:?}", d))?;
|
||||
} else {
|
||||
fs::OpenOptions::new().create(true).open(d)?;
|
||||
fs::File::create(d).context(format!("create file {:?}", d))?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
@ -860,6 +862,7 @@ mod tests {
|
||||
use super::*;
|
||||
use crate::{skip_if_not_root, skip_loop_if_not_root, skip_loop_if_root};
|
||||
use libc::umount;
|
||||
use std::fs::metadata;
|
||||
use std::fs::File;
|
||||
use std::fs::OpenOptions;
|
||||
use std::io::Write;
|
||||
@ -1435,4 +1438,39 @@ mod tests {
|
||||
assert!(mounts[1].eq(&cg_devices_mount), "{}", msg);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_ensure_destination_exists() {
|
||||
let dir = tempdir().expect("failed to create tmpdir");
|
||||
|
||||
let mut testfile = dir.into_path();
|
||||
testfile.push("testfile");
|
||||
|
||||
let result = ensure_destination_exists(testfile.to_str().unwrap(), "bind");
|
||||
|
||||
assert!(result.is_ok());
|
||||
assert!(testfile.exists());
|
||||
|
||||
let result = ensure_destination_exists(testfile.to_str().unwrap(), "bind");
|
||||
assert!(result.is_ok());
|
||||
|
||||
let meta = metadata(testfile).unwrap();
|
||||
|
||||
assert!(meta.is_file());
|
||||
|
||||
let dir = tempdir().expect("failed to create tmpdir");
|
||||
let mut testdir = dir.into_path();
|
||||
testdir.push("testdir");
|
||||
|
||||
let result = ensure_destination_exists(testdir.to_str().unwrap(), "ext4");
|
||||
assert!(result.is_ok());
|
||||
assert!(testdir.exists());
|
||||
|
||||
let result = ensure_destination_exists(testdir.to_str().unwrap(), "ext4");
|
||||
assert!(result.is_ok());
|
||||
|
||||
//let meta = metadata(testdir.to_str().unwrap()).unwrap();
|
||||
let meta = metadata(testdir).unwrap();
|
||||
assert!(meta.is_dir());
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user