Skip to content

Commit 279135f

Browse files
committed
Send signals on all interfaces for settable blockdev properties
1 parent f4ad79d commit 279135f

10 files changed

Lines changed: 228 additions & 32 deletions

File tree

src/dbus/blockdev/blockdev_3_3/mod.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,11 @@ use crate::dbus::blockdev::blockdev_3_0::{
2929

3030
mod props;
3131

32-
pub use props::{new_physical_size_prop, set_user_info_prop};
32+
pub use props::{new_physical_size_prop, send_user_info_signal_on_change, set_user_info_prop};
3333

3434
pub struct BlockdevR3 {
3535
engine: Arc<dyn Engine>,
36+
connection: Arc<Connection>,
3637
manager: Lockable<Arc<RwLock<Manager>>>,
3738
parent_uuid: PoolUuid,
3839
uuid: DevUuid,
@@ -41,12 +42,14 @@ pub struct BlockdevR3 {
4142
impl BlockdevR3 {
4243
fn new(
4344
engine: Arc<dyn Engine>,
45+
connection: Arc<Connection>,
4446
manager: Lockable<Arc<RwLock<Manager>>>,
4547
parent_uuid: PoolUuid,
4648
uuid: DevUuid,
4749
) -> Self {
4850
BlockdevR3 {
4951
engine,
52+
connection,
5053
manager,
5154
parent_uuid,
5255
uuid,
@@ -61,7 +64,13 @@ impl BlockdevR3 {
6164
parent_uuid: PoolUuid,
6265
uuid: DevUuid,
6366
) -> StratisResult<()> {
64-
let blockdev = Self::new(engine, manager.clone(), parent_uuid, uuid);
67+
let blockdev = Self::new(
68+
engine,
69+
Arc::clone(connection),
70+
manager.clone(),
71+
parent_uuid,
72+
uuid,
73+
);
6574

6675
connection.object_server().at(path, blockdev).await?;
6776
Ok(())
@@ -106,10 +115,13 @@ impl BlockdevR3 {
106115
async fn set_user_info(&self, value: (bool, String)) -> Result<(), zbus::Error> {
107116
set_blockdev_prop(
108117
&self.engine,
118+
&self.connection,
119+
&self.manager,
109120
self.parent_uuid,
110121
self.uuid,
111122
value,
112123
set_user_info_prop,
124+
send_user_info_signal_on_change,
113125
)
114126
.await
115127
}

src/dbus/blockdev/blockdev_3_3/props.rs

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,17 @@
22
// License, v. 2.0. If a copy of the MPL was not distributed with this
33
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
44

5-
use zbus::Error;
5+
use std::sync::Arc;
6+
7+
use tokio::sync::RwLock;
8+
use zbus::{Connection, Error};
69

710
use crate::{
8-
dbus::util::{option_to_tuple, tuple_to_option},
9-
engine::{BlockDev, BlockDevTier, DevUuid, Pool, PoolUuid, SomeLockWriteGuard},
11+
dbus::{
12+
manager::Manager,
13+
util::{option_to_tuple, send_user_info_signal, tuple_to_option},
14+
},
15+
engine::{BlockDev, BlockDevTier, DevUuid, Lockable, Pool, PoolUuid, SomeLockWriteGuard},
1016
};
1117

1218
pub fn new_physical_size_prop(_: BlockDevTier, _: DevUuid, dev: &dyn BlockDev) -> (bool, String) {
@@ -16,11 +22,11 @@ pub fn new_physical_size_prop(_: BlockDevTier, _: DevUuid, dev: &dyn BlockDev) -
1622
)
1723
}
1824

19-
pub fn set_user_info_prop(
20-
guard: &mut SomeLockWriteGuard<PoolUuid, dyn Pool>,
25+
pub async fn set_user_info_prop(
26+
mut guard: SomeLockWriteGuard<PoolUuid, dyn Pool>,
2127
dev_uuid: DevUuid,
2228
user_info_tuple: (bool, String),
23-
) -> Result<(), Error> {
29+
) -> Result<bool, Error> {
2430
let user_info = tuple_to_option(user_info_tuple);
2531
let user_info = user_info.as_deref();
2632
let (pool_name, _, pool) = guard.as_mut_tuple();
@@ -31,10 +37,23 @@ pub fn set_user_info_prop(
3137
.user_info()
3238
== user_info
3339
{
34-
Ok(())
40+
Ok(false)
3541
} else {
3642
pool.set_blockdev_user_info(&pool_name, dev_uuid, user_info)
37-
.map(|_| ())
38-
.map_err(|e| Error::Failure(e.to_string()))
43+
.map_err(|e| Error::Failure(e.to_string()))?;
44+
Ok(true)
45+
}
46+
}
47+
48+
pub async fn send_user_info_signal_on_change(
49+
connection: &Arc<Connection>,
50+
manager: &Lockable<Arc<RwLock<Manager>>>,
51+
dev_uuid: DevUuid,
52+
) {
53+
match manager.read().await.blockdev_get_path(&dev_uuid) {
54+
Some(p) => send_user_info_signal(connection, &p.as_ref()).await,
55+
None => {
56+
warn!("No path associated with blockdev UUID {dev_uuid}; cannot send property changed signal");
57+
}
3958
}
4059
}

src/dbus/blockdev/blockdev_3_4/mod.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,13 @@ use crate::{
2626
stratis::StratisResult,
2727
};
2828

29-
use crate::dbus::blockdev::blockdev_3_3::{new_physical_size_prop, set_user_info_prop};
29+
use crate::dbus::blockdev::blockdev_3_3::{
30+
new_physical_size_prop, send_user_info_signal_on_change, set_user_info_prop,
31+
};
3032

3133
pub struct BlockdevR4 {
3234
engine: Arc<dyn Engine>,
35+
connection: Arc<Connection>,
3336
manager: Lockable<Arc<RwLock<Manager>>>,
3437
parent_uuid: PoolUuid,
3538
uuid: DevUuid,
@@ -38,12 +41,14 @@ pub struct BlockdevR4 {
3841
impl BlockdevR4 {
3942
fn new(
4043
engine: Arc<dyn Engine>,
44+
connection: Arc<Connection>,
4145
manager: Lockable<Arc<RwLock<Manager>>>,
4246
parent_uuid: PoolUuid,
4347
uuid: DevUuid,
4448
) -> Self {
4549
BlockdevR4 {
4650
engine,
51+
connection,
4752
manager,
4853
parent_uuid,
4954
uuid,
@@ -58,7 +63,13 @@ impl BlockdevR4 {
5863
parent_uuid: PoolUuid,
5964
uuid: DevUuid,
6065
) -> StratisResult<()> {
61-
let blockdev = Self::new(engine, manager.clone(), parent_uuid, uuid);
66+
let blockdev = Self::new(
67+
engine,
68+
Arc::clone(connection),
69+
manager.clone(),
70+
parent_uuid,
71+
uuid,
72+
);
6273

6374
connection.object_server().at(path, blockdev).await?;
6475
Ok(())
@@ -103,10 +114,13 @@ impl BlockdevR4 {
103114
async fn set_user_info(&self, value: (bool, String)) -> Result<(), zbus::Error> {
104115
set_blockdev_prop(
105116
&self.engine,
117+
&self.connection,
118+
&self.manager,
106119
self.parent_uuid,
107120
self.uuid,
108121
value,
109122
set_user_info_prop,
123+
send_user_info_signal_on_change,
110124
)
111125
.await
112126
}

src/dbus/blockdev/blockdev_3_5/mod.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,13 @@ use crate::{
2626
stratis::StratisResult,
2727
};
2828

29-
use crate::dbus::blockdev::blockdev_3_3::{new_physical_size_prop, set_user_info_prop};
29+
use crate::dbus::blockdev::blockdev_3_3::{
30+
new_physical_size_prop, send_user_info_signal_on_change, set_user_info_prop,
31+
};
3032

3133
pub struct BlockdevR5 {
3234
engine: Arc<dyn Engine>,
35+
connection: Arc<Connection>,
3336
manager: Lockable<Arc<RwLock<Manager>>>,
3437
parent_uuid: PoolUuid,
3538
uuid: DevUuid,
@@ -38,12 +41,14 @@ pub struct BlockdevR5 {
3841
impl BlockdevR5 {
3942
fn new(
4043
engine: Arc<dyn Engine>,
44+
connection: Arc<Connection>,
4145
manager: Lockable<Arc<RwLock<Manager>>>,
4246
parent_uuid: PoolUuid,
4347
uuid: DevUuid,
4448
) -> Self {
4549
BlockdevR5 {
4650
engine,
51+
connection,
4752
manager,
4853
parent_uuid,
4954
uuid,
@@ -58,7 +63,13 @@ impl BlockdevR5 {
5863
parent_uuid: PoolUuid,
5964
uuid: DevUuid,
6065
) -> StratisResult<()> {
61-
let blockdev = Self::new(engine, manager.clone(), parent_uuid, uuid);
66+
let blockdev = Self::new(
67+
engine,
68+
Arc::clone(connection),
69+
manager.clone(),
70+
parent_uuid,
71+
uuid,
72+
);
6273

6374
connection.object_server().at(path, blockdev).await?;
6475
Ok(())
@@ -103,10 +114,13 @@ impl BlockdevR5 {
103114
async fn set_user_info(&self, value: (bool, String)) -> Result<(), zbus::Error> {
104115
set_blockdev_prop(
105116
&self.engine,
117+
&self.connection,
118+
&self.manager,
106119
self.parent_uuid,
107120
self.uuid,
108121
value,
109122
set_user_info_prop,
123+
send_user_info_signal_on_change,
110124
)
111125
.await
112126
}

src/dbus/blockdev/blockdev_3_6/mod.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,13 @@ use crate::dbus::blockdev::blockdev_3_0::{
2727
total_physical_size_prop, user_info_prop,
2828
};
2929

30-
use crate::dbus::blockdev::blockdev_3_3::{new_physical_size_prop, set_user_info_prop};
30+
use crate::dbus::blockdev::blockdev_3_3::{
31+
new_physical_size_prop, send_user_info_signal_on_change, set_user_info_prop,
32+
};
3133

3234
pub struct BlockdevR6 {
3335
engine: Arc<dyn Engine>,
36+
connection: Arc<Connection>,
3437
manager: Lockable<Arc<RwLock<Manager>>>,
3538
parent_uuid: PoolUuid,
3639
uuid: DevUuid,
@@ -39,12 +42,14 @@ pub struct BlockdevR6 {
3942
impl BlockdevR6 {
4043
fn new(
4144
engine: Arc<dyn Engine>,
45+
connection: Arc<Connection>,
4246
manager: Lockable<Arc<RwLock<Manager>>>,
4347
parent_uuid: PoolUuid,
4448
uuid: DevUuid,
4549
) -> Self {
4650
BlockdevR6 {
4751
engine,
52+
connection,
4853
manager,
4954
parent_uuid,
5055
uuid,
@@ -59,7 +64,13 @@ impl BlockdevR6 {
5964
parent_uuid: PoolUuid,
6065
uuid: DevUuid,
6166
) -> StratisResult<()> {
62-
let blockdev = Self::new(engine, manager.clone(), parent_uuid, uuid);
67+
let blockdev = Self::new(
68+
engine,
69+
Arc::clone(connection),
70+
manager.clone(),
71+
parent_uuid,
72+
uuid,
73+
);
6374

6475
connection.object_server().at(path, blockdev).await?;
6576
Ok(())
@@ -105,10 +116,13 @@ impl BlockdevR6 {
105116
async fn set_user_info(&self, value: (bool, String)) -> Result<(), zbus::Error> {
106117
set_blockdev_prop(
107118
&self.engine,
119+
&self.connection,
120+
&self.manager,
108121
self.parent_uuid,
109122
self.uuid,
110123
value,
111124
set_user_info_prop,
125+
send_user_info_signal_on_change,
112126
)
113127
.await
114128
}

src/dbus/blockdev/blockdev_3_7/mod.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,13 @@ use crate::dbus::blockdev::blockdev_3_0::{
2727
total_physical_size_prop, user_info_prop,
2828
};
2929

30-
use crate::dbus::blockdev::blockdev_3_3::{new_physical_size_prop, set_user_info_prop};
30+
use crate::dbus::blockdev::blockdev_3_3::{
31+
new_physical_size_prop, send_user_info_signal_on_change, set_user_info_prop,
32+
};
3133

3234
pub struct BlockdevR7 {
3335
engine: Arc<dyn Engine>,
36+
connection: Arc<Connection>,
3437
manager: Lockable<Arc<RwLock<Manager>>>,
3538
parent_uuid: PoolUuid,
3639
uuid: DevUuid,
@@ -39,12 +42,14 @@ pub struct BlockdevR7 {
3942
impl BlockdevR7 {
4043
fn new(
4144
engine: Arc<dyn Engine>,
45+
connection: Arc<Connection>,
4246
manager: Lockable<Arc<RwLock<Manager>>>,
4347
parent_uuid: PoolUuid,
4448
uuid: DevUuid,
4549
) -> Self {
4650
BlockdevR7 {
4751
engine,
52+
connection,
4853
manager,
4954
parent_uuid,
5055
uuid,
@@ -59,7 +64,13 @@ impl BlockdevR7 {
5964
parent_uuid: PoolUuid,
6065
uuid: DevUuid,
6166
) -> StratisResult<()> {
62-
let blockdev = Self::new(engine, manager.clone(), parent_uuid, uuid);
67+
let blockdev = Self::new(
68+
engine,
69+
Arc::clone(connection),
70+
manager.clone(),
71+
parent_uuid,
72+
uuid,
73+
);
6374

6475
connection.object_server().at(path, blockdev).await?;
6576
Ok(())
@@ -104,10 +115,13 @@ impl BlockdevR7 {
104115
async fn set_user_info(&self, value: (bool, String)) -> Result<(), zbus::Error> {
105116
set_blockdev_prop(
106117
&self.engine,
118+
&self.connection,
119+
&self.manager,
107120
self.parent_uuid,
108121
self.uuid,
109122
value,
110123
set_user_info_prop,
124+
send_user_info_signal_on_change,
111125
)
112126
.await
113127
}

0 commit comments

Comments
 (0)