diff options
Diffstat (limited to 'fs/ext4/super.c')
| -rw-r--r-- | fs/ext4/super.c | 66 | 
1 files changed, 20 insertions, 46 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 044135796f2b..c682fb927b64 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -244,7 +244,7 @@ static struct buffer_head *__ext4_sb_bread_gfp(struct super_block *sb,  struct buffer_head *ext4_sb_bread(struct super_block *sb, sector_t block,  				   blk_opf_t op_flags)  { -	gfp_t gfp = mapping_gfp_constraint(sb->s_bdev->bd_inode->i_mapping, +	gfp_t gfp = mapping_gfp_constraint(sb->s_bdev->bd_mapping,  			~__GFP_FS) | __GFP_MOVABLE;  	return __ext4_sb_bread_gfp(sb, block, op_flags, gfp); @@ -253,7 +253,7 @@ struct buffer_head *ext4_sb_bread(struct super_block *sb, sector_t block,  struct buffer_head *ext4_sb_bread_unmovable(struct super_block *sb,  					    sector_t block)  { -	gfp_t gfp = mapping_gfp_constraint(sb->s_bdev->bd_inode->i_mapping, +	gfp_t gfp = mapping_gfp_constraint(sb->s_bdev->bd_mapping,  			~__GFP_FS);  	return __ext4_sb_bread_gfp(sb, block, 0, gfp); @@ -492,22 +492,6 @@ static void ext4_maybe_update_superblock(struct super_block *sb)  		schedule_work(&EXT4_SB(sb)->s_sb_upd_work);  } -/* - * The del_gendisk() function uninitializes the disk-specific data - * structures, including the bdi structure, without telling anyone - * else.  Once this happens, any attempt to call mark_buffer_dirty() - * (for example, by ext4_commit_super), will cause a kernel OOPS. - * This is a kludge to prevent these oops until we can put in a proper - * hook in del_gendisk() to inform the VFS and file system layers. - */ -static int block_device_ejected(struct super_block *sb) -{ -	struct inode *bd_inode = sb->s_bdev->bd_inode; -	struct backing_dev_info *bdi = inode_to_bdi(bd_inode); - -	return bdi->dev == NULL; -} -  static void ext4_journal_commit_callback(journal_t *journal, transaction_t *txn)  {  	struct super_block		*sb = journal->j_private; @@ -1723,10 +1707,6 @@ static const struct constant_table ext4_param_dax[] = {  	{}  }; -/* String parameter that allows empty argument */ -#define fsparam_string_empty(NAME, OPT) \ -	__fsparam(fs_param_is_string, NAME, OPT, fs_param_can_be_empty, NULL) -  /*   * Mount option specification   * We don't use fsparam_flag_no because of the way we set the @@ -2078,8 +2058,7 @@ static int unnote_qf_name(struct fs_context *fc, int qtype)  {  	struct ext4_fs_context *ctx = fc->fs_private; -	if (ctx->s_qf_names[qtype]) -		kfree(ctx->s_qf_names[qtype]); +	kfree(ctx->s_qf_names[qtype]);  	ctx->s_qf_names[qtype] = NULL;  	ctx->qname_spec |= 1 << qtype; @@ -2484,8 +2463,7 @@ static int parse_options(struct fs_context *fc, char *options)  			param.size = v_len;  			ret = ext4_parse_param(fc, ¶m); -			if (param.string) -				kfree(param.string); +			kfree(param.string);  			if (ret < 0)  				return ret;  		} @@ -5342,6 +5320,7 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)  	sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP | QTYPE_MASK_PRJ;  #endif  	super_set_uuid(sb, es->s_uuid, sizeof(es->s_uuid)); +	super_set_sysfs_name_bdev(sb);  	INIT_LIST_HEAD(&sbi->s_orphan); /* unlinked but open files */  	mutex_init(&sbi->s_orphan_lock); @@ -5551,19 +5530,15 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)  	if (err)  		goto failed_mount6; -	err = ext4_register_sysfs(sb); -	if (err) -		goto failed_mount7; -  	err = ext4_init_orphan_info(sb);  	if (err) -		goto failed_mount8; +		goto failed_mount7;  #ifdef CONFIG_QUOTA  	/* Enable quota usage during mount. */  	if (ext4_has_feature_quota(sb) && !sb_rdonly(sb)) {  		err = ext4_enable_quotas(sb);  		if (err) -			goto failed_mount9; +			goto failed_mount8;  	}  #endif  /* CONFIG_QUOTA */ @@ -5572,7 +5547,7 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)  	 * used to detect the metadata async write error.  	 */  	spin_lock_init(&sbi->s_bdev_wb_lock); -	errseq_check_and_advance(&sb->s_bdev->bd_inode->i_mapping->wb_err, +	errseq_check_and_advance(&sb->s_bdev->bd_mapping->wb_err,  				 &sbi->s_bdev_wb_err);  	EXT4_SB(sb)->s_mount_state |= EXT4_ORPHAN_FS;  	ext4_orphan_cleanup(sb, es); @@ -5589,7 +5564,7 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)  		ext4_msg(sb, KERN_INFO, "recovery complete");  		err = ext4_mark_recovery_complete(sb, es);  		if (err) -			goto failed_mount10; +			goto failed_mount9;  	}  	if (test_opt(sb, DISCARD) && !bdev_max_discard_sectors(sb->s_bdev)) @@ -5606,15 +5581,17 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)  	atomic_set(&sbi->s_warning_count, 0);  	atomic_set(&sbi->s_msg_count, 0); +	/* Register sysfs after all initializations are complete. */ +	err = ext4_register_sysfs(sb); +	if (err) +		goto failed_mount9; +  	return 0; -failed_mount10: +failed_mount9:  	ext4_quotas_off(sb, EXT4_MAXQUOTAS); -failed_mount9: __maybe_unused +failed_mount8: __maybe_unused  	ext4_release_orphan_info(sb); -failed_mount8: -	ext4_unregister_sysfs(sb); -	kobject_put(&sbi->s_kobj);  failed_mount7:  	ext4_unregister_li_request(sb);  failed_mount6: @@ -5873,7 +5850,7 @@ static struct file *ext4_get_journal_blkdev(struct super_block *sb,  	sb_block = EXT4_MIN_BLOCK_SIZE / blocksize;  	offset = EXT4_MIN_BLOCK_SIZE % blocksize; -	set_blocksize(bdev, blocksize); +	set_blocksize(bdev_file, blocksize);  	bh = __bread(bdev, sb_block, blocksize);  	if (!bh) {  		ext4_msg(sb, KERN_ERR, "couldn't read superblock of " @@ -6130,8 +6107,8 @@ static void ext4_update_super(struct super_block *sb)  			__ext4_update_tstamp(&es->s_first_error_time,  					     &es->s_first_error_time_hi,  					     sbi->s_first_error_time); -			strncpy(es->s_first_error_func, sbi->s_first_error_func, -				sizeof(es->s_first_error_func)); +			strtomem_pad(es->s_first_error_func, +				     sbi->s_first_error_func, 0);  			es->s_first_error_line =  				cpu_to_le32(sbi->s_first_error_line);  			es->s_first_error_ino = @@ -6144,8 +6121,7 @@ static void ext4_update_super(struct super_block *sb)  		__ext4_update_tstamp(&es->s_last_error_time,  				     &es->s_last_error_time_hi,  				     sbi->s_last_error_time); -		strncpy(es->s_last_error_func, sbi->s_last_error_func, -			sizeof(es->s_last_error_func)); +		strtomem_pad(es->s_last_error_func, sbi->s_last_error_func, 0);  		es->s_last_error_line = cpu_to_le32(sbi->s_last_error_line);  		es->s_last_error_ino = cpu_to_le32(sbi->s_last_error_ino);  		es->s_last_error_block = cpu_to_le64(sbi->s_last_error_block); @@ -6172,8 +6148,6 @@ static int ext4_commit_super(struct super_block *sb)  	if (!sbh)  		return -EINVAL; -	if (block_device_ejected(sb)) -		return -ENODEV;  	ext4_update_super(sb);  |