The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"patch for FreeBSD 6.2"
Отправлено 3bepb, 17-Май-07 11:59 
Все досконально объяснять не буду слишком много печатать, поверхностно поясняю)))
Проблема была в синхронизации грязных буферов vnode, с устройством. Ну разумеется суперблок тоже не мог записаться.
Исправлению подверглась функция bufobj_invalbuf, причем минимально. Паника возникала от того что при попытке отмонтировать флеш карту вызывалась функция vflush, и от того что демон синхронизации пытался записать на это устройство. Функция делала попытку завершить все опереции ввода выводы с буферами внодов, но число этих буферов не уменьшалось, хобя поток geom g_up ошибку сразу не возвращал, просто число не завершенных операций было бльше нуля, но это не повод для паники в принципе, просто необходимо было очистить списки буфуров bufobj внода без флага V_SAFE, вот патч

--- /home/arch_kern_files_2/vfs_subr.c    Mon Dec  4 17:47:53 2006
+++ /sys/kern/vfs_subr.c    Thu May 17 11:46:32 2007
@@ -1029,8 +1029,10 @@
             * enabled under INVARIANTS
             */
            BO_LOCK(bo);
-            if (bo->bo_numoutput > 0 || bo->bo_dirty.bv_cnt > 0)
-                panic("vinvalbuf: dirty bufs");
+            if (bo->bo_numoutput > 0 || bo->bo_dirty.bv_cnt > 0) {
+                printf("bufobj_invalbuf: warning panic not run, error=%d\n", error);
+                flags = 0;
+            }
        }
    }
    /*


следующая проблема в процедурах unmount файловых систем, причем все они реализованы по разному и ведут себя совершенно не предсказуемо с точки зрения возвращения ошибок, если ufs возвращало код глобальной ошибки после попытки синхронизации с процедуры dounmount, то msdosfs этого не делало, в общем ufs не трогал а msdosfs поправил немножко
патчи

--- /home/arch_kern_files_2/msdosfs_vfsops.c    Wed Dec 20 12:05:30 2006
+++ /sys/fs/msdosfs/msdosfs_vfsops.c    Wed May 16 21:24:03 2007
@@ -766,8 +766,10 @@
    /* If the volume was mounted read/write, mark it clean now. */
    if ((pmp->pm_flags & MSDOSFSMNT_RONLY) == 0) {
        error = markvoldirty(pmp, 0);
-        if (error && (flags & FORCECLOSE) == 0)
+        if (error && (flags & FORCECLOSE) == 0 && (error & ENXIO) == 0)
            return (error);
+        if (error & ENXIO)
+            error = 0;
    }
#ifdef MSDOSFS_DEBUG
    {


также в msdos была ошибка при выводе информации о не записанных секторах патч

--- /home/arch_kern_files_2/msdosfs_vnops.c    Mon Mar 13 12:05:13 2006
+++ /sys/fs/msdosfs/msdosfs_vnops.c    Thu May 17 11:44:23 2007
@@ -1834,7 +1834,9 @@

    printf("\tstartcluster %lu, dircluster %lu, diroffset %lu, ",
           dep->de_StartCluster, dep->de_dirclust, dep->de_diroffset);
-    printf("on dev %s\n", devtoname(dep->de_dev));
+    if (dep->de_dev != NULL) {
+        printf("on dev %s\n", devtoname(dep->de_dev));
+    }
    return (0);
}

НУ и процедура dounmount тоже немного поменялась, ПРИЧЕМ ПОДЧЕРКИВАЮ ЭТО НЕ ТУПАЯ ПОПЫТКА ИЗБЕЖАТЬ ПАНИКИ это все делалось с тонким расчетом и желанием как можно меньше менять в ядре
патч

--- /home/arch_kern_files_2/vfs_mount.c    Wed Oct 25 01:02:39 2006
+++ /sys/kern/vfs_mount.c    Thu May 17 11:48:49 2007
@@ -1194,6 +1194,10 @@
        (flags & MNT_FORCE)) {
        error = VFS_UNMOUNT(mp, flags, td);
    }
+    if (error & ENXIO) {
+        printf("dounmount: error=%d\n", error);
+        error = VFS_UNMOUNT(mp, 0, td);
+    }
    vn_finished_write(mp);
    if (error) {
        /* Undo cdir/rdir and rootvnode changes made above. */

Ориентировался я по номерам глобальных ошибок которые возвращались после операции io

Заценивайте...

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
  Введите код, изображенный на картинке: КОД
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру