diff options
Diffstat (limited to 'block/ioctl.c')
-rw-r--r-- | block/ioctl.c | 28 |
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 | ||
10 | static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user *arg) | 11 | static 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 | } |