Создание и удаление каталогов и файлов в ядре Linux - PullRequest
0 голосов
/ 05 мая 2020

Я пишу модуль ядра Linux. Попутно создавайте каталоги:

/etc/data_stor/user/id/{0001}
/etc/data_stor/user/id/{0002}
/etc/data_stor/user/id/{0003}
/etc/data_stor/user/id/{0004}

Создайте такой же набор файлов в этих каталогах с именами Имя, Семья, Возраст и т. Д. c. и запишите туда необходимую информацию. Я создаю каталоги следующим образом:

const char* path = /etc/data_stor/user/id/{0001};
create_path(path);

static int dev_mkdir(const char *name, umode_t mode)
{
    struct dentry *dentry;
        struct path path;
        int err;

dentry = kern_path_create(AT_FDCWD, name, &path, LOOKUP_DIRECTORY);
if (IS_ERR(dentry))
    return PTR_ERR(dentry);

err = vfs_mkdir(d_inode(path.dentry), dentry, mode);
done_path_create(&path, dentry);
return err;
}

static int create_path(const char *nodepath)

{
    char *path;
    char *s;
    int err = 0;



path = kstrdup(nodepath, GFP_KERNEL);
if (!path)
    return -ENOMEM;

s = path;
for (;;) {
    s = strchr(s, '/');
    if (!s)
        break;
    s[0] = '\0';
    err = dev_mkdir(path, 0777);
    if (err && err != -EEXIST)
        break;
    s[0] = '/';
    s++;
}
kfree(path);
return err;
} 

И создаю файлы по функциям:

hFile = filp_open(Path, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);

if (IS_ERR(hFile))
{
    printk("write_dword open file failed %s %ld\n", Path, PTR_ERR(hFile));
    return PTR_ERR(hFile);
}
kernel_write(hFile, data, sizeof(DWORD), &foff);

filp_close(hFile, 0);

Каталоги и информационные файлы успешно созданы, но есть некоторые проблемы:

  1. При ручном удалении директорий с файлами из файлового менеджера система иногда дает сбой (ядро c).
  2. При попытке прочитать информацию из некоторых файлов функция filp_open возвращает - Ошибка ENOENT. Файл или каталог не найдены, хотя они присутствуют.

Также требуется удалить все каталоги при появлении запроса в пользовательском режиме. Я написал функцию, но она удаляет только пустой каталог, т.е. в нем не должно быть файлов.

Прошу вас помочь с этими вопросами, объяснить, в каком направлении двигаться, или привести конкретный пример c или литература.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...