Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F102010969
D42359.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D42359.id.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D42359: gpart: Be less picky about GPT Tables in some cases
Attached
Detach File
Event Timeline
Log In to Comment