master/ioctl.c: FIX -- more points where io_sem must be locked

Experienced corruption of master->datagram_queue because ecrt_domain_queue()
(when called from ioctl) does not hold the io_sem!
This commit is contained in:
till straumann 2021-11-04 13:50:55 +01:00
parent 5437ec4ef1
commit f4e3a92352
1 changed files with 12 additions and 0 deletions

View File

@ -2022,7 +2022,9 @@ static ATTRIBUTES int ec_ioctl_sync_ref(
return -EPERM;
}
down( & master->io_sem );
ecrt_master_sync_reference_clock(master);
up( & master->io_sem );
return 0;
}
@ -2047,7 +2049,9 @@ static ATTRIBUTES int ec_ioctl_sync_ref_to(
return -EFAULT;
}
down( & master->io_sem );
ecrt_master_sync_reference_clock_to(master, time);
up( & master->io_sem );
return 0;
}
@ -2067,7 +2071,9 @@ static ATTRIBUTES int ec_ioctl_sync_slaves(
return -EPERM;
}
down( & master->io_sem );
ecrt_master_sync_slave_clocks(master);
up( & master->io_sem );
return 0;
}
@ -2118,7 +2124,9 @@ static ATTRIBUTES int ec_ioctl_sync_mon_queue(
return -EPERM;
}
down( & master->io_sem );
ecrt_master_sync_monitor_queue(master);
up( & master->io_sem );
return 0;
}
@ -3181,7 +3189,9 @@ static ATTRIBUTES int ec_ioctl_domain_queue(
return -ENOENT;
}
down( & master->io_sem );
ecrt_domain_queue(domain);
up( & master->io_sem );
return 0;
}
@ -3899,7 +3909,9 @@ static ATTRIBUTES int ec_ioctl_voe_exec(
return -ENOENT;
}
down( & master->io_sem );
data.state = ecrt_voe_handler_execute(voe);
up( & master->io_sem );
if (data.state == EC_REQUEST_SUCCESS && voe->dir == EC_DIR_INPUT)
data.size = ecrt_voe_handler_data_size(voe);
else