All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 1/6] ext4: sysfs: print ext4_super_block fields as little-endian
@ 2018-07-11  9:14 Arnd Bergmann
  2018-07-11  9:14 ` [PATCH v2 2/6] ext4: use 64-bit timestamps for mmp_time Arnd Bergmann
                   ` (5 more replies)
  0 siblings, 6 replies; 12+ messages in thread
From: Arnd Bergmann @ 2018-07-11  9:14 UTC (permalink / raw)
  To: adilger.kernel
  Cc: arnd, jack, linux-ext4, linux-kernel, sirmy15, stable,
	tgnottingham, tytso, y2038

While working on extended rand for last_error/first_error timestamps,
I noticed that the endianess is wrong, we access the little-endian
fields in struct ext4_super_block as native-endian when we print them.

This adds a special case in ext4_attr_show() and ext4_attr_store()
to byteswap the superblock fields if needed.

In older kernels, this code was part of super.c, it got moved to sysfs.c
in linux-4.4.

Cc: stable@vger.kernel.org
Fixes: 52c198c6820f ("ext4: add sysfs entry showing whether the fs contains errors")
Reviewed-by: Andreas Dilger <adilger@dilger.ca>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 fs/ext4/sysfs.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/fs/ext4/sysfs.c b/fs/ext4/sysfs.c
index f34da0bb8f17..b970a200f20c 100644
--- a/fs/ext4/sysfs.c
+++ b/fs/ext4/sysfs.c
@@ -274,8 +274,12 @@ static ssize_t ext4_attr_show(struct kobject *kobj,
 	case attr_pointer_ui:
 		if (!ptr)
 			return 0;
-		return snprintf(buf, PAGE_SIZE, "%u\n",
-				*((unsigned int *) ptr));
+		if (a->attr_ptr == ptr_ext4_super_block_offset)
+			return snprintf(buf, PAGE_SIZE, "%u\n",
+					le32_to_cpup(ptr));
+		else
+			return snprintf(buf, PAGE_SIZE, "%u\n",
+					*((unsigned int *) ptr));
 	case attr_pointer_atomic:
 		if (!ptr)
 			return 0;
@@ -308,7 +312,10 @@ static ssize_t ext4_attr_store(struct kobject *kobj,
 		ret = kstrtoul(skip_spaces(buf), 0, &t);
 		if (ret)
 			return ret;
-		*((unsigned int *) ptr) = t;
+		if (a->attr_ptr == ptr_ext4_super_block_offset)
+			*((__le32 *) ptr) = cpu_to_le32(t);
+		else
+			*((unsigned int *) ptr) = t;
 		return len;
 	case attr_inode_readahead:
 		return inode_readahead_blks_store(sbi, buf, len);
-- 
2.9.0

^ permalink raw reply related	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2018-07-22 18:55 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-07-11  9:14 [PATCH v2 1/6] ext4: sysfs: print ext4_super_block fields as little-endian Arnd Bergmann
2018-07-11  9:14 ` [PATCH v2 2/6] ext4: use 64-bit timestamps for mmp_time Arnd Bergmann
2018-07-22 18:06   ` Theodore Y. Ts'o
2018-07-11  9:14 ` [PATCH v2 3/6] ext4: use ktime_get_real_seconds for i_dtime Arnd Bergmann
2018-07-22 18:07   ` Theodore Y. Ts'o
2018-07-11  9:14 ` [PATCH v2 4/6] ext4: use timespec64 for all inode times Arnd Bergmann
2018-07-22 18:08   ` Theodore Y. Ts'o
2018-07-11  9:14 ` [PATCH v2 5/6] jbd2: replace current_kernel_time64 with ktime equivalent Arnd Bergmann
2018-07-22 18:54   ` Theodore Y. Ts'o
2018-07-11  9:14 ` [PATCH v2 6/6] ext4: super: extend timestamps to 40 bits Arnd Bergmann
2018-07-22 18:55   ` Theodore Y. Ts'o
2018-07-22 17:23 ` [PATCH v2 1/6] ext4: sysfs: print ext4_super_block fields as little-endian Theodore Y. Ts'o

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.