Есть флешка, есть ссд, есть хдд.
Эксперимент номер 1: Когда пишем флешку примонтированную с «flush» и без O_SYNC - ядро набирает весь файл в dirty_cache, а потом при close приходит «flush»(благодаря моунт опции) и видим прогресс бар, который 0 -> 100% сделал незаметно для глаза и на 100% висит пол дня.
Эксперимент номер 2: Пишем ту же флешку тока с ::open(..., O_SYNC | ...) учитывая хардварный чанк который она может принять за одну отправку. Моя флешка может принять 1 мегабайт. Херачим чанками read -> write по метру и видим адекватный прогресс бар и адекватную скорость.
Эксперимент номер 3: Берём ssd без моунт опции flush и без O_SYNC - ядро нихера не диртикешит весь файл за один мах, и прогресс бар ведёт себя адекватно. С хдд та же фигня.
Отсюдова вопрос, ватзефак? По каким признакам ядро так не любит выдёргиваемые устройства? Как убедить ядро накапливать для моей флешки 1 мегабайт и отсылать на запись, а не принимать 100500 врайтов за 10ms, а потом проталкивать в панике грязные страницы в девайс? Причем, если выкрутить в минимум dirty_cache(при котором не перестают виснуть, схерато(??), десктопные приложения) то соответственно прогресс бар ведёт себя почти адекватно. Чуток разогнавшись, на те свои 50 мегабайт диртикеша, и дальше запись идёт как обычно до конца файла, ну и потом на close чуть висит пока допишет свои 50 мегабайт.
Че крутить, куда копать? Можно конечно в моих кедах накостылить в kio проверку и добавлять к определённым ::open опцию O_SYNC(что я сейчас и сделал), тогда адекватность присутствует, но хотелось бы в корне решить этот вопрос. Колупание сырцов ядра откладываю на самый последний вариант.