diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/ext4/mballoc.c | 16 | 
1 files changed, 13 insertions, 3 deletions
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 585c2595018..9122271e3d6 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -2786,14 +2786,20 @@ static int ext4_mb_init_per_dev_proc(struct super_block *sb)  	mode_t mode = S_IFREG | S_IRUGO | S_IWUSR;  	struct ext4_sb_info *sbi = EXT4_SB(sb);  	struct proc_dir_entry *proc; -	char devname[64]; +	char devname[BDEVNAME_SIZE], *p;  	if (proc_root_ext4 == NULL) {  		sbi->s_mb_proc = NULL;  		return -EINVAL;  	}  	bdevname(sb->s_bdev, devname); +	p = devname; +	while ((p = strchr(p, '/'))) +		*p = '!'; +  	sbi->s_mb_proc = proc_mkdir(devname, proc_root_ext4); +	if (!sbi->s_mb_proc) +		goto err_create_dir;  	MB_PROC_HANDLER(EXT4_MB_STATS_NAME, stats);  	MB_PROC_HANDLER(EXT4_MB_MAX_TO_SCAN_NAME, max_to_scan); @@ -2805,7 +2811,6 @@ static int ext4_mb_init_per_dev_proc(struct super_block *sb)  	return 0;  err_out: -	printk(KERN_ERR "EXT4-fs: Unable to create %s\n", devname);  	remove_proc_entry(EXT4_MB_GROUP_PREALLOC, sbi->s_mb_proc);  	remove_proc_entry(EXT4_MB_STREAM_REQ, sbi->s_mb_proc);  	remove_proc_entry(EXT4_MB_ORDER2_REQ, sbi->s_mb_proc); @@ -2814,6 +2819,8 @@ err_out:  	remove_proc_entry(EXT4_MB_STATS_NAME, sbi->s_mb_proc);  	remove_proc_entry(devname, proc_root_ext4);  	sbi->s_mb_proc = NULL; +err_create_dir: +	printk(KERN_ERR "EXT4-fs: Unable to create %s\n", devname);  	return -ENOMEM;  } @@ -2821,12 +2828,15 @@ err_out:  static int ext4_mb_destroy_per_dev_proc(struct super_block *sb)  {  	struct ext4_sb_info *sbi = EXT4_SB(sb); -	char devname[64]; +	char devname[BDEVNAME_SIZE], *p;  	if (sbi->s_mb_proc == NULL)  		return -EINVAL;  	bdevname(sb->s_bdev, devname); +	p = devname; +	while ((p = strchr(p, '/'))) +		*p = '!';  	remove_proc_entry(EXT4_MB_GROUP_PREALLOC, sbi->s_mb_proc);  	remove_proc_entry(EXT4_MB_STREAM_REQ, sbi->s_mb_proc);  	remove_proc_entry(EXT4_MB_ORDER2_REQ, sbi->s_mb_proc);  | 
