mirror of
https://gitlab.com/chrony/chrony.git
synced 2025-12-03 16:35:06 -05:00
refclock_phc: open device for writing with extpps option
In version 6.15 the Linux kernel started checking write access on the PHC file descriptor in the PTP_PIN_SETFUNC and PTP_EXTTS_REQUEST ioctls. chronyd opened the PHC device as readonly, which caused the PHC refclock driver configured with the extpps option to fail with the "Could not enable external PHC timestamping" error message. To ensure compatibility with new kernel versions, add flags to the SYS_Linux_OpenPHC() function and open the device with the O_RDWR flag when the extpps option is enabled.
This commit is contained in:
@@ -66,7 +66,7 @@ static int phc_initialise(RCL_Instance instance)
|
||||
{
|
||||
const char *options[] = {"nocrossts", "extpps", "pin", "channel", "clear", NULL};
|
||||
struct phc_instance *phc;
|
||||
int phc_fd, rising_edge;
|
||||
int rising_edge;
|
||||
struct stat st;
|
||||
char *path, *s;
|
||||
|
||||
@@ -74,19 +74,20 @@ static int phc_initialise(RCL_Instance instance)
|
||||
|
||||
path = RCL_GetDriverParameter(instance);
|
||||
|
||||
phc_fd = SYS_Linux_OpenPHC(path);
|
||||
if (phc_fd < 0)
|
||||
LOG_FATAL("Could not open PHC");
|
||||
|
||||
phc = MallocNew(struct phc_instance);
|
||||
phc->fd = phc_fd;
|
||||
if (fstat(phc_fd, &st) < 0 || !S_ISCHR(st.st_mode))
|
||||
LOG_FATAL("Could not get PHC index");
|
||||
phc->dev_index = minor(st.st_rdev);
|
||||
phc->mode = 0;
|
||||
phc->nocrossts = RCL_GetDriverOption(instance, "nocrossts") ? 1 : 0;
|
||||
phc->extpps = RCL_GetDriverOption(instance, "extpps") ? 1 : 0;
|
||||
UTI_ZeroTimespec(&phc->last_extts);
|
||||
|
||||
phc->fd = SYS_Linux_OpenPHC(path, phc->extpps ? O_RDWR : O_RDONLY);
|
||||
if (phc->fd < 0)
|
||||
LOG_FATAL("Could not open PHC");
|
||||
|
||||
if (fstat(phc->fd, &st) < 0 || !S_ISCHR(st.st_mode))
|
||||
LOG_FATAL("Could not get PHC index");
|
||||
phc->dev_index = minor(st.st_rdev);
|
||||
|
||||
phc->clock = HCL_CreateInstance(0, 16, UTI_Log2ToDouble(RCL_GetDriverPoll(instance)),
|
||||
RCL_GetPrecision(instance));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user