diff options
Diffstat (limited to 'fs/btrfs/super.c')
| -rw-r--r-- | fs/btrfs/super.c | 40 | 
1 files changed, 24 insertions, 16 deletions
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 9744af9d71e..3536bdb2d7c 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -68,7 +68,7 @@ enum {  	Opt_degraded, Opt_subvol, Opt_device, Opt_nodatasum, Opt_nodatacow,  	Opt_max_extent, Opt_max_inline, Opt_alloc_start, Opt_nobarrier,  	Opt_ssd, Opt_thread_pool, Opt_noacl,  Opt_compress, Opt_notreelog, -	Opt_flushoncommit, Opt_err, +	Opt_ratio, Opt_flushoncommit, Opt_err,  };  static match_table_t tokens = { @@ -87,6 +87,7 @@ static match_table_t tokens = {  	{Opt_noacl, "noacl"},  	{Opt_notreelog, "notreelog"},  	{Opt_flushoncommit, "flushoncommit"}, +	{Opt_ratio, "metadata_ratio=%d"},  	{Opt_err, NULL},  }; @@ -195,7 +196,7 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)  				info->max_extent = max_t(u64,  					info->max_extent, root->sectorsize);  				printk(KERN_INFO "btrfs: max_extent at %llu\n", -				       info->max_extent); +				       (unsigned long long)info->max_extent);  			}  			break;  		case Opt_max_inline: @@ -210,7 +211,7 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)  						root->sectorsize);  				}  				printk(KERN_INFO "btrfs: max_inline at %llu\n", -					info->max_inline); +					(unsigned long long)info->max_inline);  			}  			break;  		case Opt_alloc_start: @@ -220,7 +221,7 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)  				kfree(num);  				printk(KERN_INFO  					"btrfs: allocations start at %llu\n", -					info->alloc_start); +					(unsigned long long)info->alloc_start);  			}  			break;  		case Opt_noacl: @@ -234,6 +235,15 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)  			printk(KERN_INFO "btrfs: turning on flush-on-commit\n");  			btrfs_set_opt(info->mount_opt, FLUSHONCOMMIT);  			break; +		case Opt_ratio: +			intarg = 0; +			match_int(&args[0], &intarg); +			if (intarg) { +				info->metadata_ratio = intarg; +				printk(KERN_INFO "btrfs: metadata ratio %d\n", +				       info->metadata_ratio); +			} +			break;  		default:  			break;  		} @@ -410,11 +420,14 @@ static int btrfs_show_options(struct seq_file *seq, struct vfsmount *vfs)  	if (btrfs_test_opt(root, NOBARRIER))  		seq_puts(seq, ",nobarrier");  	if (info->max_extent != (u64)-1) -		seq_printf(seq, ",max_extent=%llu", info->max_extent); +		seq_printf(seq, ",max_extent=%llu", +			   (unsigned long long)info->max_extent);  	if (info->max_inline != 8192 * 1024) -		seq_printf(seq, ",max_inline=%llu", info->max_inline); +		seq_printf(seq, ",max_inline=%llu", +			   (unsigned long long)info->max_inline);  	if (info->alloc_start != 0) -		seq_printf(seq, ",alloc_start=%llu", info->alloc_start); +		seq_printf(seq, ",alloc_start=%llu", +			   (unsigned long long)info->alloc_start);  	if (info->thread_pool_size !=  min_t(unsigned long,  					     num_online_cpus() + 2, 8))  		seq_printf(seq, ",thread_pool=%d", info->thread_pool_size); @@ -635,14 +648,9 @@ static long btrfs_control_ioctl(struct file *file, unsigned int cmd,  	if (!capable(CAP_SYS_ADMIN))  		return -EPERM; -	vol = kmalloc(sizeof(*vol), GFP_KERNEL); -	if (!vol) -		return -ENOMEM; - -	if (copy_from_user(vol, (void __user *)arg, sizeof(*vol))) { -		ret = -EFAULT; -		goto out; -	} +	vol = memdup_user((void __user *)arg, sizeof(*vol)); +	if (IS_ERR(vol)) +		return PTR_ERR(vol);  	switch (cmd) {  	case BTRFS_IOC_SCAN_DEV: @@ -650,7 +658,7 @@ static long btrfs_control_ioctl(struct file *file, unsigned int cmd,  					    &btrfs_fs_type, &fs_devices);  		break;  	} -out: +  	kfree(vol);  	return ret;  }  |