Date: Thu, 2 Oct 2008 07:50:03 GMT From: Jaakko Heinonen <jh@saunalahti.fi> To: freebsd-bugs@FreeBSD.org Subject: Re: kern/119868: [zfs] 7.0 kernel panic during boot with ZFS and WD1600JS Message-ID: <200810020750.m927o3Gt095405@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/119868; it has been noted by GNATS. From: Jaakko Heinonen <jh@saunalahti.fi> To: Harald Hanche-Olsen <hanche@math.ntnu.no> Cc: bug-followup@FreeBSD.org, johan@giantfoo.org, marcel@FreeBSD.org Subject: Re: kern/119868: [zfs] 7.0 kernel panic during boot with ZFS and WD1600JS Date: Thu, 2 Oct 2008 10:39:52 +0300 Hi, On 2008-09-30, Harald Hanche-Olsen wrote: > For the curious: I intended to do > > #; gpt create -f da2 > #; gpt add -t 6a898cc3-1dd2-11b2-99a6-080020736631 da2 > #; zpool create poolname da2p1 > > but apparently, I created the pool on da2 instead, partially > overwriting the GPT. This PR is a duplicate of kern/127115. The bug is not in zfs code but in the gpart GPT code. It's possible that a corrupted GPT partition table causes a panic in g_part_gpt_read(). These conditions must be true after reading the tables in g_part_gpt_read() to cause the panic: table->state[GPT_ELT_PRIHDR] == GPT_STATE_OK pritbl == NULL table->state[GPT_ELT_SECTBL] == GPT_STATE_OK The panic happens at line 661 in g_part_gpt.c (r183533) when tbl is NULL. Here is a proposed fix: %%% Index: sys/geom/part/g_part_gpt.c =================================================================== --- sys/geom/part/g_part_gpt.c (revision 183533) +++ sys/geom/part/g_part_gpt.c (working copy) @@ -631,7 +631,7 @@ g_part_gpt_read(struct g_part_table *bas table->state[GPT_ELT_PRIHDR] = GPT_STATE_INVALID; } - if (table->state[GPT_ELT_PRIHDR] != GPT_STATE_OK) { + if (table->state[GPT_ELT_PRITBL] != GPT_STATE_OK) { printf("GEOM: %s: the primary GPT table is corrupt or " "invalid.\n", pp->name); printf("GEOM: %s: using the secondary instead -- recovery " @@ -641,7 +641,7 @@ g_part_gpt_read(struct g_part_table *bas if (pritbl != NULL) g_free(pritbl); } else { - if (table->state[GPT_ELT_SECHDR] != GPT_STATE_OK) { + if (table->state[GPT_ELT_SECTBL] != GPT_STATE_OK) { printf("GEOM: %s: the secondary GPT table is corrupt " "or invalid.\n", pp->name); printf("GEOM: %s: using the primary only -- recovery " %%% The patch applied this is that I get with the corrupted GPT table: GEOM: ad0: the primary GPT table is corrupt or invalid. GEOM: ad0: using the secondary instead -- recovery strongly advised. -- Jaakko
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200810020750.m927o3Gt095405>