Zfs: رمز مشبوه في dsl_scan_ds_clone_swapped ، المتعلق بالمسح المتسلسل

تم إنشاؤها على ٨ أغسطس ٢٠١٩  ·  3تعليقات  ·  مصدر: openzfs/zfs

آسف لعدم اتباع القالب.
تم العثور على هذه المشكلة _ المحتملة من خلال مراجعة التعليمات البرمجية.
الكود المعني:
ج
if (scan_ds_queue_contains (scn، ds1-> ds_object، & mintxg)) {
scan_ds_queue_remove (scn ، ds1-> ds_object) ؛
scan_ds_queue_insert (scn ، ds2-> ds_object ، mintxg) ؛
}
if (scan_ds_queue_contains (scn، ds2-> ds_object، & mintxg)) {
scan_ds_queue_remove (scn ، ds2-> ds_object) ؛
scan_ds_queue_insert (scn ، ds1-> ds_object ، mintxg) ؛
}
""

أرى مشكلتين محتملتين.

إذا كان الشرط الأول صحيحًا ، فسيكون الشرط الثاني دائمًا صحيحًا أيضًا.
هذا لأن الكتلة الأولى تستبدل ds1->ds_object بـ ds2->ds_object في قائمة الانتظار.
لذا ، فإن الكتلة الثانية ستقوم باستبدال عكسي.
أشعر أنه من غير المحتمل أن يكون هذا هو السلوك المقصود.

أيضًا ، أعتقد أنه من الممكن أن يكون كلا من ds1->ds_object و ds2->ds_object موجودًا بالفعل في قائمة الانتظار. إذا كان الأمر كذلك ، فسيحاول الرمز إجراء إدراج مكرر.

ربما يجب أن يتحقق الرمز أولاً مما إذا كانت معرفات الكائنات موجودة في قائمة الانتظار وتذكر النتائج.
ثم قم بإجراء عمليات الإزالة الضرورية (إذا كان أي من المعرّفين موجودًا ، فيجب إزالة كلا المعرّفين؟).
ثم قم بإجراء عمليات الإدراج الضرورية (أدخل المعرف الآخر لكل معرف موجود أصلاً).

CC:ahrenstcaputi

التعليق الأكثر فائدة

مرحبًا بالجميع - متابعة فقط. هذه ليست قضية نظرية. يحدث بدون الإصلاح. لذا شكرا للاعتناء بها!

VERIFY3(avl_find(&scn->scn_queue, sds, &where) == ((void *)0)) failed (00000000185a2639 ==           (null))
2020-05-26T11:59:00.867230+00:00 kern.emerg usw2-bfyii-307 kernel: [6444694.715839] PANIC at dsl_scan.c:1101:scan_ds_queue_insert()

      1 7ddba5456e65ef9403f3e1c6d4ae2eb9  /proc/23127/stack
[<0>] spl_panic+0xfa/0x110 [spl]
[<0>] scan_ds_queue_insert+0x8e/0xc0 [zfs]
[<0>] dsl_scan_ds_clone_swapped+0x2dc/0x3c0 [zfs]
[<0>] dsl_dataset_clone_swap_sync_impl+0x9a2/0xa50 [zfs]
[<0>] dmu_recv_end_sync+0xd7/0x480 [zfs]
[<0>] dsl_sync_task_sync+0x11c/0x120 [zfs]
[<0>] dsl_pool_sync+0x295/0x340 [zfs]
[<0>] spa_sync+0x3d6/0x8c0 [zfs]
[<0>] txg_sync_thread+0x29b/0x340 [zfs]
[<0>] thread_generic_wrapper+0x74/0x90 [spl]
[<0>] kthread+0x105/0x140
[<0>] ret_from_fork+0x35/0x40
[<0>] 0xffffffffffffffff

ال 3 كومينتر

أعتقد أن خطأ FreeBSD 239566 هو نفس المشكلة. يحدث هذا الانهيار عندما يكون كل من ds1 و ds2 قائمة الانتظار بالفعل عندما يتم استدعاء dsl_scan_ds_clone_swapped() .

أعتقد أنك على صواب. ربما يجب أن يكون لدينا فقط عبارات if / else منفصلة لكل حالة.

مرحبًا بالجميع - متابعة فقط. هذه ليست قضية نظرية. يحدث بدون الإصلاح. لذا شكرا للاعتناء بها!

VERIFY3(avl_find(&scn->scn_queue, sds, &where) == ((void *)0)) failed (00000000185a2639 ==           (null))
2020-05-26T11:59:00.867230+00:00 kern.emerg usw2-bfyii-307 kernel: [6444694.715839] PANIC at dsl_scan.c:1101:scan_ds_queue_insert()

      1 7ddba5456e65ef9403f3e1c6d4ae2eb9  /proc/23127/stack
[<0>] spl_panic+0xfa/0x110 [spl]
[<0>] scan_ds_queue_insert+0x8e/0xc0 [zfs]
[<0>] dsl_scan_ds_clone_swapped+0x2dc/0x3c0 [zfs]
[<0>] dsl_dataset_clone_swap_sync_impl+0x9a2/0xa50 [zfs]
[<0>] dmu_recv_end_sync+0xd7/0x480 [zfs]
[<0>] dsl_sync_task_sync+0x11c/0x120 [zfs]
[<0>] dsl_pool_sync+0x295/0x340 [zfs]
[<0>] spa_sync+0x3d6/0x8c0 [zfs]
[<0>] txg_sync_thread+0x29b/0x340 [zfs]
[<0>] thread_generic_wrapper+0x74/0x90 [spl]
[<0>] kthread+0x105/0x140
[<0>] ret_from_fork+0x35/0x40
[<0>] 0xffffffffffffffff
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات