Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F175279673
D6213.id15912.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
D6213.id15912.diff
View Options
Index: sys/boot/i386/libi386/biosdisk.c
===================================================================
--- sys/boot/i386/libi386/biosdisk.c
+++ sys/boot/i386/libi386/biosdisk.c
@@ -746,21 +746,29 @@
* sectors cannot be decrypted. Round the requested LBA down to
* nearest multiple of DEV_GELIBOOT_BSIZE bytes.
*/
- alignlba = dblk &
- ~(daddr_t)((DEV_GELIBOOT_BSIZE / BIOSDISK_SECSIZE) - 1);
+ alignlba = rounddown2(dblk * BIOSDISK_SECSIZE,
+ DEV_GELIBOOT_BSIZE) / BIOSDISK_SECSIZE;
/*
* Round number of blocks to read up to nearest multiple of
* DEV_GELIBOOT_BSIZE
*/
- alignblks = blks + (dblk - alignlba) +
- ((DEV_GELIBOOT_BSIZE / BIOSDISK_SECSIZE) - 1) &
- ~(int)((DEV_GELIBOOT_BSIZE / BIOSDISK_SECSIZE) - 1);
diff = (dblk - alignlba) * BIOSDISK_SECSIZE;
+ alignblks = roundup2(blks * BIOSDISK_SECSIZE + diff,
+ DEV_GELIBOOT_BSIZE) / BIOSDISK_SECSIZE;
+
/*
- * Use a temporary buffer here because the buffer provided by
- * the caller may be too small.
+ * If the read is rounded up to a larger size, use a temporary
+ * buffer here because the buffer provided by the caller may be
+ * too small.
*/
- tmpbuf = alloca(alignblks * BIOSDISK_SECSIZE);
+ if (diff == 0) {
+ tmpbuf = dest;
+ } else {
+ tmpbuf = malloc(alignblks * BIOSDISK_SECSIZE);
+ if (tmpbuf == NULL) {
+ return (1);
+ }
+ }
err = bd_io(dev, alignlba, alignblks, tmpbuf, 0);
if (err)
@@ -781,7 +789,10 @@
if (err)
return (err);
- bcopy(tmpbuf + diff, dest, blks * BIOSDISK_SECSIZE);
+ if (tmpbuf != dest) {
+ bcopy(tmpbuf + diff, dest, blks * BIOSDISK_SECSIZE);
+ free(tmpbuf);
+ }
return (0);
}
#endif /* LOADER_GELI_SUPPORT */
Index: sys/boot/i386/zfsboot/zfsboot.c
===================================================================
--- sys/boot/i386/zfsboot/zfsboot.c
+++ sys/boot/i386/zfsboot/zfsboot.c
@@ -201,7 +201,7 @@
{
char *p;
daddr_t lba, alignlba;
- off_t alignoff, diff;
+ off_t diff;
unsigned int nb, alignnb;
struct dsk *dsk = (struct dsk *) priv;
@@ -211,10 +211,11 @@
p = buf;
lba = off / DEV_BSIZE;
lba += dsk->start;
- /* Align reads to 4k else 4k sector GELIs will not decrypt. */
- alignoff = off & ~ (off_t)(DEV_GELIBOOT_BSIZE - 1);
- /* Round LBA down to nearest multiple of DEV_GELIBOOT_BSIZE bytes. */
- alignlba = alignoff / DEV_BSIZE;
+ /*
+ * Align reads to 4k else 4k sector GELIs will not decrypt.
+ * Round LBA down to nearest multiple of DEV_GELIBOOT_BSIZE bytes.
+ */
+ alignlba = rounddown2(off, DEV_GELIBOOT_BSIZE) / DEV_BSIZE;
/*
* The read must be aligned to DEV_GELIBOOT_BSIZE bytes relative to the
* start of the GELI partition, not the start of the actual disk.
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Oct 10, 4:09 PM (30 m, 52 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
40554067
Default Alt Text
D6213.id15912.diff (2 KB)
Attached To
Mode
D6213: Fixup the geliboot sector round code
Attached
Detach File
Event Timeline
Log In to Comment