mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	ext4: do not allow journal_opts for fs w/o journal
It is appeared that we can pass journal related mount options and such options
be shown in /proc/mounts
Example:
#mkfs.ext4 -F /dev/vdb
#tune2fs -O ^has_journal /dev/vdb
#mount /dev/vdb /mnt/  -ocommit=20,journal_async_commit
#cat /proc/mounts  | grep /mnt
 /dev/vdb /mnt ext4 rw,relatime,journal_checksum,journal_async_commit,commit=20,data=ordered 0 0
But options:"journal_checksum,journal_async_commit,commit=20,data=ordered" has
nothing with reality because there is no journal at all.
This patch disallow following options for journalless configurations:
 - journal_checksum
 - journal_async_commit
 - commit=%ld
 - data={writeback,ordered,journal}
Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Reviewed-by: Andreas Dilger <adilger@dilger.ca>
			
			
This commit is contained in:
		
							parent
							
								
									c93cf2d757
								
							
						
					
					
						commit
						1e381f60da
					
				
					 2 changed files with 32 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -1023,6 +1023,9 @@ struct ext4_inode_info {
 | 
			
		|||
#define EXT4_MOUNT2_HURD_COMPAT		0x00000004 /* Support HURD-castrated
 | 
			
		||||
						      file systems */
 | 
			
		||||
 | 
			
		||||
#define EXT4_MOUNT2_EXPLICIT_JOURNAL_CHECKSUM	0x00000008 /* User explicitly
 | 
			
		||||
						specified journal checksum */
 | 
			
		||||
 | 
			
		||||
#define clear_opt(sb, opt)		EXT4_SB(sb)->s_mount_opt &= \
 | 
			
		||||
						~EXT4_MOUNT_##opt
 | 
			
		||||
#define set_opt(sb, opt)		EXT4_SB(sb)->s_mount_opt |= \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1384,10 +1384,10 @@ static const struct mount_opts {
 | 
			
		|||
	{Opt_nojournal_checksum, EXT4_MOUNT_JOURNAL_CHECKSUM,
 | 
			
		||||
	 MOPT_EXT4_ONLY | MOPT_CLEAR},
 | 
			
		||||
	{Opt_journal_checksum, EXT4_MOUNT_JOURNAL_CHECKSUM,
 | 
			
		||||
	 MOPT_EXT4_ONLY | MOPT_SET},
 | 
			
		||||
	 MOPT_EXT4_ONLY | MOPT_SET | MOPT_EXPLICIT},
 | 
			
		||||
	{Opt_journal_async_commit, (EXT4_MOUNT_JOURNAL_ASYNC_COMMIT |
 | 
			
		||||
				    EXT4_MOUNT_JOURNAL_CHECKSUM),
 | 
			
		||||
	 MOPT_EXT4_ONLY | MOPT_SET},
 | 
			
		||||
	 MOPT_EXT4_ONLY | MOPT_SET | MOPT_EXPLICIT},
 | 
			
		||||
	{Opt_noload, EXT4_MOUNT_NOLOAD, MOPT_NO_EXT2 | MOPT_SET},
 | 
			
		||||
	{Opt_err_panic, EXT4_MOUNT_ERRORS_PANIC, MOPT_SET | MOPT_CLEAR_ERR},
 | 
			
		||||
	{Opt_err_ro, EXT4_MOUNT_ERRORS_RO, MOPT_SET | MOPT_CLEAR_ERR},
 | 
			
		||||
| 
						 | 
				
			
			@ -1519,6 +1519,8 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token,
 | 
			
		|||
	if (m->flags & MOPT_EXPLICIT) {
 | 
			
		||||
		if (m->mount_opt & EXT4_MOUNT_DELALLOC) {
 | 
			
		||||
			set_opt2(sb, EXPLICIT_DELALLOC);
 | 
			
		||||
		} else if (m->mount_opt & EXT4_MOUNT_JOURNAL_CHECKSUM) {
 | 
			
		||||
			set_opt2(sb, EXPLICIT_JOURNAL_CHECKSUM);
 | 
			
		||||
		} else
 | 
			
		||||
			return -1;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -3677,6 +3679,31 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
 | 
			
		|||
		       "suppressed and not mounted read-only");
 | 
			
		||||
		goto failed_mount_wq;
 | 
			
		||||
	} else {
 | 
			
		||||
		/* Nojournal mode, all journal mount options are illegal */
 | 
			
		||||
		if (test_opt2(sb, EXPLICIT_JOURNAL_CHECKSUM)) {
 | 
			
		||||
			ext4_msg(sb, KERN_ERR, "can't mount with "
 | 
			
		||||
				 "journal_checksum, fs mounted w/o journal");
 | 
			
		||||
			goto failed_mount_wq;
 | 
			
		||||
		}
 | 
			
		||||
		if (test_opt(sb, JOURNAL_ASYNC_COMMIT)) {
 | 
			
		||||
			ext4_msg(sb, KERN_ERR, "can't mount with "
 | 
			
		||||
				 "journal_async_commit, fs mounted w/o journal");
 | 
			
		||||
			goto failed_mount_wq;
 | 
			
		||||
		}
 | 
			
		||||
		if (sbi->s_commit_interval != JBD2_DEFAULT_MAX_COMMIT_AGE*HZ) {
 | 
			
		||||
			ext4_msg(sb, KERN_ERR, "can't mount with "
 | 
			
		||||
				 "commit=%lu, fs mounted w/o journal",
 | 
			
		||||
				 sbi->s_commit_interval / HZ);
 | 
			
		||||
			goto failed_mount_wq;
 | 
			
		||||
		}
 | 
			
		||||
		if (EXT4_MOUNT_DATA_FLAGS &
 | 
			
		||||
		    (sbi->s_mount_opt ^ sbi->s_def_mount_opt)) {
 | 
			
		||||
			ext4_msg(sb, KERN_ERR, "can't mount with "
 | 
			
		||||
				 "data=, fs mounted w/o journal");
 | 
			
		||||
			goto failed_mount_wq;
 | 
			
		||||
		}
 | 
			
		||||
		sbi->s_def_mount_opt &= EXT4_MOUNT_JOURNAL_CHECKSUM;
 | 
			
		||||
		clear_opt(sb, JOURNAL_CHECKSUM);
 | 
			
		||||
		clear_opt(sb, DATA_FLAGS);
 | 
			
		||||
		sbi->s_journal = NULL;
 | 
			
		||||
		needs_recovery = 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue