xref: /aosp_15_r20/external/crosvm/devices/src/virtio/scsi/mod.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2023 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker use std::path::PathBuf;
6*bb4ee6a4SAndroid Build Coastguard Worker 
7*bb4ee6a4SAndroid Build Coastguard Worker use serde::Deserialize;
8*bb4ee6a4SAndroid Build Coastguard Worker use serde::Serialize;
9*bb4ee6a4SAndroid Build Coastguard Worker 
10*bb4ee6a4SAndroid Build Coastguard Worker pub(crate) mod sys;
11*bb4ee6a4SAndroid Build Coastguard Worker 
12*bb4ee6a4SAndroid Build Coastguard Worker pub mod commands;
13*bb4ee6a4SAndroid Build Coastguard Worker pub mod constants;
14*bb4ee6a4SAndroid Build Coastguard Worker mod device;
15*bb4ee6a4SAndroid Build Coastguard Worker 
16*bb4ee6a4SAndroid Build Coastguard Worker pub use device::Controller;
17*bb4ee6a4SAndroid Build Coastguard Worker pub use device::DiskConfig;
18*bb4ee6a4SAndroid Build Coastguard Worker 
scsi_option_lock_default() -> bool19*bb4ee6a4SAndroid Build Coastguard Worker fn scsi_option_lock_default() -> bool {
20*bb4ee6a4SAndroid Build Coastguard Worker     true
21*bb4ee6a4SAndroid Build Coastguard Worker }
scsi_option_block_size_default() -> u3222*bb4ee6a4SAndroid Build Coastguard Worker fn scsi_option_block_size_default() -> u32 {
23*bb4ee6a4SAndroid Build Coastguard Worker     512
24*bb4ee6a4SAndroid Build Coastguard Worker }
25*bb4ee6a4SAndroid Build Coastguard Worker 
26*bb4ee6a4SAndroid Build Coastguard Worker /// Parameters for setting up a SCSI device.
27*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, serde_keyvalue::FromKeyValues)]
28*bb4ee6a4SAndroid Build Coastguard Worker #[serde(deny_unknown_fields, rename_all = "kebab-case")]
29*bb4ee6a4SAndroid Build Coastguard Worker pub struct ScsiOption {
30*bb4ee6a4SAndroid Build Coastguard Worker     // Path to the SCSI image.
31*bb4ee6a4SAndroid Build Coastguard Worker     pub path: PathBuf,
32*bb4ee6a4SAndroid Build Coastguard Worker     // Indicates whether the device is ready only.
33*bb4ee6a4SAndroid Build Coastguard Worker     #[serde(default, rename = "ro")]
34*bb4ee6a4SAndroid Build Coastguard Worker     pub read_only: bool,
35*bb4ee6a4SAndroid Build Coastguard Worker     /// Whether to lock the disk files. Uses flock on Unix and FILE_SHARE_* flags on Windows.
36*bb4ee6a4SAndroid Build Coastguard Worker     #[serde(default = "scsi_option_lock_default")]
37*bb4ee6a4SAndroid Build Coastguard Worker     pub lock: bool,
38*bb4ee6a4SAndroid Build Coastguard Worker     // The block size of the device.
39*bb4ee6a4SAndroid Build Coastguard Worker     #[serde(default = "scsi_option_block_size_default")]
40*bb4ee6a4SAndroid Build Coastguard Worker     pub block_size: u32,
41*bb4ee6a4SAndroid Build Coastguard Worker     /// Whether this scsi device should be the root device. Can only be set once. Only useful for
42*bb4ee6a4SAndroid Build Coastguard Worker     /// adding specific command-line options.
43*bb4ee6a4SAndroid Build Coastguard Worker     #[serde(default)]
44*bb4ee6a4SAndroid Build Coastguard Worker     pub root: bool,
45*bb4ee6a4SAndroid Build Coastguard Worker }
46*bb4ee6a4SAndroid Build Coastguard Worker 
47*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(test)]
48*bb4ee6a4SAndroid Build Coastguard Worker mod tests {
49*bb4ee6a4SAndroid Build Coastguard Worker     use std::path::Path;
50*bb4ee6a4SAndroid Build Coastguard Worker 
51*bb4ee6a4SAndroid Build Coastguard Worker     use serde_keyvalue::from_key_values;
52*bb4ee6a4SAndroid Build Coastguard Worker 
53*bb4ee6a4SAndroid Build Coastguard Worker     use super::*;
54*bb4ee6a4SAndroid Build Coastguard Worker 
55*bb4ee6a4SAndroid Build Coastguard Worker     #[test]
parse_scsi_options()56*bb4ee6a4SAndroid Build Coastguard Worker     fn parse_scsi_options() {
57*bb4ee6a4SAndroid Build Coastguard Worker         let scsi_option = from_key_values::<ScsiOption>("/path/to/image").unwrap();
58*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(
59*bb4ee6a4SAndroid Build Coastguard Worker             scsi_option,
60*bb4ee6a4SAndroid Build Coastguard Worker             ScsiOption {
61*bb4ee6a4SAndroid Build Coastguard Worker                 path: Path::new("/path/to/image").to_path_buf(),
62*bb4ee6a4SAndroid Build Coastguard Worker                 read_only: false,
63*bb4ee6a4SAndroid Build Coastguard Worker                 lock: scsi_option_lock_default(),
64*bb4ee6a4SAndroid Build Coastguard Worker                 block_size: 512,
65*bb4ee6a4SAndroid Build Coastguard Worker                 root: false,
66*bb4ee6a4SAndroid Build Coastguard Worker             }
67*bb4ee6a4SAndroid Build Coastguard Worker         );
68*bb4ee6a4SAndroid Build Coastguard Worker 
69*bb4ee6a4SAndroid Build Coastguard Worker         let scsi_option = from_key_values::<ScsiOption>("/path/to/image,ro").unwrap();
70*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(
71*bb4ee6a4SAndroid Build Coastguard Worker             scsi_option,
72*bb4ee6a4SAndroid Build Coastguard Worker             ScsiOption {
73*bb4ee6a4SAndroid Build Coastguard Worker                 path: Path::new("/path/to/image").to_path_buf(),
74*bb4ee6a4SAndroid Build Coastguard Worker                 read_only: true,
75*bb4ee6a4SAndroid Build Coastguard Worker                 lock: scsi_option_lock_default(),
76*bb4ee6a4SAndroid Build Coastguard Worker                 block_size: 512,
77*bb4ee6a4SAndroid Build Coastguard Worker                 root: false,
78*bb4ee6a4SAndroid Build Coastguard Worker             }
79*bb4ee6a4SAndroid Build Coastguard Worker         );
80*bb4ee6a4SAndroid Build Coastguard Worker 
81*bb4ee6a4SAndroid Build Coastguard Worker         let scsi_option = from_key_values::<ScsiOption>("/path/to/image,block-size=1024").unwrap();
82*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(
83*bb4ee6a4SAndroid Build Coastguard Worker             scsi_option,
84*bb4ee6a4SAndroid Build Coastguard Worker             ScsiOption {
85*bb4ee6a4SAndroid Build Coastguard Worker                 path: Path::new("/path/to/image").to_path_buf(),
86*bb4ee6a4SAndroid Build Coastguard Worker                 read_only: false,
87*bb4ee6a4SAndroid Build Coastguard Worker                 lock: scsi_option_lock_default(),
88*bb4ee6a4SAndroid Build Coastguard Worker                 block_size: 1024,
89*bb4ee6a4SAndroid Build Coastguard Worker                 root: false,
90*bb4ee6a4SAndroid Build Coastguard Worker             }
91*bb4ee6a4SAndroid Build Coastguard Worker         );
92*bb4ee6a4SAndroid Build Coastguard Worker 
93*bb4ee6a4SAndroid Build Coastguard Worker         let scsi_option =
94*bb4ee6a4SAndroid Build Coastguard Worker             from_key_values::<ScsiOption>("/path/to/image,block-size=1024,root").unwrap();
95*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(
96*bb4ee6a4SAndroid Build Coastguard Worker             scsi_option,
97*bb4ee6a4SAndroid Build Coastguard Worker             ScsiOption {
98*bb4ee6a4SAndroid Build Coastguard Worker                 path: Path::new("/path/to/image").to_path_buf(),
99*bb4ee6a4SAndroid Build Coastguard Worker                 read_only: false,
100*bb4ee6a4SAndroid Build Coastguard Worker                 lock: scsi_option_lock_default(),
101*bb4ee6a4SAndroid Build Coastguard Worker                 block_size: 1024,
102*bb4ee6a4SAndroid Build Coastguard Worker                 root: true,
103*bb4ee6a4SAndroid Build Coastguard Worker             }
104*bb4ee6a4SAndroid Build Coastguard Worker         );
105*bb4ee6a4SAndroid Build Coastguard Worker     }
106*bb4ee6a4SAndroid Build Coastguard Worker }
107