Compare commits
No commits in common. "c8" and "c8s" have entirely different histories.
@ -1,54 +0,0 @@
|
|||||||
From 6338a8467564c3a0a12e9fcb08bdd748d736ac2f Mon Sep 17 00:00:00 2001
|
|
||||||
From: Theodore Ts'o <tytso@mit.edu>
|
|
||||||
Date: Sun, 17 May 2020 23:05:11 -0400
|
|
||||||
Subject: [PATCH] libext2fs: retry reading superblock on open when checksum is
|
|
||||||
bad
|
|
||||||
|
|
||||||
When opening a file system which is mounted, it's possible that when
|
|
||||||
ext2fs_open2() is racing with the kernel modifying the orphaned inode
|
|
||||||
list, the superblock's checksum could be incorrect. So retry reading
|
|
||||||
the superblock in the hopes that the problem will self-correct.
|
|
||||||
|
|
||||||
Google-Bug-Id: 151453112
|
|
||||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
|
|
||||||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
|
||||||
---
|
|
||||||
lib/ext2fs/openfs.c | 7 ++++++-
|
|
||||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/lib/ext2fs/openfs.c b/lib/ext2fs/openfs.c
|
|
||||||
index 51b54a44..ae54870e 100644
|
|
||||||
--- a/lib/ext2fs/openfs.c
|
|
||||||
+++ b/lib/ext2fs/openfs.c
|
|
||||||
@@ -134,6 +134,7 @@ errcode_t ext2fs_open2(const char *name, const char *io_options,
|
|
||||||
int j;
|
|
||||||
#endif
|
|
||||||
char *time_env;
|
|
||||||
+ int csum_retries = 0;
|
|
||||||
|
|
||||||
EXT2_CHECK_MAGIC(manager, EXT2_ET_MAGIC_IO_MANAGER);
|
|
||||||
|
|
||||||
@@ -221,6 +222,7 @@ errcode_t ext2fs_open2(const char *name, const char *io_options,
|
|
||||||
if (retval)
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
+retry:
|
|
||||||
retval = io_channel_read_blk(fs->io, superblock, -SUPERBLOCK_SIZE,
|
|
||||||
fs->super);
|
|
||||||
if (retval)
|
|
||||||
@@ -232,8 +234,11 @@ errcode_t ext2fs_open2(const char *name, const char *io_options,
|
|
||||||
retval = 0;
|
|
||||||
if (!ext2fs_verify_csum_type(fs, fs->super))
|
|
||||||
retval = EXT2_ET_UNKNOWN_CSUM;
|
|
||||||
- if (!ext2fs_superblock_csum_verify(fs, fs->super))
|
|
||||||
+ if (!ext2fs_superblock_csum_verify(fs, fs->super)) {
|
|
||||||
+ if (csum_retries++ < 3)
|
|
||||||
+ goto retry;
|
|
||||||
retval = EXT2_ET_SB_CSUM_INVALID;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef WORDS_BIGENDIAN
|
|
||||||
--
|
|
||||||
2.48.1
|
|
||||||
|
|
||||||
@ -1,254 +0,0 @@
|
|||||||
From c001596110e834a85b01a47a20811b318cb3b9e4 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Theodore Ts'o <tytso@mit.edu>
|
|
||||||
Date: Fri, 26 Feb 2021 17:41:06 -0500
|
|
||||||
Subject: [PATCH] libext2fs: fix unix_io's Direct I/O support
|
|
||||||
|
|
||||||
The previous Direct I/O support worked on HDD's with 512 byte logical
|
|
||||||
sector sizes, and on FreeBSD which required 4k aligned memory buffers.
|
|
||||||
However, it was incomplete and was not correctly working on HDD's with
|
|
||||||
4k logical sector sizes (aka Advanced Format Disks).
|
|
||||||
|
|
||||||
Based on a patch from Alexey Lyashkov <alexey.lyashkov@hpe.com> but
|
|
||||||
rewritten to work with the latest e2fsprogs and to minimize changes to
|
|
||||||
make it easier to review.
|
|
||||||
|
|
||||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
|
|
||||||
Reported-by: Artem Blagodarenko <artem.blagodarenko@gmail.com>
|
|
||||||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
|
||||||
---
|
|
||||||
lib/ext2fs/io_manager.c | 6 ++-
|
|
||||||
lib/ext2fs/unix_io.c | 87 +++++++++++++++++++++++++++++++----------
|
|
||||||
2 files changed, 70 insertions(+), 23 deletions(-)
|
|
||||||
|
|
||||||
Index: e2fsprogs-1.45.6/lib/ext2fs/io_manager.c
|
|
||||||
===================================================================
|
|
||||||
--- e2fsprogs-1.45.6.orig/lib/ext2fs/io_manager.c
|
|
||||||
+++ e2fsprogs-1.45.6/lib/ext2fs/io_manager.c
|
|
||||||
@@ -134,9 +134,11 @@ errcode_t io_channel_alloc_buf(io_channe
|
|
||||||
else
|
|
||||||
size = -count;
|
|
||||||
|
|
||||||
- if (io->align)
|
|
||||||
+ if (io->align) {
|
|
||||||
+ if (io->align > size)
|
|
||||||
+ size = io->align;
|
|
||||||
return ext2fs_get_memalign(size, io->align, ptr);
|
|
||||||
- else
|
|
||||||
+ } else
|
|
||||||
return ext2fs_get_mem(size, ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
@@ -165,13 +165,15 @@ static errcode_t raw_read_blk(io_channel
|
|
||||||
int actual = 0;
|
|
||||||
unsigned char *buf = bufv;
|
|
||||||
ssize_t really_read = 0;
|
|
||||||
+ unsigned long long aligned_blk;
|
|
||||||
+ int align_size, offset;
|
|
||||||
|
|
||||||
size = (count < 0) ? -count : (ext2_loff_t) count * channel->block_size;
|
|
||||||
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) != location) {
|
|
||||||
+ if (ext2fs_llseek(data->dev, location, SEEK_SET) < 0) {
|
|
||||||
retval = errno ? errno : EXT2_ET_LLSEEK_FAILED;
|
|
||||||
goto error_out;
|
|
||||||
}
|
|
||||||
@@ -182,6 +184,7 @@ static errcode_t raw_read_blk(io_channel
|
|
||||||
/* Try an aligned pread */
|
|
||||||
if ((channel->align == 0) ||
|
|
||||||
(IS_ALIGNED(buf, channel->align) &&
|
|
||||||
+ IS_ALIGNED(location, channel->align) &&
|
|
||||||
IS_ALIGNED(size, channel->align))) {
|
|
||||||
actual = pread64(data->dev, buf, size, location);
|
|
||||||
if (actual == size)
|
|
||||||
@@ -193,6 +196,7 @@ static errcode_t raw_read_blk(io_channel
|
|
||||||
if ((sizeof(off_t) >= sizeof(ext2_loff_t)) &&
|
|
||||||
((channel->align == 0) ||
|
|
||||||
(IS_ALIGNED(buf, channel->align) &&
|
|
||||||
+ IS_ALIGNED(location, channel->align) &&
|
|
||||||
IS_ALIGNED(size, channel->align)))) {
|
|
||||||
actual = pread(data->dev, buf, size, location);
|
|
||||||
if (actual == size)
|
|
||||||
@@ -201,12 +205,13 @@ static errcode_t raw_read_blk(io_channel
|
|
||||||
}
|
|
||||||
#endif /* HAVE_PREAD */
|
|
||||||
|
|
||||||
- if (ext2fs_llseek(data->dev, location, SEEK_SET) != location) {
|
|
||||||
+ if (ext2fs_llseek(data->dev, location, SEEK_SET) < 0) {
|
|
||||||
retval = errno ? errno : EXT2_ET_LLSEEK_FAILED;
|
|
||||||
goto error_out;
|
|
||||||
}
|
|
||||||
if ((channel->align == 0) ||
|
|
||||||
(IS_ALIGNED(buf, channel->align) &&
|
|
||||||
+ IS_ALIGNED(location, channel->align) &&
|
|
||||||
IS_ALIGNED(size, channel->align))) {
|
|
||||||
actual = read(data->dev, buf, size);
|
|
||||||
if (actual != size) {
|
|
||||||
@@ -231,21 +236,37 @@ 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->block_size > channel->align) &&
|
|
||||||
+ (channel->block_size % channel->align) == 0)
|
|
||||||
+ align_size = channel->block_size;
|
|
||||||
+ else
|
|
||||||
+ align_size = channel->align;
|
|
||||||
+ aligned_blk = location / align_size;
|
|
||||||
+ offset = location % align_size;
|
|
||||||
+
|
|
||||||
+ if (ext2fs_llseek(data->dev, aligned_blk * align_size, SEEK_SET) < 0) {
|
|
||||||
+ retval = errno ? errno : EXT2_ET_LLSEEK_FAILED;
|
|
||||||
+ goto error_out;
|
|
||||||
+ }
|
|
||||||
while (size > 0) {
|
|
||||||
- actual = read(data->dev, data->bounce, channel->block_size);
|
|
||||||
- if (actual != channel->block_size) {
|
|
||||||
+ actual = read(data->dev, data->bounce, align_size);
|
|
||||||
+ if (actual != align_size) {
|
|
||||||
actual = really_read;
|
|
||||||
buf -= really_read;
|
|
||||||
size += really_read;
|
|
||||||
goto short_read;
|
|
||||||
}
|
|
||||||
- actual = size;
|
|
||||||
- if (size > channel->block_size)
|
|
||||||
- actual = channel->block_size;
|
|
||||||
- memcpy(buf, data->bounce, actual);
|
|
||||||
+ if ((actual + offset) > align_size)
|
|
||||||
+ actual = align_size - offset;
|
|
||||||
+ if (actual > size)
|
|
||||||
+ actual = size;
|
|
||||||
+ memcpy(buf, data->bounce + offset, actual);
|
|
||||||
+
|
|
||||||
really_read += actual;
|
|
||||||
size -= actual;
|
|
||||||
buf += actual;
|
|
||||||
+ offset = 0;
|
|
||||||
+ aligned_blk++;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
@@ -268,6 +289,8 @@ static errcode_t raw_write_blk(io_channe
|
|
||||||
int actual = 0;
|
|
||||||
errcode_t retval;
|
|
||||||
const unsigned char *buf = bufv;
|
|
||||||
+ unsigned long long aligned_blk;
|
|
||||||
+ int align_size, offset;
|
|
||||||
|
|
||||||
if (count == 1)
|
|
||||||
size = channel->block_size;
|
|
||||||
@@ -282,7 +305,7 @@ 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) != location) {
|
|
||||||
+ if (ext2fs_llseek(data->dev, location, SEEK_SET) < 0) {
|
|
||||||
retval = errno ? errno : EXT2_ET_LLSEEK_FAILED;
|
|
||||||
goto error_out;
|
|
||||||
}
|
|
||||||
@@ -293,6 +316,7 @@ static errcode_t raw_write_blk(io_channe
|
|
||||||
/* Try an aligned pwrite */
|
|
||||||
if ((channel->align == 0) ||
|
|
||||||
(IS_ALIGNED(buf, channel->align) &&
|
|
||||||
+ IS_ALIGNED(location, channel->align) &&
|
|
||||||
IS_ALIGNED(size, channel->align))) {
|
|
||||||
actual = pwrite64(data->dev, buf, size, location);
|
|
||||||
if (actual == size)
|
|
||||||
@@ -303,6 +327,7 @@ static errcode_t raw_write_blk(io_channe
|
|
||||||
if ((sizeof(off_t) >= sizeof(ext2_loff_t)) &&
|
|
||||||
((channel->align == 0) ||
|
|
||||||
(IS_ALIGNED(buf, channel->align) &&
|
|
||||||
+ IS_ALIGNED(location, channel->align) &&
|
|
||||||
IS_ALIGNED(size, channel->align)))) {
|
|
||||||
actual = pwrite(data->dev, buf, size, location);
|
|
||||||
if (actual == size)
|
|
||||||
@@ -310,13 +335,14 @@ static errcode_t raw_write_blk(io_channe
|
|
||||||
}
|
|
||||||
#endif /* HAVE_PWRITE */
|
|
||||||
|
|
||||||
- if (ext2fs_llseek(data->dev, location, SEEK_SET) != location) {
|
|
||||||
+ if (ext2fs_llseek(data->dev, location, SEEK_SET) < 0) {
|
|
||||||
retval = errno ? errno : EXT2_ET_LLSEEK_FAILED;
|
|
||||||
goto error_out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((channel->align == 0) ||
|
|
||||||
(IS_ALIGNED(buf, channel->align) &&
|
|
||||||
+ IS_ALIGNED(location, channel->align) &&
|
|
||||||
IS_ALIGNED(size, channel->align))) {
|
|
||||||
actual = write(data->dev, buf, size);
|
|
||||||
if (actual < 0) {
|
|
||||||
@@ -340,37 +366,56 @@ 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->block_size > channel->align) &&
|
|
||||||
+ (channel->block_size % channel->align) == 0)
|
|
||||||
+ align_size = channel->block_size;
|
|
||||||
+ else
|
|
||||||
+ align_size = channel->align;
|
|
||||||
+ aligned_blk = location / align_size;
|
|
||||||
+ offset = location % align_size;
|
|
||||||
+
|
|
||||||
while (size > 0) {
|
|
||||||
- if (size < channel->block_size) {
|
|
||||||
+ int actual_w;
|
|
||||||
+
|
|
||||||
+ if (size < align_size || offset) {
|
|
||||||
+ if (ext2fs_llseek(data->dev, aligned_blk * align_size,
|
|
||||||
+ SEEK_SET) < 0) {
|
|
||||||
+ retval = errno ? errno : EXT2_ET_LLSEEK_FAILED;
|
|
||||||
+ goto error_out;
|
|
||||||
+ }
|
|
||||||
actual = read(data->dev, data->bounce,
|
|
||||||
- channel->block_size);
|
|
||||||
- if (actual != channel->block_size) {
|
|
||||||
+ align_size);
|
|
||||||
+ if (actual != align_size) {
|
|
||||||
if (actual < 0) {
|
|
||||||
retval = errno;
|
|
||||||
goto error_out;
|
|
||||||
}
|
|
||||||
memset((char *) data->bounce + actual, 0,
|
|
||||||
- channel->block_size - actual);
|
|
||||||
+ align_size - actual);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
actual = size;
|
|
||||||
- if (size > channel->block_size)
|
|
||||||
- actual = channel->block_size;
|
|
||||||
- memcpy(data->bounce, buf, actual);
|
|
||||||
- if (ext2fs_llseek(data->dev, location, SEEK_SET) != location) {
|
|
||||||
+ if ((actual + offset) > align_size)
|
|
||||||
+ actual = align_size - offset;
|
|
||||||
+ if (actual > size)
|
|
||||||
+ actual = size;
|
|
||||||
+ memcpy(((char *)data->bounce) + offset, buf, actual);
|
|
||||||
+ if (ext2fs_llseek(data->dev, aligned_blk * align_size, SEEK_SET) < 0) {
|
|
||||||
retval = errno ? errno : EXT2_ET_LLSEEK_FAILED;
|
|
||||||
goto error_out;
|
|
||||||
}
|
|
||||||
- actual = write(data->dev, data->bounce, channel->block_size);
|
|
||||||
- if (actual < 0) {
|
|
||||||
+ actual_w = write(data->dev, data->bounce, align_size);
|
|
||||||
+ if (actual_w < 0) {
|
|
||||||
retval = errno;
|
|
||||||
goto error_out;
|
|
||||||
}
|
|
||||||
- if (actual != channel->block_size)
|
|
||||||
+ if (actual_w != align_size)
|
|
||||||
goto short_write;
|
|
||||||
size -= actual;
|
|
||||||
buf += actual;
|
|
||||||
location += actual;
|
|
||||||
+ aligned_blk++;
|
|
||||||
+ offset = 0;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
@ -1,195 +0,0 @@
|
|||||||
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
|
|
||||||
@ -1,35 +0,0 @@
|
|||||||
From 43a498e938887956f393b5e45ea6ac79cc5f4b84 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Theodore Ts'o <tytso@mit.edu>
|
|
||||||
Date: Thu, 15 Jun 2023 00:17:01 -0400
|
|
||||||
Subject: [PATCH] resize2fs: use Direct I/O when reading the superblock for
|
|
||||||
online resizes
|
|
||||||
|
|
||||||
If the file system is mounted, the superblock can be changing while
|
|
||||||
resize2fs is trying to read the superblock, resulting in checksum
|
|
||||||
failures. One way of avoiding this problem is read the superblock
|
|
||||||
using Direct I/O, since the kernel makes sure that what gets written
|
|
||||||
to disk is self-consistent.
|
|
||||||
|
|
||||||
Suggested-by: Krister Johansen <kjlx@templeofstupid.com>
|
|
||||||
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
|
|
||||||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
|
||||||
---
|
|
||||||
resize/main.c | 2 ++
|
|
||||||
1 file changed, 2 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/resize/main.c b/resize/main.c
|
|
||||||
index 94f5ec6d..f914c050 100644
|
|
||||||
--- a/resize/main.c
|
|
||||||
+++ b/resize/main.c
|
|
||||||
@@ -403,6 +403,8 @@
|
|
||||||
|
|
||||||
if (!(mount_flags & EXT2_MF_MOUNTED))
|
|
||||||
io_flags = EXT2_FLAG_RW | EXT2_FLAG_EXCLUSIVE;
|
|
||||||
+ if (mount_flags & EXT2_MF_MOUNTED)
|
|
||||||
+ io_flags |= EXT2_FLAG_DIRECT_IO;
|
|
||||||
|
|
||||||
io_flags |= EXT2_FLAG_64BITS;
|
|
||||||
if (undo_file) {
|
|
||||||
--
|
|
||||||
2.48.1
|
|
||||||
|
|
||||||
@ -1,7 +1,7 @@
|
|||||||
Summary: Utilities for managing ext2, ext3, and ext4 file systems
|
Summary: Utilities for managing ext2, ext3, and ext4 file systems
|
||||||
Name: e2fsprogs
|
Name: e2fsprogs
|
||||||
Version: 1.45.6
|
Version: 1.45.6
|
||||||
Release: 7%{?dist}
|
Release: 5%{?dist}
|
||||||
|
|
||||||
# License tags based on COPYING file distinctions for various components
|
# License tags based on COPYING file distinctions for various components
|
||||||
License: GPLv2
|
License: GPLv2
|
||||||
@ -86,10 +86,6 @@ Patch55: e2fsprogs-1.45.6-e2fsck-add-maximum-string-length-specifiers-to-fscan.p
|
|||||||
Patch56: e2fsprogs-1.45.6-tests-Add-option-to-print-diff-output-of-failed-test.patch
|
Patch56: e2fsprogs-1.45.6-tests-Add-option-to-print-diff-output-of-failed-test.patch
|
||||||
Patch57: e2fsprogs-1.45.6-libext2fs-add-sanity-check-to-extent-manipulation.patch
|
Patch57: e2fsprogs-1.45.6-libext2fs-add-sanity-check-to-extent-manipulation.patch
|
||||||
Patch58: e2fsprogs-1.45.6-libss-fix-possible-NULL-pointer-dereferece-on-alloca.patch
|
Patch58: e2fsprogs-1.45.6-libss-fix-possible-NULL-pointer-dereferece-on-alloca.patch
|
||||||
Patch59: e2fsprogs-1.45.7-libext2fs-retry-reading-superblock-on-open-when-chec.patch
|
|
||||||
Patch60: e2fsprogs-1.47.1-resize2fs-use-Direct-I-O-when-reading-the-superblock.patch
|
|
||||||
Patch61: e2fsprogs-1.46.1-libext2fs-fix-un-ix_io-s-Direct-I-O-support.patch
|
|
||||||
Patch62: e2fsprogs-1.46.2-libext2s-fix-unix_io-with-IO_FLAG_FORCE_BOUNCE-flag-.patch
|
|
||||||
|
|
||||||
%description
|
%description
|
||||||
The e2fsprogs package contains a number of utilities for creating,
|
The e2fsprogs package contains a number of utilities for creating,
|
||||||
@ -267,10 +263,6 @@ It was originally inspired by the Multics SubSystem library.
|
|||||||
%patch56 -p1
|
%patch56 -p1
|
||||||
%patch57 -p1
|
%patch57 -p1
|
||||||
%patch58 -p1
|
%patch58 -p1
|
||||||
%patch59 -p1
|
|
||||||
%patch60 -p1
|
|
||||||
%patch61 -p1
|
|
||||||
%patch62 -p1
|
|
||||||
|
|
||||||
%build
|
%build
|
||||||
%configure CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing" \
|
%configure CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing" \
|
||||||
@ -433,14 +425,6 @@ exit 0
|
|||||||
%{_libdir}/pkgconfig/ss.pc
|
%{_libdir}/pkgconfig/ss.pc
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Mon Sep 01 2025 Pavel Reichl <preichl@redhat.com>
|
|
||||||
- libext2fs: fix unix_io's Direct I/O support
|
|
||||||
- Related: RHEL-106939
|
|
||||||
|
|
||||||
* Thu Jan 23 2025 Pavel Reichl <preichl@redhat.com> 1.45.6-6
|
|
||||||
- Fix e2fsprogs: online resize fails
|
|
||||||
- Related: RHEL-60512
|
|
||||||
|
|
||||||
* Wed May 11 2022 Lukas Czerner <lczerner@redhat.com> 1.45.6-5
|
* Wed May 11 2022 Lukas Czerner <lczerner@redhat.com> 1.45.6-5
|
||||||
- Update e2fsprogs with upstream fixes and improvements (#2083621)
|
- Update e2fsprogs with upstream fixes and improvements (#2083621)
|
||||||
- Fix out-of-bounds read/write via crafter filesystem (#2073548)
|
- Fix out-of-bounds read/write via crafter filesystem (#2073548)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user