Получить Inotify, чтобы правильно генерировать событие IN_UNMOUNT - PullRequest
4 голосов
/ 19 марта 2011

Здравствуйте. Я пытался заставить Inotify выдать событие IN_UNMOUNT, но оно вообще не взаимодействует со мной, поэтому я пошел и провел простой эксперимент с inotifywait, и вот результат ниже:

paul@imaskar ~ $ inotifywait -r /storage/test/ -m
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
/storage/test/ CREATE,ISDIR a
/storage/test/ OPEN,ISDIR a
/storage/test/ CLOSE_NOWRITE,CLOSE,ISDIR a
/storage/test/ DELETE,ISDIR a
/storage/test/a/ DELETE_SELF 
/storage/test/a/ IGNORED 
/storage/test/ IGNORED 

В основном, что происходит, он подхватывает все другие события, такие как создание, открытие и т. Д. .... но когда я отключил / storage / test / , он выдаст IGNORED для всех созданных часов, но никогда не генерирует событие UNMOUNT ...

Похоже, я не могу получить событие IN_UNMOUNT, но во всей прочитанной документации по inotify сказано, что ядро ​​добавит битовый флаг IN_UNMOUNT к событию, когда отслеживаемое хранилище файлов / каталогов было размонтировано. ..

Вот простой код C из - Патч Inotify

#include <stdio.h>
#include <stdlib.h>
#include <sys/inotify.h>

int main(int argc, char **argv)
{
        char buf[1024];
        struct inotify_event *ie;
        char *p;
        int i;
        ssize_t l;

        p = argv[1];
        i = inotify_init();
        inotify_add_watch(i, p, ~0);

        l = read(i, buf, sizeof(buf));
        printf("read %d bytes\n", l);
        ie = (struct inotify_event *) buf;
        printf("event mask: %x\n", ie->mask);
    return 0;
}

В любом случае я сделал следующие шаги:

gcc -oinotify inotify.c
mkdir mnt
sudo mount -ttmpfs none mnt
mkdir mnt/d
./inotify mnt/d/

# Different shell
sudo umount mnt

И, наконец, вот что он излучает

read 16 bytes
event mask: 8000

Так что на данный момент я не уверен, что проблема в коде или что-то еще?

1 Ответ

4 голосов
/ 18 мая 2011

Похоже, что это ошибка ядра, которая была исправлена ​​согласно LKML .Примерно, начиная с ядра 2.6.31, событие IN_UNMOUNT не отправлялось при отключении инодов ... Этот патч был для "34-longterm", то есть ядра 2.6.35 (?).

В любом случае мне удалось обновитьв ядро ​​2.6.37 и повторно запустили вышеупомянутые тесты, и вот результаты:

mkdir mnt
sudo mount -ttmpfs none mnt
mkdir mnt/d
inotifywait -r mnt/d/ -m


# Different shell
sudo umount mnt

И вот вывод:

Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
/tmp/test/d/ UNMOUNT 
/tmp/test/d/ IGNORED 
/tmp/test/ UNMOUNT 
/tmp/test/ IGNORED 

А в соответствии с примером кода C вот вывод:

read 32 bytes
event mask: 2000

И, глядя на заголовки inotify.h, это правильная маска события для флага IN_UNMOUNT, так что это означает, что он окончательно зафиксирован ~ 2.6.35 или более поздний ...

...