mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	ext4: sysfs: print ext4_super_block fields as little-endian
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: 52c198c682 ("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>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
			
			
This commit is contained in:
		
							parent
							
								
									66d3239a4d
								
							
						
					
					
						commit
						a4d2aadca1
					
				
					 1 changed files with 10 additions and 3 deletions
				
			
		|  | @ -274,8 +274,12 @@ static ssize_t ext4_attr_show(struct kobject *kobj, | ||||||
| 	case attr_pointer_ui: | 	case attr_pointer_ui: | ||||||
| 		if (!ptr) | 		if (!ptr) | ||||||
| 			return 0; | 			return 0; | ||||||
| 		return snprintf(buf, PAGE_SIZE, "%u\n", | 		if (a->attr_ptr == ptr_ext4_super_block_offset) | ||||||
| 				*((unsigned int *) ptr)); | 			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: | 	case attr_pointer_atomic: | ||||||
| 		if (!ptr) | 		if (!ptr) | ||||||
| 			return 0; | 			return 0; | ||||||
|  | @ -308,7 +312,10 @@ static ssize_t ext4_attr_store(struct kobject *kobj, | ||||||
| 		ret = kstrtoul(skip_spaces(buf), 0, &t); | 		ret = kstrtoul(skip_spaces(buf), 0, &t); | ||||||
| 		if (ret) | 		if (ret) | ||||||
| 			return 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; | 		return len; | ||||||
| 	case attr_inode_readahead: | 	case attr_inode_readahead: | ||||||
| 		return inode_readahead_blks_store(sbi, buf, len); | 		return inode_readahead_blks_store(sbi, buf, len); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Arnd Bergmann
						Arnd Bergmann