>зачем? все делается на vfs уровне, макс - на geom, сползания в
>umass точно не надо.
>зачем трогать BO_SYNC когда это только одна часть проблемы?
>запис по любому пойдет через BO_WRITE где и проще проверить флаги устройства
>и проще имитировать нормально завершившиюся запись.
>
GEOM трогать однозначно не надо, зачем ему костыль от VFS. Если следовать вашей логике,
то добавить проверку на вид ошибки в bufstrategy, однако появляется проблема как отследить
точку монтирования которая должна быть переведена в RO. Можно через buf->b_vp.v_mount, это не трудно, можно глобальным поиском в mountlist))) Это для извращенцев и руткито писателей: mtx_lock(&mountlist_mtx);
TAILQ_FOREACH_REVERSE(mp, &mountlist, mntlist, mnt_list) {
if (strcmp(mp->mnt_stat.f_mntfromname, DEV) == 0) {
printf("name = %s\n", mp->mnt_stat.f_mntfromname);
break;
}
}
mtx_unlock(&mountlist_mtx);
Почему bufstrategy??? Ошибки чтения тоже имеют тот же код ENXIO, устройство не сконфигурировано, поскольку провайдер geom сдох, все операции будут идти через эту функцию.
Я думаю что это хороший способ и я его реализую, если конечно не возникнет гемороя с отдельными файловыми системами, И если все ресурсы будут освобождаться правильно в VFS, еще не известно как поведут себя вноды с грязными буферами, точно можно будет сказать только при непосредственном эксперементе, ядро фряхи это потемки)))