Одновременный доступ для записи к файлу символьного устройства

При сжатии файловой системы resize2fsсначала проверяется, свободна ли та часть файловой системы, которая будет вырезана. Если нет, он может попытаться переместить эти файлы из области, которая будет вырезана, если для этого есть место. Если это невозможно сделать, он останавливается и сообщает об ошибке без сжатия файловой системы.

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

Но для драйвера файловой системы конец раздела будет жесткой стеной. Если файловая система не была сжата до того, как раздел был сжат, или раздел был случайно сжат больше, чем был раздел, часть файловой системы теперь будет отрезана от остальной части.

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

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

Но если системный администратор просто запустит проверку файловой системы в сжатом состоянии раздела, программа проверки файловой системы увидит, что есть файлы, которые продолжаются за пределами конца раздела, и скажет себе :«Давайте ампутируем ". Поскольку он принимает размер раздела как твердый факт, у него нет другого выбора, кроме как обрезать или удалить файлы, которые, кажется, выходят за пределы конца раздела. Именно здесь наносится настоящий ущерб. Метаданные файловой системы также потребуют некоторой корректировки, чтобы удалить пространство, выходящее за конец раздела, из «книг».

После завершения проверки файловой системы отрезанные -части файлов все еще находятся на физическом диске, за новым концом раздела, без изменений... но части файлов все еще находятся внутри файловой системы. теперь усечены в пни.

0
07.04.2021, 00:32
1 ответ

Глядя на исходный код ядра Linux 5.4.97, я вижу drivers/spi/spidev.c. В этом файле я вижу функцию, которая обрабатывает запросы на запись :

.
ssize_t
spidev_write(struct file *filp, const char __user *buf,
                size_t count, loff_t *f_pos)
{
        struct spidev_data      *spidev;
        ssize_t                 status = 0;
        unsigned long           missing;

        /* chipselect only toggles at start or end of operation */
        if (count > bufsiz)
                return -EMSGSIZE;

        spidev = filp->private_data;

        mutex_lock(&spidev->buf_lock);
        missing = copy_from_user(spidev->tx_buffer, buf, count);
        if (missing == 0)
                status = spidev_sync_write(spidev, count);
        else
                status = -EFAULT;
        mutex_unlock(&spidev->buf_lock);

        return status;
}

Обратите внимание на вызов mutex_lock()и mutex_unlock(). Процесс, вызывающий write()на символьном устройстве, захватит мьютекс, запишет все его данные, а затем разблокирует мьютекс. Если бы во время этого процесса появился какой-то другой модуль записи, этот модуль записи заблокировал бы вызов mutex_lock()до тех пор, пока существующий модуль записи не вызовет mutex_unlock().

Любому записывающему устройству гарантируется запись всего буфера без чередования с другими записывающими устройствами.

3
28.04.2021, 22:53

Теги

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