Page MenuHomeFreeBSD

D42359.id.diff
No OneTemporary

D42359.id.diff

diff --git a/sys/geom/part/g_part_gpt.c b/sys/geom/part/g_part_gpt.c
--- a/sys/geom/part/g_part_gpt.c
+++ b/sys/geom/part/g_part_gpt.c
@@ -103,7 +103,8 @@
static void g_gpt_printf_utf16(struct sbuf *, uint16_t *, size_t);
static void g_gpt_utf8_to_utf16(const uint8_t *, uint16_t *, size_t);
-static void g_gpt_set_defaults(struct g_part_table *, struct g_provider *);
+static void g_gpt_set_defaults(struct g_part_table *, struct g_provider *,
+ struct g_part_parms *);
static int g_part_gpt_add(struct g_part_table *, struct g_part_entry *,
struct g_part_parms *);
@@ -717,7 +718,7 @@
table->hdr->hdr_entries = basetable->gpt_entries;
table->hdr->hdr_entsz = sizeof(struct gpt_ent);
- g_gpt_set_defaults(basetable, pp);
+ g_gpt_set_defaults(basetable, pp, gpp);
return (0);
}
@@ -1083,7 +1084,7 @@
table = (struct g_part_gpt_table *)basetable;
pp = LIST_FIRST(&basetable->gpt_gp->consumer)->provider;
gpt_create_pmbr(table, pp);
- g_gpt_set_defaults(basetable, pp);
+ g_gpt_set_defaults(basetable, pp, NULL);
basetable->gpt_corrupt = 0;
return (0);
}
@@ -1300,7 +1301,8 @@
}
static void
-g_gpt_set_defaults(struct g_part_table *basetable, struct g_provider *pp)
+g_gpt_set_defaults(struct g_part_table *basetable, struct g_provider *pp,
+ struct g_part_parms *gpp)
{
struct g_part_entry *baseentry;
struct g_part_gpt_entry *entry;
@@ -1334,14 +1336,29 @@
if (entry->ent.ent_lba_end > max)
max = entry->ent.ent_lba_end;
}
- spb = 4096 / pp->sectorsize;
- if (spb > 1) {
- lba = start + ((start % spb) ? spb - start % spb : 0);
- if (lba <= min)
- start = lba;
- lba = end - (end + 1) % spb;
- if (max <= lba)
- end = lba;
+ /*
+ * Don't force alignment of any kind whatsoever on resize, restore or
+ * recover. resize doesn't go through this path, recover has a NULL gpp
+ * and restore has flags == restore (maybe with an appended 'C' to
+ * commit the operation). For these operations, we have to trust the
+ * user knows what they are doing.
+ *
+ * Otherwise it some flavor of creation of a new partition, so we align
+ * to a 4k offset on the drive, to make 512e/4kn drives more performant
+ * by default.
+ */
+ if (gpp == NULL ||
+ (gpp->gpp_parms & G_PART_PARM_FLAGS) == 0 ||
+ strstr(gpp->gpp_flags, "restore") == NULL) {
+ spb = 4096 / pp->sectorsize;
+ if (spb > 1) {
+ lba = start + ((start % spb) ? spb - start % spb : 0);
+ if (lba <= min)
+ start = lba;
+ lba = end - (end + 1) % spb;
+ if (max <= lba)
+ end = lba;
+ }
}
table->hdr->hdr_lba_start = start;
table->hdr->hdr_lba_end = end;

File Metadata

Mime Type
text/plain
Expires
Thu, Nov 7, 12:44 PM (9 h, 46 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14512543
Default Alt Text
D42359.id.diff (2 KB)

Event Timeline