aboutsummaryrefslogtreecommitdiffstats
path: root/block/ioctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'block/ioctl.c')
-rw-r--r--block/ioctl.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/block/ioctl.c b/block/ioctl.c
index e1109491c234..9cfa2e1ecb24 100644
--- a/block/ioctl.c
+++ b/block/ioctl.c
@@ -5,6 +5,7 @@
5#include <linux/backing-dev.h> 5#include <linux/backing-dev.h>
6#include <linux/buffer_head.h> 6#include <linux/buffer_head.h>
7#include <linux/smp_lock.h> 7#include <linux/smp_lock.h>
8#include <linux/blktrace_api.h>
8#include <asm/uaccess.h> 9#include <asm/uaccess.h>
9 10
10static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user *arg) 11static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user *arg)
@@ -42,9 +43,9 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user
42 return -EINVAL; 43 return -EINVAL;
43 } 44 }
44 /* partition number in use? */ 45 /* partition number in use? */
45 down(&bdev->bd_sem); 46 mutex_lock(&bdev->bd_mutex);
46 if (disk->part[part - 1]) { 47 if (disk->part[part - 1]) {
47 up(&bdev->bd_sem); 48 mutex_unlock(&bdev->bd_mutex);
48 return -EBUSY; 49 return -EBUSY;
49 } 50 }
50 /* overlap? */ 51 /* overlap? */
@@ -55,13 +56,13 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user
55 continue; 56 continue;
56 if (!(start+length <= s->start_sect || 57 if (!(start+length <= s->start_sect ||
57 start >= s->start_sect + s->nr_sects)) { 58 start >= s->start_sect + s->nr_sects)) {
58 up(&bdev->bd_sem); 59 mutex_unlock(&bdev->bd_mutex);
59 return -EBUSY; 60 return -EBUSY;
60 } 61 }
61 } 62 }
62 /* all seems OK */ 63 /* all seems OK */
63 add_partition(disk, part, start, length); 64 add_partition(disk, part, start, length);
64 up(&bdev->bd_sem); 65 mutex_unlock(&bdev->bd_mutex);
65 return 0; 66 return 0;
66 case BLKPG_DEL_PARTITION: 67 case BLKPG_DEL_PARTITION:
67 if (!disk->part[part-1]) 68 if (!disk->part[part-1])
@@ -71,9 +72,9 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user
71 bdevp = bdget_disk(disk, part); 72 bdevp = bdget_disk(disk, part);
72 if (!bdevp) 73 if (!bdevp)
73 return -ENOMEM; 74 return -ENOMEM;
74 down(&bdevp->bd_sem); 75 mutex_lock(&bdevp->bd_mutex);
75 if (bdevp->bd_openers) { 76 if (bdevp->bd_openers) {
76 up(&bdevp->bd_sem); 77 mutex_unlock(&bdevp->bd_mutex);
77 bdput(bdevp); 78 bdput(bdevp);
78 return -EBUSY; 79 return -EBUSY;
79 } 80 }
@@ -81,10 +82,10 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user
81 fsync_bdev(bdevp); 82 fsync_bdev(bdevp);
82 invalidate_bdev(bdevp, 0); 83 invalidate_bdev(bdevp, 0);
83 84
84 down(&bdev->bd_sem); 85 mutex_lock(&bdev->bd_mutex);
85 delete_partition(disk, part); 86 delete_partition(disk, part);
86 up(&bdev->bd_sem); 87 mutex_unlock(&bdev->bd_mutex);
87 up(&bdevp->bd_sem); 88 mutex_unlock(&bdevp->bd_mutex);
88 bdput(bdevp); 89 bdput(bdevp);
89 90
90 return 0; 91 return 0;
@@ -102,10 +103,10 @@ static int blkdev_reread_part(struct block_device *bdev)
102 return -EINVAL; 103 return -EINVAL;
103 if (!capable(CAP_SYS_ADMIN)) 104 if (!capable(CAP_SYS_ADMIN))
104 return -EACCES; 105 return -EACCES;
105 if (down_trylock(&bdev->bd_sem)) 106 if (!mutex_trylock(&bdev->bd_mutex))
106 return -EBUSY; 107 return -EBUSY;
107 res = rescan_partitions(disk, bdev); 108 res = rescan_partitions(disk, bdev);
108 up(&bdev->bd_sem); 109 mutex_unlock(&bdev->bd_mutex);
109 return res; 110 return res;
110} 111}
111 112
@@ -189,6 +190,11 @@ static int blkdev_locked_ioctl(struct file *file, struct block_device *bdev,
189 return put_ulong(arg, bdev->bd_inode->i_size >> 9); 190 return put_ulong(arg, bdev->bd_inode->i_size >> 9);
190 case BLKGETSIZE64: 191 case BLKGETSIZE64:
191 return put_u64(arg, bdev->bd_inode->i_size); 192 return put_u64(arg, bdev->bd_inode->i_size);
193 case BLKTRACESTART:
194 case BLKTRACESTOP:
195 case BLKTRACESETUP:
196 case BLKTRACETEARDOWN:
197 return blk_trace_ioctl(bdev, cmd, (char __user *) arg);
192 } 198 }
193 return -ENOIOCTLCMD; 199 return -ENOIOCTLCMD;
194} 200}