From owner-p4-projects@FreeBSD.ORG Wed Dec 5 23:44:48 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 8C61316A420; Wed, 5 Dec 2007 23:44:48 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2ADFA16A41A for ; Wed, 5 Dec 2007 23:44:48 +0000 (UTC) (envelope-from marcel@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 1016C13C448 for ; Wed, 5 Dec 2007 23:44:48 +0000 (UTC) (envelope-from marcel@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id lB5NiltX071601 for ; Wed, 5 Dec 2007 23:44:47 GMT (envelope-from marcel@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id lB5Nilma071598 for perforce@freebsd.org; Wed, 5 Dec 2007 23:44:47 GMT (envelope-from marcel@freebsd.org) Date: Wed, 5 Dec 2007 23:44:47 GMT Message-Id: <200712052344.lB5Nilma071598@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to marcel@freebsd.org using -f From: Marcel Moolenaar To: Perforce Change Reviews Cc: Subject: PERFORCE change 130296 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 05 Dec 2007 23:44:49 -0000 http://perforce.freebsd.org/chv.cgi?CH=130296 Change 130296 by marcel@marcel_xcllnt on 2007/12/05 23:44:35 o Properly deal with the raw partition. We create a partition list entry for it and mark it internal. This allows us to skip it as part of partition overlap tests. It also allows us to not create a device special file for it. o Calculate the checksum upon write. Affected files ... .. //depot/projects/ia64/sys/geom/part/g_part.c#7 edit .. //depot/projects/ia64/sys/geom/part/g_part.h#6 edit .. //depot/projects/ia64/sys/geom/part/g_part_bsd.c#2 edit Differences ... ==== //depot/projects/ia64/sys/geom/part/g_part.c#7 (text+ko) ==== @@ -453,6 +453,8 @@ index = entry->gpe_index + 1; last = entry; } + if (entry->gpe_internal) + continue; if (gpp->gpp_start >= entry->gpe_start && gpp->gpp_start <= entry->gpe_end) { gctl_error(req, "%d start '%jd'", ENOSPC, @@ -750,13 +752,16 @@ } pp = entry->gpe_pp; - if (pp->acr > 0 || pp->acw > 0 || pp->ace > 0) { - gctl_error(req, "%d", EBUSY); - return (EBUSY); + if (pp != NULL) { + if (pp->acr > 0 || pp->acw > 0 || pp->ace > 0) { + gctl_error(req, "%d", EBUSY); + return (EBUSY); + } + + pp->private = NULL; + entry->gpe_pp = NULL; } - pp->private = NULL; - entry->gpe_pp = NULL; if (entry->gpe_created) { LIST_REMOVE(entry, gpe_entry); g_free(entry); @@ -764,7 +769,9 @@ entry->gpe_modified = 0; entry->gpe_deleted = 1; } - g_wither_provider(pp, ENXIO); + + if (pp != NULL) + g_wither_provider(pp, ENXIO); /* Provide feedback if so requested. */ if (gpp->gpp_parms & G_PART_PARM_OUTPUT) { @@ -927,9 +934,11 @@ entry->gpe_modified = 0; if (entry->gpe_created) { pp = entry->gpe_pp; - pp->private = NULL; - entry->gpe_pp = NULL; - g_wither_provider(pp, ENXIO); + if (pp != NULL) { + pp->private = NULL; + entry->gpe_pp = NULL; + g_wither_provider(pp, ENXIO); + } entry->gpe_deleted = 1; } if (entry->gpe_deleted) { @@ -964,8 +973,10 @@ g_topology_lock(); - LIST_FOREACH(entry, &table->gpt_entry, gpe_entry) - g_part_new_provider(gp, table, entry); + LIST_FOREACH(entry, &table->gpt_entry, gpe_entry) { + if (!entry->gpe_internal) + g_part_new_provider(gp, table, entry); + } table->gpt_opened = 0; g_access(cp, -1, -1, -1); @@ -1361,8 +1372,10 @@ goto fail; g_topology_lock(); - LIST_FOREACH(entry, &table->gpt_entry, gpe_entry) - g_part_new_provider(gp, table, entry); + LIST_FOREACH(entry, &table->gpt_entry, gpe_entry) { + if (!entry->gpe_internal) + g_part_new_provider(gp, table, entry); + } g_access(cp, -1, 0, 0); return (gp); ==== //depot/projects/ia64/sys/geom/part/g_part.h#6 (text+ko) ==== @@ -69,6 +69,7 @@ int gpe_created:1; /* Entry is newly created. */ int gpe_deleted:1; /* Entry has been deleted. */ int gpe_modified:1; /* Entry has been modified. */ + int gpe_internal:1; /* Entry is not a used entry. */ }; /* G_PART table (KOBJ instance). */ ==== //depot/projects/ia64/sys/geom/part/g_part_bsd.c#2 (text+ko) ==== @@ -172,6 +172,8 @@ { struct g_consumer *cp; struct g_provider *pp; + struct g_part_entry *baseentry; + struct g_part_bsd_entry *entry; struct g_part_bsd_table *table; u_char *ptr; uint64_t msize; @@ -205,6 +207,14 @@ basetable->gpt_first = 0; basetable->gpt_last = ncyls * secpercyl - 1; basetable->gpt_isleaf = 1; + + baseentry = g_part_new_entry(basetable, RAW_PART + 1, + basetable->gpt_first, basetable->gpt_last); + baseentry->gpe_internal = 1; + entry = (struct g_part_bsd_entry *)baseentry; + entry->part.p_size = basetable->gpt_last + 1; + entry->part.p_offset = basetable->gpt_offset; + return (0); } @@ -282,6 +292,7 @@ { struct g_provider *pp; struct g_part_bsd_table *table; + struct g_part_entry *baseentry; struct g_part_bsd_entry *entry; struct partition part; u_char *buf, *p; @@ -342,14 +353,19 @@ part.p_fstype = p[12]; part.p_frag = p[13]; part.p_cpg = le16dec(p + 14); - if (part.p_fstype == FS_UNUSED || part.p_size == 0) + if (part.p_size == 0) + continue; + if (part.p_fstype == FS_UNUSED && index != RAW_PART) continue; if (part.p_offset < basetable->gpt_offset) continue; - entry = (struct g_part_bsd_entry *)g_part_new_entry(basetable, - index + 1, part.p_offset - basetable->gpt_offset, + baseentry = g_part_new_entry(basetable, index + 1, + part.p_offset - basetable->gpt_offset, part.p_offset - basetable->gpt_offset + part.p_size - 1); + entry = (struct g_part_bsd_entry *)baseentry; entry->part = part; + if (part.p_fstype == FS_UNUSED) + baseentry->gpe_internal = 1; } return (0); @@ -386,7 +402,8 @@ struct g_part_entry *baseentry; struct g_part_bsd_entry *entry; struct g_part_bsd_table *table; - u_char *p; + uint16_t sum; + u_char *p, *pe; int error, index; pp = cp->provider; @@ -410,6 +427,14 @@ baseentry = LIST_NEXT(baseentry, gpe_entry); } + /* Calculate checksum. */ + le16enc(table->label + 136, 0); + pe = table->label + 148 + basetable->gpt_entries * 16; + sum = 0; + for (p = table->label; p < pe; p += 2) + sum ^= le16dec(p); + le16enc(table->label + 136, sum); + error = g_write_data(cp, pp->sectorsize, table->label, pp->sectorsize); return (error); }