@@ -86,17 +86,43 @@ pub fn encrypt_pool(m: &MethodInfo<'_, MTSync<TData>, TData>) -> MethodResult {
8686 return_message
8787 ) ;
8888
89- let mut guard = get_mut_pool ! ( dbus_context. engine; pool_uuid; default_return; return_message) ;
90- let ( name, _, pool) = guard. as_mut_tuple ( ) ;
91-
92- let result = handle_action ! (
93- pool. encrypt_pool( & name, pool_uuid, & ei) ,
89+ let read_guard = get_pool ! ( dbus_context. engine; pool_uuid; default_return; return_message) ;
90+
91+ // Check if operation is idempotent and complete all operations before handling result
92+ let create_result = handle_action ! (
93+ read_guard. encrypt_pool_idem_check( )
94+ . and_then( |action| match action {
95+ CreateAction :: Identity => Ok ( action) ,
96+ CreateAction :: Created ( _) => {
97+ let mut guard = block_on( dbus_context. engine. upgrade_pool( read_guard) ) ;
98+ let result = guard. start_encrypt_pool( pool_uuid, & ei) ;
99+ let result = result. and_then( |( sector_size, key_info) | {
100+ let guard = guard. downgrade( ) ;
101+ guard
102+ . do_encrypt_pool( pool_uuid, sector_size, key_info)
103+ . map( |_| guard)
104+ } ) ;
105+ let result = result. and_then( |guard| {
106+ let mut guard = block_on( dbus_context. engine. upgrade_pool( guard) ) ;
107+ let ( name, _, _) = guard. as_mut_tuple( ) ;
108+ guard
109+ . finish_encrypt_pool( & name, pool_uuid)
110+ . map( |_| ( guard, action) )
111+ } ) ;
112+ result. map( |( _, action) | action)
113+ }
114+ } ) ,
94115 dbus_context,
95116 pool_path. get_name( )
96117 ) ;
97- let msg = match result {
118+
119+ let msg = match create_result {
120+ Ok ( CreateAction :: Identity ) => {
121+ return_message. append3 ( default_return, DbusErrorEnum :: OK as u16 , OK_STRING . to_string ( ) )
122+ }
98123 Ok ( CreateAction :: Created ( _) ) => {
99- let encryption_info = match pool. encryption_info ( ) . clone ( ) {
124+ let guard = get_pool ! ( dbus_context. engine; pool_uuid; default_return; return_message) ;
125+ let encryption_info = match guard. encryption_info ( ) . clone ( ) {
100126 Some ( Either :: Left ( ei) ) => ei,
101127 Some ( Either :: Right ( _) ) => {
102128 unreachable ! ( "online reencryption disabled on metadata V1" )
@@ -118,9 +144,6 @@ pub fn encrypt_pool(m: &MethodInfo<'_, MTSync<TData>, TData>) -> MethodResult {
118144 dbus_context. push_pool_encryption_status_change ( pool_path. get_name ( ) , true ) ;
119145 return_message. append3 ( true , DbusErrorEnum :: OK as u16 , OK_STRING . to_string ( ) )
120146 }
121- Ok ( CreateAction :: Identity ) => {
122- return_message. append3 ( false , DbusErrorEnum :: OK as u16 , OK_STRING . to_string ( ) )
123- }
124147 Err ( err) => {
125148 let ( rc, rs) = engine_to_dbus_err_tuple ( & err) ;
126149 return_message. append3 ( default_return, rc, rs)
0 commit comments