diff options
author | Cody Schuffelen <schuffelen@google.com> | 2019-07-08 16:30:33 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-08-30 16:08:58 +0000 |
commit | 30c5a9ef0b2ca7edeed36cc7ff8235a8d75e1595 (patch) | |
tree | a35764ee3991ac8c4559449c9380b12edd30f6bf | |
parent | 7d533e5952b6bae600441e1183964d335a41d6fe (diff) | |
download | crosvm-30c5a9ef0b2ca7edeed36cc7ff8235a8d75e1595.tar crosvm-30c5a9ef0b2ca7edeed36cc7ff8235a8d75e1595.tar.gz crosvm-30c5a9ef0b2ca7edeed36cc7ff8235a8d75e1595.tar.bz2 crosvm-30c5a9ef0b2ca7edeed36cc7ff8235a8d75e1595.tar.lz crosvm-30c5a9ef0b2ca7edeed36cc7ff8235a8d75e1595.tar.xz crosvm-30c5a9ef0b2ca7edeed36cc7ff8235a8d75e1595.tar.zst crosvm-30c5a9ef0b2ca7edeed36cc7ff8235a8d75e1595.zip |
Replace "AsRawFd" with "AsRawFds" for disks.
This supports virtio disks that depend on multiple file descriptors. All of the file descriptors are passed to the jail when relevant. Bug: b/133432409 Change-Id: Idf2e24cd2984c0d12a47a523c13d24c1ba8d173e Signed-off-by: Cody Schuffelen <schuffelen@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1691761 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com>
-rw-r--r-- | devices/src/virtio/block.rs | 2 | ||||
-rw-r--r-- | disk/src/disk.rs | 9 | ||||
-rw-r--r-- | sys_util/src/file_traits.rs | 16 | ||||
-rw-r--r-- | sys_util/src/lib.rs | 2 |
4 files changed, 22 insertions, 7 deletions
diff --git a/devices/src/virtio/block.rs b/devices/src/virtio/block.rs index 7a728d7..3662bd9 100644 --- a/devices/src/virtio/block.rs +++ b/devices/src/virtio/block.rs @@ -707,7 +707,7 @@ impl VirtioDevice for Block { let mut keep_fds = Vec::new(); if let Some(disk_image) = &self.disk_image { - keep_fds.push(disk_image.as_raw_fd()); + keep_fds.extend(disk_image.as_raw_fds()); } if let Some(control_socket) = &self.control_socket { diff --git a/disk/src/disk.rs b/disk/src/disk.rs index c9ce1b3..9f1914d 100644 --- a/disk/src/disk.rs +++ b/disk/src/disk.rs @@ -6,12 +6,13 @@ use std::cmp::min; use std::fmt::{self, Display}; use std::fs::File; use std::io::{self, Read, Seek, SeekFrom, Write}; -use std::os::unix::io::AsRawFd; use libc::EINVAL; use qcow::{QcowFile, QCOW_MAGIC}; use remain::sorted; -use sys_util::{FileReadWriteVolatile, FileSetLen, FileSync, PunchHole, SeekHole, WriteZeroes}; +use sys_util::{ + AsRawFds, FileReadWriteVolatile, FileSetLen, FileSync, PunchHole, SeekHole, WriteZeroes, +}; #[sorted] #[derive(Debug)] @@ -30,7 +31,7 @@ pub type Result<T> = std::result::Result<T, Error>; /// The prerequisites necessary to support a block device. pub trait DiskFile: - FileSetLen + FileSync + FileReadWriteVolatile + PunchHole + Seek + WriteZeroes + Send + AsRawFd + FileSetLen + FileSync + FileReadWriteVolatile + PunchHole + Seek + WriteZeroes + Send + AsRawFds { } impl< @@ -41,7 +42,7 @@ impl< + Seek + WriteZeroes + Send - + AsRawFd, + + AsRawFds, > DiskFile for D { } diff --git a/sys_util/src/file_traits.rs b/sys_util/src/file_traits.rs index 584ac9a..c0c7a9b 100644 --- a/sys_util/src/file_traits.rs +++ b/sys_util/src/file_traits.rs @@ -4,7 +4,7 @@ use std::fs::File; use std::io::{Error, ErrorKind, Result}; -use std::os::unix::io::AsRawFd; +use std::os::unix::io::{AsRawFd, RawFd}; use data_model::VolatileSlice; @@ -117,3 +117,17 @@ impl FileReadWriteVolatile for File { } } } + +/// A trait similar to `AsRawFd` but supports an arbitrary number of file descriptors. +pub trait AsRawFds { + fn as_raw_fds(&self) -> Vec<RawFd>; +} + +impl<T> AsRawFds for T +where + T: AsRawFd, +{ + fn as_raw_fds(&self) -> Vec<RawFd> { + vec![self.as_raw_fd()] + } +} diff --git a/sys_util/src/lib.rs b/sys_util/src/lib.rs index 51c3898..697b0e1 100644 --- a/sys_util/src/lib.rs +++ b/sys_util/src/lib.rs @@ -63,7 +63,7 @@ pub use crate::terminal::*; pub use crate::timerfd::*; pub use poll_token_derive::*; -pub use crate::file_traits::{FileReadWriteVolatile, FileSetLen, FileSync}; +pub use crate::file_traits::{AsRawFds, FileReadWriteVolatile, FileSetLen, FileSync}; pub use crate::guest_memory::Error as GuestMemoryError; pub use crate::mmap::Error as MmapError; pub use crate::seek_hole::SeekHole; |