mirror of
https://github.com/koverstreet/bcachefs-tools.git
synced 2025-03-10 00:00:04 +03:00
mount: Fall back to read-only on -EROFS
this is the mount helper's job, and since we're the mount helper... fixes: xfstests generic/050 Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
60ff4f2f3c
commit
59ccde4a2f
@ -23,7 +23,7 @@ fn mount_inner(
|
|||||||
src: String,
|
src: String,
|
||||||
target: impl AsRef<std::path::Path>,
|
target: impl AsRef<std::path::Path>,
|
||||||
fstype: &str,
|
fstype: &str,
|
||||||
mountflags: libc::c_ulong,
|
mut mountflags: libc::c_ulong,
|
||||||
data: Option<String>,
|
data: Option<String>,
|
||||||
) -> anyhow::Result<()> {
|
) -> anyhow::Result<()> {
|
||||||
// bind the CStrings to keep them alive
|
// bind the CStrings to keep them alive
|
||||||
@ -38,11 +38,23 @@ fn mount_inner(
|
|||||||
let data = data.map_or(ptr::null(), |data| data.as_ptr().cast());
|
let data = data.map_or(ptr::null(), |data| data.as_ptr().cast());
|
||||||
let fstype = fstype.as_ptr();
|
let fstype = fstype.as_ptr();
|
||||||
|
|
||||||
let ret = {
|
let mut ret;
|
||||||
info!("mounting filesystem");
|
loop {
|
||||||
// REQUIRES: CAP_SYS_ADMIN
|
ret = {
|
||||||
unsafe { libc::mount(src, target, fstype, mountflags, data) }
|
info!("mounting filesystem");
|
||||||
};
|
// REQUIRES: CAP_SYS_ADMIN
|
||||||
|
unsafe { libc::mount(src, target, fstype, mountflags, data) }
|
||||||
|
};
|
||||||
|
|
||||||
|
let err = errno::errno().0;
|
||||||
|
|
||||||
|
if ret == 0 || (err != libc::EACCES && err != libc::EROFS) || (mountflags & libc::MS_RDONLY) != 0 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("mount: device write-protected, mounting read-only");
|
||||||
|
mountflags |= libc::MS_RDONLY;
|
||||||
|
}
|
||||||
match ret {
|
match ret {
|
||||||
0 => Ok(()),
|
0 => Ok(()),
|
||||||
_ => Err(crate::ErrnoError(errno::errno()).into()),
|
_ => Err(crate::ErrnoError(errno::errno()).into()),
|
||||||
|
Loading…
Reference in New Issue
Block a user