Гарантируется ли, что вложенные файловые системы синхронизируются перед содержащими файловыми системами с помощью sync ( 1)?

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

4
21.06.2018, 09:04
2 ответа

Да, это гарантировано.
Вы явно не указываете, как вы работаете с вложенной файловой системой, но я предполагаю, что вы используете блочное устройство обратной связи.

В этом случае бит ключа можно увидеть здесь в исходном коде ядра:

static int lo_req_flush(struct loop_device *lo, struct request *rq)
{
    struct file *file = lo->lo_backing_file;
    int ret = vfs_fsync(file, 0);
    if (unlikely(ret && ret != -EINVAL))
        ret = -EIO;

    return ret;
}

Обратите внимание на вызов vfs_fsync(file, 0). Это означает, что драйвер обратной связи явно вызывает синхронизацию файла, который поддерживает блочное устройство обратной связи.

3
27.01.2020, 20:57

В заказе нет гранта, но наиболее вероятным способом является то, что ядро ​​проходит через таблицу монтирования при вызове sync(2). Этот метод используется в Solaris и, скорее всего, в Linux.

Похоже, это то, что вам не нравится, поэтому в вашем случае должно выполняться нечто большее, чем вызов синхронизации.

0
27.01.2020, 20:57

Теги

Похожие вопросы