summary refs log tree commit diff
diff options
context:
space:
mode:
authorCody Schuffelen <schuffelen@google.com>2019-07-08 16:30:33 -0700
committerCommit Bot <commit-bot@chromium.org>2019-08-30 16:08:58 +0000
commit30c5a9ef0b2ca7edeed36cc7ff8235a8d75e1595 (patch)
treea35764ee3991ac8c4559449c9380b12edd30f6bf
parent7d533e5952b6bae600441e1183964d335a41d6fe (diff)
downloadcrosvm-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.rs2
-rw-r--r--disk/src/disk.rs9
-rw-r--r--sys_util/src/file_traits.rs16
-rw-r--r--sys_util/src/lib.rs2
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;