196 lines
7.1 KiB
Diff
196 lines
7.1 KiB
Diff
From e1af249abafbf4b08c5b55cab6a0564170ce0f7d Mon Sep 17 00:00:00 2001
|
||
From: Theodore Ts'o <tytso@mit.edu>
|
||
Date: Sun, 28 Feb 2021 09:12:47 -0500
|
||
Subject: [PATCH] libext2s: fix unix_io with IO_FLAG_FORCE_BOUNCE flag set
|
||
|
||
The bounce read/write code would crash with a floating point exception
|
||
if alignment is set to 0.
|
||
|
||
Fixes: c001596110e8 ("libext2fs: fix unix_io's Direct I/O support")
|
||
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
|
||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
||
---
|
||
lib/ext2fs/unix_io.c | 18 +++----
|
||
tests/u_bounce_io/expect.1 | 106 +++++++++++++++++++++++++++++++++++++
|
||
tests/u_bounce_io/script | 9 ++++
|
||
3 files changed, 121 insertions(+), 12 deletions(-)
|
||
create mode 100644 tests/u_bounce_io/expect.1
|
||
create mode 100644 tests/u_bounce_io/script
|
||
|
||
Index: e2fsprogs-1.45.6/lib/ext2fs/unix_io.c
|
||
===================================================================
|
||
--- e2fsprogs-1.45.6.orig/lib/ext2fs/unix_io.c
|
||
+++ e2fsprogs-1.45.6/lib/ext2fs/unix_io.c
|
||
@@ -172,13 +172,8 @@ static errcode_t raw_read_blk(io_channel
|
||
data->io_stats.bytes_read += size;
|
||
location = ((ext2_loff_t) block * channel->block_size) + data->offset;
|
||
|
||
- if (data->flags & IO_FLAG_FORCE_BOUNCE) {
|
||
- if (ext2fs_llseek(data->dev, location, SEEK_SET) < 0) {
|
||
- retval = errno ? errno : EXT2_ET_LLSEEK_FAILED;
|
||
- goto error_out;
|
||
- }
|
||
+ if (data->flags & IO_FLAG_FORCE_BOUNCE)
|
||
goto bounce_read;
|
||
- }
|
||
|
||
#ifdef HAVE_PREAD64
|
||
/* Try an aligned pread */
|
||
@@ -236,6 +231,8 @@ static errcode_t raw_read_blk(io_channel
|
||
* to the O_DIRECT rules, so we need to do this the hard way...
|
||
*/
|
||
bounce_read:
|
||
+ if (channel->align == 0)
|
||
+ channel->align = 1;
|
||
if ((channel->block_size > channel->align) &&
|
||
(channel->block_size % channel->align) == 0)
|
||
align_size = channel->block_size;
|
||
@@ -304,13 +301,8 @@ static errcode_t raw_write_blk(io_channe
|
||
|
||
location = ((ext2_loff_t) block * channel->block_size) + data->offset;
|
||
|
||
- if (data->flags & IO_FLAG_FORCE_BOUNCE) {
|
||
- if (ext2fs_llseek(data->dev, location, SEEK_SET) < 0) {
|
||
- retval = errno ? errno : EXT2_ET_LLSEEK_FAILED;
|
||
- goto error_out;
|
||
- }
|
||
+ if (data->flags & IO_FLAG_FORCE_BOUNCE)
|
||
goto bounce_write;
|
||
- }
|
||
|
||
#ifdef HAVE_PWRITE64
|
||
/* Try an aligned pwrite */
|
||
@@ -366,6 +358,8 @@ static errcode_t raw_write_blk(io_channe
|
||
* to the O_DIRECT rules, so we need to do this the hard way...
|
||
*/
|
||
bounce_write:
|
||
+ if (channel->align == 0)
|
||
+ channel->align = 1;
|
||
if ((channel->block_size > channel->align) &&
|
||
(channel->block_size % channel->align) == 0)
|
||
align_size = channel->block_size;
|
||
Index: e2fsprogs-1.45.6/tests/u_bounce_io/expect.1
|
||
===================================================================
|
||
--- /dev/null
|
||
+++ e2fsprogs-1.45.6/tests/u_bounce_io/expect.1
|
||
@@ -0,0 +1,105 @@
|
||
+Creating filesystem with 65536 1k blocks and 16384 inodes
|
||
+Superblock backups stored on blocks:
|
||
+ 8193, 24577, 40961, 57345
|
||
+
|
||
+Allocating group tables: done
|
||
+Writing inode tables: done
|
||
+Writing superblocks and filesystem accounting information: done
|
||
+
|
||
+Filesystem features: ext_attr resize_inode dir_index filetype sparse_super
|
||
+Pass 1: Checking inodes, blocks, and sizes
|
||
+Pass 2: Checking directory structure
|
||
+Pass 3: Checking directory connectivity
|
||
+Pass 4: Checking reference counts
|
||
+Pass 5: Checking group summary information
|
||
+test_filesys: 11/16384 files (0.0% non-contiguous), 3364/65536 blocks
|
||
+Exit status is 0
|
||
+Filesystem volume name: <none>
|
||
+Last mounted on: <not available>
|
||
+Filesystem magic number: 0xEF53
|
||
+Filesystem revision #: 1 (dynamic)
|
||
+Filesystem features: ext_attr resize_inode dir_index filetype sparse_super
|
||
+Default mount options: (none)
|
||
+Filesystem state: clean
|
||
+Errors behavior: Continue
|
||
+Filesystem OS type: Linux
|
||
+Inode count: 16384
|
||
+Block count: 65536
|
||
+Reserved block count: 3276
|
||
+Free blocks: 62172
|
||
+Free inodes: 16373
|
||
+First block: 1
|
||
+Block size: 1024
|
||
+Fragment size: 1024
|
||
+Reserved GDT blocks: 255
|
||
+Blocks per group: 8192
|
||
+Fragments per group: 8192
|
||
+Inodes per group: 2048
|
||
+Inode blocks per group: 256
|
||
+Mount count: 0
|
||
+Check interval: 15552000 (6 months)
|
||
+Reserved blocks uid: 0
|
||
+Reserved blocks gid: 0
|
||
+First inode: 11
|
||
+Inode size: 128
|
||
+Default directory hash: half_md4
|
||
+
|
||
+
|
||
+Group 0: (Blocks 1-8192)
|
||
+ Primary superblock at 1, Group descriptors at 2-2
|
||
+ Reserved GDT blocks at 3-257
|
||
+ Block bitmap at 258 (+257), Inode bitmap at 259 (+258)
|
||
+ Inode table at 260-515 (+259)
|
||
+ 7663 free blocks, 2037 free inodes, 2 directories
|
||
+ Free blocks: 530-8192
|
||
+ Free inodes: 12-2048
|
||
+Group 1: (Blocks 8193-16384)
|
||
+ Backup superblock at 8193, Group descriptors at 8194-8194
|
||
+ Reserved GDT blocks at 8195-8449
|
||
+ Block bitmap at 8450 (+257), Inode bitmap at 8451 (+258)
|
||
+ Inode table at 8452-8707 (+259)
|
||
+ 7677 free blocks, 2048 free inodes, 0 directories
|
||
+ Free blocks: 8708-16384
|
||
+ Free inodes: 2049-4096
|
||
+Group 2: (Blocks 16385-24576)
|
||
+ Block bitmap at 16385 (+0), Inode bitmap at 16386 (+1)
|
||
+ Inode table at 16387-16642 (+2)
|
||
+ 7934 free blocks, 2048 free inodes, 0 directories
|
||
+ Free blocks: 16643-24576
|
||
+ Free inodes: 4097-6144
|
||
+Group 3: (Blocks 24577-32768)
|
||
+ Backup superblock at 24577, Group descriptors at 24578-24578
|
||
+ Reserved GDT blocks at 24579-24833
|
||
+ Block bitmap at 24834 (+257), Inode bitmap at 24835 (+258)
|
||
+ Inode table at 24836-25091 (+259)
|
||
+ 7677 free blocks, 2048 free inodes, 0 directories
|
||
+ Free blocks: 25092-32768
|
||
+ Free inodes: 6145-8192
|
||
+Group 4: (Blocks 32769-40960)
|
||
+ Block bitmap at 32769 (+0), Inode bitmap at 32770 (+1)
|
||
+ Inode table at 32771-33026 (+2)
|
||
+ 7934 free blocks, 2048 free inodes, 0 directories
|
||
+ Free blocks: 33027-40960
|
||
+ Free inodes: 8193-10240
|
||
+Group 5: (Blocks 40961-49152)
|
||
+ Backup superblock at 40961, Group descriptors at 40962-40962
|
||
+ Reserved GDT blocks at 40963-41217
|
||
+ Block bitmap at 41218 (+257), Inode bitmap at 41219 (+258)
|
||
+ Inode table at 41220-41475 (+259)
|
||
+ 7677 free blocks, 2048 free inodes, 0 directories
|
||
+ Free blocks: 41476-49152
|
||
+ Free inodes: 10241-12288
|
||
+Group 6: (Blocks 49153-57344)
|
||
+ Block bitmap at 49153 (+0), Inode bitmap at 49154 (+1)
|
||
+ Inode table at 49155-49410 (+2)
|
||
+ 7934 free blocks, 2048 free inodes, 0 directories
|
||
+ Free blocks: 49411-57344
|
||
+ Free inodes: 12289-14336
|
||
+Group 7: (Blocks 57345-65535)
|
||
+ Backup superblock at 57345, Group descriptors at 57346-57346
|
||
+ Reserved GDT blocks at 57347-57601
|
||
+ Block bitmap at 57602 (+257), Inode bitmap at 57603 (+258)
|
||
+ Inode table at 57604-57859 (+259)
|
||
+ 7676 free blocks, 2048 free inodes, 0 directories
|
||
+ Free blocks: 57860-65535
|
||
+ Free inodes: 14337-16384
|
||
Index: e2fsprogs-1.45.6/tests/u_bounce_io/script
|
||
===================================================================
|
||
--- /dev/null
|
||
+++ e2fsprogs-1.45.6/tests/u_bounce_io/script
|
||
@@ -0,0 +1,9 @@
|
||
+DESCRIPTION="bounce I/O in unix_io"
|
||
+DUMPE2FS_IGNORE_80COL=1
|
||
+export DUMPE2FS_IGNORE_80COL
|
||
+UNIX_IO_FORCE_BOUNCE=yes
|
||
+export UNIX_IO_FORCE_BOUNCE
|
||
+FS_SIZE=65536
|
||
+. $cmd_dir/run_mke2fs
|
||
+unset DUMPE2FS_IGNORE_80COL
|
||
+unset UNIX_IO_FORCE_BOUNCE
|