История изменений
Исправление arhiv_6, (текущая версия) :
vfs_test_lock попробовал. Статус всегда F_UNLCK.
в kernel space:
ssize_t my_driver_write (struct file *filp, const char __user *data, size_t size, loff_t *pos)
{
struct file_lock fl;
if (vfs_test_lock(filp, &fl) return -1;
if (fl->fl_type == F_UNLCK)
printk(KERN_ALERT "file unlocked");
else
printk(KERN_ALERT "file locked");
return 0;
}
в user space:
int fd = open(my_device, O_RDWR)
printf("write: %d\n", write(fd, data, 1)); // выдаёт "file unlocked"
if (flock(fd, LOCK_EX)) printf("error\n");
printf("write: %d\n", write(fd, data, 1)); // выдаёт "file unlocked", хотя ожидаю "file locked"
if (flock(fd, LOCK_UN)) printf("error\n");
close(fd);
Похоже, вот почему: https://stackoverflow.com/a/42884966/9710442
Как быть? Пока вот что придумал: в модуле добавить свой обработчик для int (*flock) (struct file *, int, struct file_lock *)
. Передаваемый в него fl->fl_type
правильный (проверил), могу его сохранить в filp->private_data
и потом проверять в write/read. Как из него вызвать обработчик flock «по-умолчанию», т.е. тот, который используется когда в «struct file_operations» не задаётся?
Исправление arhiv_6, :
vfs_test_lock попробовал. Статус всегда F_UNLCK.
в kernel space:
ssize_t my_driver_write (struct file *filp, const char __user *data, size_t size, loff_t *pos)
{
struct file_lock fl;
if (vfs_test_lock(filp, &fl) return -1;
if (fl->fl_type == F_UNLCK)
printk(KERN_ALERT "file unlocked");
else
printk(KERN_ALERT "file locked");
return 0;
}
в user space:
int fd = open(my_device, O_RDWR)
printf("write: %d\n", write(fd, data, 1)); // выдаёт "file unlocked"
if (flock(fd, LOCK_EX)) printf("error\n");
printf("write: %d\n", write(fd, data, 1)); // выдаёт "file unlocked", хотя ожидаю "file locked"
if (flock(fd, LOCK_UN)) printf("error\n");
close(fd);
Похоже, вот почему: https://stackoverflow.com/a/42884966/9710442
Как быть? Пока вот что придумал: в модуле добавить свой обработчик для int (*flock) (struct file *, int, struct file_lock *)
. Передаваемый в него fl->fl_type
правильный (проверил), могу его сохранить в filp->private_data
. Как из него вызвать обработчик flock «по-умолчанию», т.е. тот, который используется когда в «struct file_operations» не задаётся?
Исправление arhiv_6, :
vfs_test_lock попробовал. Статус всегда F_UNLCK.
в kernel space:
ssize_t my_driver_write (struct file *filp, const char __user *data, size_t size, loff_t *pos)
{
struct file_lock fl;
if (vfs_test_lock(filp, &fl) return -1;
if (fl->fl_type == F_UNLCK)
printk(KERN_ALERT "file unlocked");
else
printk(KERN_ALERT "file locked");
return 0;
}
в user space:
int fd = open(my_device, O_RDWR)
printf("write: %d\n", write(fd, data, 1)); // выдаёт "file unlocked"
if (flock(fd, LOCK_EX)) printf("error\n");
printf("write: %d\n", write(fd, data, 1)); // выдаёт "file unlocked", хотя ожидаю "file locked"
if (flock(fd, LOCK_UN)) printf("error\n");
close(fd);
Похоже, вот почему: https://stackoverflow.com/a/42884966/9710442
Как быть? Пока вот что придумал: в модуле добавить свой обработчик для int (*flock) (struct file *, int, struct file_lock *)
. Передаваемый в него fl->fl_type
правильный (проверил). Как из него вызвать обработчик flock «по-умолчанию», т.е. тот, который используется когда в «struct file_operations» не задаётся?
Исправление arhiv_6, :
vfs_test_lock попробовал. Статус всегда F_UNLCK.
в kernel space:
ssize_t my_driver_write (struct file *filp, const char __user *data, size_t size, loff_t *pos)
{
struct file_lock fl;
if (vfs_test_lock(filp, &fl) return -1;
if (fl->fl_type == F_UNLCK)
printk(KERN_ALERT "file unlocked");
else
printk(KERN_ALERT "file locked");
return 0;
}
в user space:
int fd = open(my_device, O_RDWR)
printf("write: %d\n", write(fd, data, 1)); // выдаёт "file unlocked"
if (flock(fd, LOCK_EX)) printf("error\n");
printf("write: %d\n", write(fd, data, 1)); // выдаёт "file unlocked", хотя ожидаю "file locked"
if (flock(fd, LOCK_UN)) printf("error\n");
close(fd);
Исходная версия arhiv_6, :
vfs_test_lock попробовал. Статус всегда F_UNLCK.
ssize_t my_driver_write (struct file *filp, const char __user *data, size_t size, loff_t *pos)
{
struct file_lock fl;
if (vfs_test_lock(filp, &fl) return -1;
if (fl->fl_type == F_UNLCK)
printk(KERN_ALERT "file unlocked");
else
printk(KERN_ALERT "file locked");
return 0;
}
int fd = open(my_device, O_RDWR)
printf("write: %d\n", write(fd, data, 1)); // выдаёт "file unlocked"
if (flock(fd, LOCK_EX)) printf("error\n");
printf("write: %d\n", write(fd, data, 1)); // выдаёт "file unlocked", хотя ожидаю "file locked"
if (flock(fd, LOCK_UN)) printf("error\n");
close(fd);