LINUX.ORG.RU

История изменений

Исправление 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);