[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20180306151835.4842-8-artem.blagodarenko@gmail.com>
Date: Tue, 6 Mar 2018 18:18:35 +0300
From: Artem Blagodarenko <artem.blagodarenko@...il.com>
To: linux-ext4@...r.kernel.org
Cc: adilger.kernel@...ger.ca
Subject: [PATCH v3 7/7] ext2fs: last_oraph 64bit support
This patch is required by INODE64 feature. High part of
last_oraph is stored in superblock and accessed using
helper functions.
Lustre-bug: https://jira.hpdd.intel.com/browse/LU-9309
Signed-off-by: Artem Blagodarenko <artem.blagodarenko@...il.com>
---
e2fsck/pass1.c | 4 ++--
e2fsck/super.c | 7 ++++---
lib/e2p/ls.c | 4 ++--
lib/ext2fs/ext2_fs.h | 3 ++-
lib/ext2fs/ext2fs.h | 19 +++++++++++++++++++
lib/ext2fs/swapfs.c | 1 +
lib/ext2fs/tst_super_size.c | 3 ++-
misc/fuse2fs.c | 2 +-
8 files changed, 33 insertions(+), 10 deletions(-)
diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c
index 24f8e215..20823724 100644
--- a/e2fsck/pass1.c
+++ b/e2fsck/pass1.c
@@ -1301,8 +1301,8 @@ void e2fsck_pass1(e2fsck_t ctx)
* ext3 mount code won't get confused.
*/
if (!(ctx->options & E2F_OPT_READONLY)) {
- if (fs->super->s_last_orphan) {
- fs->super->s_last_orphan = 0;
+ if (ext2fs_get_last_orphan(fs->super)) {
+ ext2fs_set_last_orphan(fs->super, 0);
ext2fs_mark_super_dirty(fs);
}
}
diff --git a/e2fsck/super.c b/e2fsck/super.c
index 7183755c..e1ba8887 100644
--- a/e2fsck/super.c
+++ b/e2fsck/super.c
@@ -248,19 +248,20 @@ static int release_inode_blocks(e2fsck_t ctx, ext2_ino_t ino,
static int release_orphan_inodes(e2fsck_t ctx)
{
ext2_filsys fs = ctx->fs;
- ext2_ino_t ino, next_ino;
+ ext2_ino64_t ino, next_ino;
struct ext2_inode inode;
struct problem_context pctx;
char *block_buf;
- if ((ino = fs->super->s_last_orphan) == 0)
+ ino = ext2fs_get_last_orphan(fs->super);
+ if (ino == 0)
return 0;
/*
* Win or lose, we won't be using the head of the orphan inode
* list again.
*/
- fs->super->s_last_orphan = 0;
+ ext2fs_set_last_orphan(fs->super, 0);
ext2fs_mark_super_dirty(fs);
/*
diff --git a/lib/e2p/ls.c b/lib/e2p/ls.c
index 91a3b0ae..5300b126 100644
--- a/lib/e2p/ls.c
+++ b/lib/e2p/ls.c
@@ -377,9 +377,9 @@ void list_super2(struct ext2_super_block * sb, FILE *f)
if (sb->s_journal_dev)
fprintf(f, "Journal device: 0x%04x\n",
sb->s_journal_dev);
- if (sb->s_last_orphan)
+ if (ext2fs_get_last_orphan(sb))
fprintf(f, "First orphan inode: %u\n",
- sb->s_last_orphan);
+ ext2fs_get_last_orphan(sb));
if (ext2fs_has_feature_dir_index(sb) ||
sb->s_def_hash_version)
fprintf(f, "Default directory hash: %s\n",
diff --git a/lib/ext2fs/ext2_fs.h b/lib/ext2fs/ext2_fs.h
index 1fadae53..f528400b 100644
--- a/lib/ext2fs/ext2_fs.h
+++ b/lib/ext2fs/ext2_fs.h
@@ -740,7 +740,8 @@ struct ext2_super_block {
__le32 s_inodes_count_hi; /* high part of inode count */
__le32 s_free_inodes_count_hi; /* Free inodes count */
__le32 s_prj_quota_inum_hi; /* high part of project quota inode */
- __le32 s_reserved[95]; /* Padding to the end of the block */
+ __le32 s_last_orphan_hi; /* high part of last orphan */
+ __le32 s_reserved[94]; /* Padding to the end of the block */
__u32 s_checksum; /* crc32c(superblock) */
};
diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h
index f5deb650..2e479249 100644
--- a/lib/ext2fs/ext2fs.h
+++ b/lib/ext2fs/ext2fs.h
@@ -2085,6 +2085,25 @@ static inline void ext2fs_set_free_inodes_count(struct ext2_super_block *sb,
sb->s_free_inodes_count = val;
}
+static inline ext2_ino64_t
+ext2fs_get_last_orphan(struct ext2_super_block *sb)
+{
+ ext2_ino64_t last_orphan = sb->s_last_orphan;
+
+ if (ext2fs_has_feature_inode64(sb))
+ last_orphan |= (ext2_ino64_t)sb->s_last_orphan_hi << 32;
+ return last_orphan;
+}
+
+static inline void ext2fs_set_last_orphan(struct ext2_super_block *sb,
+ ext2_ino64_t val)
+{
+ if (ext2fs_has_feature_inode64(sb))
+ sb->s_last_orphan_hi = (__u32)(val >> 32);
+ sb->s_last_orphan = val;
+}
+
+
static inline void ext2fs_inc_free_inodes_count(struct ext2_super_block *sb)
{
__u64 val = ext2fs_get_free_inodes_count(sb);
diff --git a/lib/ext2fs/swapfs.c b/lib/ext2fs/swapfs.c
index 4243e65a..07e4e77d 100644
--- a/lib/ext2fs/swapfs.c
+++ b/lib/ext2fs/swapfs.c
@@ -85,6 +85,7 @@ void ext2fs_swap_super(struct ext2_super_block * sb)
sb->s_overhead_blocks = ext2fs_swab32(sb->s_overhead_blocks);
sb->s_inodes_count_hi = ext2fs_swab32(sb->s_inodes_count_hi);
sb->s_free_inodes_count_hi = ext2fs_swab32(sb->s_free_inodes_count_hi);
+ sb->s_last_orphan_hi = ext2fs_swab32(sb->s_last_orphan_hi);
sb->s_checksum = ext2fs_swab32(sb->s_checksum);
for (i=0; i < 4; i++)
diff --git a/lib/ext2fs/tst_super_size.c b/lib/ext2fs/tst_super_size.c
index 1fa49bb2..0908e254 100644
--- a/lib/ext2fs/tst_super_size.c
+++ b/lib/ext2fs/tst_super_size.c
@@ -145,7 +145,8 @@ int main(int argc, char **argv)
check_field(s_inodes_count_hi, 4);
check_field(s_free_inodes_count_hi, 4);
check_field(s_prj_quota_inum_hi, 4);
- check_field(s_reserved, 95 * 4);
+ check_field(s_last_orphan_hi, 4);
+ check_field(s_reserved, 94 * 4);
check_field(s_checksum, 4);
do_field("Superblock end", 0, 0, cur_offset, 1024);
#endif
diff --git a/misc/fuse2fs.c b/misc/fuse2fs.c
index bb21e2b4..7c3f3b52 100644
--- a/misc/fuse2fs.c
+++ b/misc/fuse2fs.c
@@ -3822,7 +3822,7 @@ int main(int argc, char *argv[])
global_fs->super->s_checkinterval) <= time(0))
printf("%s", _("Warning: Check time reached; running e2fsck "
"is recommended.\n"));
- if (global_fs->super->s_last_orphan)
+ if (ext2fs_get_last_orphan(global_fs->super))
printf("%s",
_("Orphans detected; running e2fsck is recommended.\n"));
--
2.14.3 (Apple Git-98)
Powered by blists - more mailing lists