Test packages on Focal ===
Packages: ppa:mfo/test ---
sudo apt install ./kpartx_0.8.3-1ubuntu2.3_amd64.deb ./multipath-tools_0.8.3-1ubuntu2.3_amd64.deb ./multipath-tools-dbgsym_0.8.3-1ubuntu2.3_amd64.ddeb sudo systemctl restart multipathd.service
$ dpkg -s multipath-tools | grep Version: Version: 0.8.3-1ubuntu2.3
sudo gdb -p $(pidof multipathd) ... (gdb) b dm_get_map Breakpoint 1 at ... (gdb) c Thread 5 "multipathd" hit Breakpoint 1, dm_get_map (name=0x558d02dc6880 "mpatha", ...
(gdb) b dm_get_next_target Breakpoint 2 at ... (gdb) c Thread 5 "multipathd" hit Breakpoint 2, dm_get_next_target (...
(gdb) finish Run till exit from #0 dm_get_next_target (... Value returned is $1 = (void *) 0x0
(gdb) p params $2 = 0x7fef90004db0 "0 0 2 1 service-time 0 1 2 8:0 1 1 service-time 0 1 2 8:16 1 1 " (gdb) set params = 0 (gdb) p params $3 = 0x0
Now, NOTE the value returned from both functions (TWO, i.e., indicates "not-OK" with empty map parameters)
(gdb) finish Run till exit from #0 0x00007f490f4fc5cd in dm_get_map (name=0x55992f15c4d0 "mpatha", ... ... Value returned is $4 = 2
(gdb) p params $5 = '\000' <repeats 4095 times>
(gdb) finish Run till exit from #0 0x00007f490f5239ce in update_multipath_table (... ... Value returned is $6 = 2
(gdb) q
And this does not run disassemble_map(), as dm_get_map() now returns DMP_NOT_FOUND:
167 +enum { 168 + DMP_ERR, 169 + DMP_OK, 170 + DMP_NOT_FOUND, 171 +};
196 int 197 update_multipath_table (struct multipath *mpp, vector pathvec, int is_daemon) 198 { 199 int r = DMP_ERR; 200 char params[PARAMS_SIZE] = {0}; ... 205 r = dm_get_map(mpp->alias, &mpp->size, params); 206 if (r != DMP_OK) { ... 208 return r; ... 211 if (disassemble_map(pathvec, params, mpp, is_daemon)) { ... 213 return DMP_ERR; 214 } 215 216 return DMP_OK; 217 }
Test packages on Focal
===
Packages: ppa:mfo/test
---
sudo apt install ./kpartx_ 0.8.3-1ubuntu2. 3_amd64. deb ./multipath- tools_0. 8.3-1ubuntu2. 3_amd64. deb ./multipath- tools-dbgsym_ 0.8.3-1ubuntu2. 3_amd64. ddeb
sudo systemctl restart multipathd.service
$ dpkg -s multipath-tools | grep Version:
Version: 0.8.3-1ubuntu2.3
sudo gdb -p $(pidof multipathd) c6880 "mpatha", ...
...
(gdb) b dm_get_map
Breakpoint 1 at ...
(gdb) c
Thread 5 "multipathd" hit Breakpoint 1, dm_get_map (name=0x558d02d
(gdb) b dm_get_next_target
Breakpoint 2 at ...
(gdb) c
Thread 5 "multipathd" hit Breakpoint 2, dm_get_next_target (...
(gdb) finish
Run till exit from #0 dm_get_next_target (...
Value returned is $1 = (void *) 0x0
(gdb) p params
$2 = 0x7fef90004db0 "0 0 2 1 service-time 0 1 2 8:0 1 1 service-time 0 1 2 8:16 1 1 "
(gdb) set params = 0
(gdb) p params
$3 = 0x0
Now, NOTE the value returned from both functions
(TWO, i.e., indicates "not-OK" with empty map parameters)
(gdb) finish 5c4d0 "mpatha", ...
Run till exit from #0 0x00007f490f4fc5cd in dm_get_map (name=0x55992f1
...
Value returned is $4 = 2
(gdb) p params
$5 = '\000' <repeats 4095 times>
(gdb) finish multipath_ table (...
Run till exit from #0 0x00007f490f5239ce in update_
...
Value returned is $6 = 2
(gdb) q
And this does not run disassemble_map(), as dm_get_map() now returns DMP_NOT_FOUND:
167 +enum {
168 + DMP_ERR,
169 + DMP_OK,
170 + DMP_NOT_FOUND,
171 +};
196 int multipath_ table (struct multipath *mpp, vector pathvec, int is_daemon) map(mpp- >alias, &mpp->size, params); map(pathvec, params, mpp, is_daemon)) {
197 update_
198 {
199 int r = DMP_ERR;
200 char params[PARAMS_SIZE] = {0};
...
205 r = dm_get_
206 if (r != DMP_OK) {
...
208 return r;
...
211 if (disassemble_
...
213 return DMP_ERR;
214 }
215
216 return DMP_OK;
217 }