Ошибки файловой системы

Drive subsystem, filesystem drivers
  • Ну это я потом поправлю (размер буфера шелл), тем более еще нашлось несколько проблемок с шелл.

    Но, похоже, что при массовых системных операциях (у меня - файловых, у Акрона - создания кнопок), в системе отваливаются кнопки - старые не реагируют, новые не создаются. И меню рисуется абы как.

    Будем воспроизводить.

    1я попытка копирования 922Мб файла шелом завершилась провалом на примерно 512Мб - ошибка копирования и вышеописанный песец системы.

    2я попытка прошла успешно (сразу после перезагрузки) и без последствий. Заняла в фоне примерно 4ч15 минут, загрузка CPU была 3-5%
    Тестирование копии прошло успешно unzip -t file.zip - повреждений нет

    Кстати, вот пример скрипта для засечек времени
    Spoiler:#SHS
    cd /usbhd0/1/programs
    date
    echo unzip started
    unzip cmake -d/hd0/1/cmt
    waitfor
    date
  • Поправленная версия shell копирует тот же файл за 4м:20с

    Тем не менее, программы, которые пишут мелкими кусками (unzip etc), будут работать все также медленно, без отложенного кэша записи.
  • В 60 раз быстрее. :lol:

    Но всё равно медленно. Какой размер буфера?
  • Буфер 1Mb, но не более половины свободной памяти (уменьшаем при нехватке с шагом :2)

    Для виртуалки нормальная скорость - в сравнении KFM примерно одинаково.
  • 0CodErr wrote:Размер должен возвращаться.
    Pathoswithin wrote:Ну так я мог бы исправить документацию вместо кода. :wink:
    Ну так ты всё же понял для чего это нужно?
    Судя по сообщению в чате, похоже понял
    Pathoswithin « Пн фев 06, 2017 8:33 pm » В документации написано "Если файлы в папке кончились раньше, чем было прочитано запрошенное количество, то функция прочитает, сколько сможет, после чего вернёт eax=6".
  • *facepalm* Там про файл, а там про папку, чему ты это вообще...
  • Мдам.. похоже ты всё-таки не понял :)

    С файлом аналогично. Только вместо количества блоков будет количество прочитанных/записанных байтов.
  • У папки количество блоков находится в БДВК, а в ebx только дублируется. Папка всегда читается полностью, не зависимо от количества запрошенных блоков, потому есть смысл попробовать прочитать какое-то количество наугад. При чтении файла в статический буфер тоже можно так сделать, но обычно сначала нужно узнать его размер. При записи в файл достаточно проверить наличие ошибки.
  • Pathoswithin wrote:У папки количество блоков находится в БДВК, а в ebx только дублируется. Папка всегда читается полностью, не зависимо от количества запрошенных блоков, потому есть смысл попробовать прочитать какое-то количество наугад. При чтении файла в статический буфер тоже можно так сделать, но обычно сначала нужно узнать его размер. При записи в файл достаточно проверить наличие ошибки.
    "При чтении файла в статический буфер тоже можно так сделать, но обычно сначала нужно узнать его размер." - Узнаётся из записи файла в ФС, причём любой ФС.
    "При записи в файл достаточно проверить наличие ошибки." - Какой? - Записался/Не дописался/Не записался/...
    Программист не тот, кто постоянно пишет КОД, а тот кто сможет понять чужой КОД!!!
  • Pathoswithin wrote:У папки количество блоков находится в БДВК, а в ebx только дублируется.
    КЭП? :mrgreen: А вот для файлов оно не дублируется.
    Pathoswithin wrote:есть смысл попробовать прочитать какое-то количество наугад
    :shock:
    Pathoswithin wrote:сначала нужно узнать его размер
    Дополнительный системный вызов?

    Ты когда-нибудь занимался обработкой файлов? Вполне типичные примеры:

    Code: Select all

    While BytesRead > 0 Do ... ;

    Code: Select all

    Repeat  
      ..............
      ReadFile ... ;  
      ..............
    Until (BytesRead < ReadBufferSize);  
    Можно читать While Not EOF, EOF будет означать, что прочитан последний кусок, но он не обязан быть равным размеру буфера. Вот в ebx и возвращается BytesRead.
  • Ну а при записи в файл достаточно проверить наличие ошибки. Что не так?
  • С одной стороны, насколько знаю, у нас сейчас в KolibriOS или записано всё, или ничего. Будет ли оно так всегда?
    Но с другой, вообще попадаются исходники в сети, в которых идёт проверка if bytesWritten < ...
    Наткнулся ещё на https://www.linux.org.ru/news/opensourc ... quote]Если ваша файловая система возвращает ENOSPC при закрытии файла через вызов close(), а не при записи в него через write() ...[/quote]Но у нас сейчас нет дескрипторов. Вроде сейчас такой проблемы в KolibriOS нет?
  • Что поменялось с работой с путями в нескольких последних ревизиях?

    unzip перестал находить файл архива, если я шелл запускаю с флэшки
    при этом
    pwd
    /<сердечко>/usbhd0/1/PROGRAMS - заглавными

    если я делаю пару смен каталога - на другой диск и обратно - сердечко и заглавные буквы из pwd пропадают и все работает

    похоже, проблема в сердечке, заглавные буквы не влияют

    флешка - FAT

    но самому шеллу сердечко не мешает
  • В последних ревизиях я курочил только ext.
  • Who is online

    Users browsing this forum: No registered users and 6 guests