Blame view

block/ioctl.c 10.7 KB
c59ede7b7   Randy.Dunlap   [PATCH] move capa...
1
  #include <linux/capability.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
  #include <linux/blkdev.h>
d5decd3b9   Paul Gortmaker   block: add export...
3
  #include <linux/export.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
4
  #include <linux/gfp.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5
  #include <linux/blkpg.h>
a885c8c43   Christoph Hellwig   [PATCH] Add block...
6
  #include <linux/hdreg.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7
  #include <linux/backing-dev.h>
ff01bb483   Al Viro   fs: move code out...
8
  #include <linux/fs.h>
2056a782f   Jens Axboe   [PATCH] Block que...
9
  #include <linux/blktrace_api.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
10
11
12
13
14
15
  #include <asm/uaccess.h>
  
  static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user *arg)
  {
  	struct block_device *bdevp;
  	struct gendisk *disk;
c83f6bf98   Vivek Goyal   block: add partit...
16
  	struct hd_struct *part, *lpart;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
17
18
  	struct blkpg_ioctl_arg a;
  	struct blkpg_partition p;
e71bf0d0e   Tejun Heo   block: fix disk->...
19
  	struct disk_part_iter piter;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
20
  	long long start, length;
cf771cb5a   Tejun Heo   block: make varia...
21
  	int partno;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22
23
24
25
26
27
28
29
30
31
  
  	if (!capable(CAP_SYS_ADMIN))
  		return -EACCES;
  	if (copy_from_user(&a, arg, sizeof(struct blkpg_ioctl_arg)))
  		return -EFAULT;
  	if (copy_from_user(&p, a.data, sizeof(struct blkpg_partition)))
  		return -EFAULT;
  	disk = bdev->bd_disk;
  	if (bdev != bdev->bd_contains)
  		return -EINVAL;
cf771cb5a   Tejun Heo   block: make varia...
32
  	partno = p.pno;
540eed563   Tejun Heo   block: make parti...
33
  	if (partno <= 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
35
36
37
38
  		return -EINVAL;
  	switch (a.op) {
  		case BLKPG_ADD_PARTITION:
  			start = p.start >> 9;
  			length = p.length >> 9;
c83f6bf98   Vivek Goyal   block: add partit...
39
40
  			/* check for fit in a hd_struct */
  			if (sizeof(sector_t) == sizeof(long) &&
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41
42
43
  			    sizeof(long long) > sizeof(long)) {
  				long pstart = start, plength = length;
  				if (pstart != start || plength != length
2bd6efad2   Alan Cox   blk: add an upper...
44
  				    || pstart < 0 || plength < 0 || partno > 65535)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
46
  					return -EINVAL;
  			}
88e341261   Tejun Heo   block: update add...
47

c039e3134   Arjan van de Ven   [PATCH] sem2mutex...
48
  			mutex_lock(&bdev->bd_mutex);
88e341261   Tejun Heo   block: update add...
49

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50
  			/* overlap? */
e71bf0d0e   Tejun Heo   block: fix disk->...
51
52
53
54
55
56
  			disk_part_iter_init(&piter, disk,
  					    DISK_PITER_INCL_EMPTY);
  			while ((part = disk_part_iter_next(&piter))) {
  				if (!(start + length <= part->start_sect ||
  				      start >= part->start_sect + part->nr_sects)) {
  					disk_part_iter_exit(&piter);
c039e3134   Arjan van de Ven   [PATCH] sem2mutex...
57
  					mutex_unlock(&bdev->bd_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
58
59
60
  					return -EBUSY;
  				}
  			}
e71bf0d0e   Tejun Heo   block: fix disk->...
61
  			disk_part_iter_exit(&piter);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
62
  			/* all seems OK */
ba32929a9   Tejun Heo   block: make add_p...
63
  			part = add_partition(disk, partno, start, length,
6d1d8050b   Will Drewry   block, partition:...
64
  					     ADDPART_FLAG_NONE, NULL);
c039e3134   Arjan van de Ven   [PATCH] sem2mutex...
65
  			mutex_unlock(&bdev->bd_mutex);
c7d1ba417   Duan Jiong   block: replace IS...
66
  			return PTR_ERR_OR_ZERO(part);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
67
  		case BLKPG_DEL_PARTITION:
e71bf0d0e   Tejun Heo   block: fix disk->...
68
69
  			part = disk_get_part(disk, partno);
  			if (!part)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
70
  				return -ENXIO;
e71bf0d0e   Tejun Heo   block: fix disk->...
71
72
73
  
  			bdevp = bdget(part_devt(part));
  			disk_put_part(part);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
74
75
  			if (!bdevp)
  				return -ENOMEM;
e71bf0d0e   Tejun Heo   block: fix disk->...
76

2e7b651df   Peter Zijlstra   [PATCH] remove th...
77
  			mutex_lock(&bdevp->bd_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78
  			if (bdevp->bd_openers) {
c039e3134   Arjan van de Ven   [PATCH] sem2mutex...
79
  				mutex_unlock(&bdevp->bd_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
81
82
83
84
  				bdput(bdevp);
  				return -EBUSY;
  			}
  			/* all seems OK */
  			fsync_bdev(bdevp);
f98393a64   Peter Zijlstra   mm: remove destro...
85
  			invalidate_bdev(bdevp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
86

6d740cd5b   Peter Zijlstra   [PATCH] lockdep: ...
87
  			mutex_lock_nested(&bdev->bd_mutex, 1);
cf771cb5a   Tejun Heo   block: make varia...
88
  			delete_partition(disk, partno);
c039e3134   Arjan van de Ven   [PATCH] sem2mutex...
89
90
  			mutex_unlock(&bdev->bd_mutex);
  			mutex_unlock(&bdevp->bd_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
91
92
93
  			bdput(bdevp);
  
  			return 0;
c83f6bf98   Vivek Goyal   block: add partit...
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
  		case BLKPG_RESIZE_PARTITION:
  			start = p.start >> 9;
  			/* new length of partition in bytes */
  			length = p.length >> 9;
  			/* check for fit in a hd_struct */
  			if (sizeof(sector_t) == sizeof(long) &&
  			    sizeof(long long) > sizeof(long)) {
  				long pstart = start, plength = length;
  				if (pstart != start || plength != length
  				    || pstart < 0 || plength < 0)
  					return -EINVAL;
  			}
  			part = disk_get_part(disk, partno);
  			if (!part)
  				return -ENXIO;
  			bdevp = bdget(part_devt(part));
  			if (!bdevp) {
  				disk_put_part(part);
  				return -ENOMEM;
  			}
  			mutex_lock(&bdevp->bd_mutex);
  			mutex_lock_nested(&bdev->bd_mutex, 1);
  			if (start != part->start_sect) {
  				mutex_unlock(&bdevp->bd_mutex);
  				mutex_unlock(&bdev->bd_mutex);
  				bdput(bdevp);
  				disk_put_part(part);
  				return -EINVAL;
  			}
  			/* overlap? */
  			disk_part_iter_init(&piter, disk,
  					    DISK_PITER_INCL_EMPTY);
  			while ((lpart = disk_part_iter_next(&piter))) {
  				if (lpart->partno != partno &&
  				   !(start + length <= lpart->start_sect ||
  				   start >= lpart->start_sect + lpart->nr_sects)
  				   ) {
  					disk_part_iter_exit(&piter);
  					mutex_unlock(&bdevp->bd_mutex);
  					mutex_unlock(&bdev->bd_mutex);
  					bdput(bdevp);
  					disk_put_part(part);
  					return -EBUSY;
  				}
  			}
  			disk_part_iter_exit(&piter);
  			part_nr_sects_write(part, (sector_t)length);
  			i_size_write(bdevp->bd_inode, p.length);
  			mutex_unlock(&bdevp->bd_mutex);
  			mutex_unlock(&bdev->bd_mutex);
  			bdput(bdevp);
  			disk_put_part(part);
  			return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
147
148
149
150
151
152
153
154
155
  		default:
  			return -EINVAL;
  	}
  }
  
  static int blkdev_reread_part(struct block_device *bdev)
  {
  	struct gendisk *disk = bdev->bd_disk;
  	int res;
d27769ec3   Tejun Heo   block: add GENHD_...
156
  	if (!disk_part_scan_enabled(disk) || bdev != bdev->bd_contains)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
157
158
159
  		return -EINVAL;
  	if (!capable(CAP_SYS_ADMIN))
  		return -EACCES;
c039e3134   Arjan van de Ven   [PATCH] sem2mutex...
160
  	if (!mutex_trylock(&bdev->bd_mutex))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
161
162
  		return -EBUSY;
  	res = rescan_partitions(disk, bdev);
c039e3134   Arjan van de Ven   [PATCH] sem2mutex...
163
  	mutex_unlock(&bdev->bd_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
164
165
  	return res;
  }
d30a2605b   David Woodhouse   Add BLKDISCARD io...
166
  static int blk_ioctl_discard(struct block_device *bdev, uint64_t start,
8d57a98cc   Adrian Hunter   block: add secure...
167
  			     uint64_t len, int secure)
d30a2605b   David Woodhouse   Add BLKDISCARD io...
168
  {
dd3932edd   Christoph Hellwig   block: remove BLK...
169
  	unsigned long flags = 0;
8d57a98cc   Adrian Hunter   block: add secure...
170

d30a2605b   David Woodhouse   Add BLKDISCARD io...
171
172
173
174
175
176
  	if (start & 511)
  		return -EINVAL;
  	if (len & 511)
  		return -EINVAL;
  	start >>= 9;
  	len >>= 9;
77304d2ab   Mike Snitzer   block: read i_siz...
177
  	if (start + len > (i_size_read(bdev->bd_inode) >> 9))
d30a2605b   David Woodhouse   Add BLKDISCARD io...
178
  		return -EINVAL;
8d57a98cc   Adrian Hunter   block: add secure...
179
  	if (secure)
dd3932edd   Christoph Hellwig   block: remove BLK...
180
  		flags |= BLKDEV_DISCARD_SECURE;
8d57a98cc   Adrian Hunter   block: add secure...
181
  	return blkdev_issue_discard(bdev, start, len, GFP_KERNEL, flags);
d30a2605b   David Woodhouse   Add BLKDISCARD io...
182
  }
66ba32dc1   Martin K. Petersen   block: ioctl to z...
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
  static int blk_ioctl_zeroout(struct block_device *bdev, uint64_t start,
  			     uint64_t len)
  {
  	if (start & 511)
  		return -EINVAL;
  	if (len & 511)
  		return -EINVAL;
  	start >>= 9;
  	len >>= 9;
  
  	if (start + len > (i_size_read(bdev->bd_inode) >> 9))
  		return -EINVAL;
  
  	return blkdev_issue_zeroout(bdev, start, len, GFP_KERNEL);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
198
199
200
201
202
203
204
205
206
  static int put_ushort(unsigned long arg, unsigned short val)
  {
  	return put_user(val, (unsigned short __user *)arg);
  }
  
  static int put_int(unsigned long arg, int val)
  {
  	return put_user(val, (int __user *)arg);
  }
ac481c20e   Martin K. Petersen   block: Topology i...
207
208
209
210
  static int put_uint(unsigned long arg, unsigned int val)
  {
  	return put_user(val, (unsigned int __user *)arg);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
211
212
213
214
215
216
217
218
219
220
221
222
223
224
  static int put_long(unsigned long arg, long val)
  {
  	return put_user(val, (long __user *)arg);
  }
  
  static int put_ulong(unsigned long arg, unsigned long val)
  {
  	return put_user(val, (unsigned long __user *)arg);
  }
  
  static int put_u64(unsigned long arg, u64 val)
  {
  	return put_user(val, (u64 __user *)arg);
  }
633a08b81   Al Viro   [PATCH] introduce...
225
226
227
228
  int __blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode,
  			unsigned cmd, unsigned long arg)
  {
  	struct gendisk *disk = bdev->bd_disk;
d4430d62f   Al Viro   [PATCH] beginning...
229
230
231
  
  	if (disk->fops->ioctl)
  		return disk->fops->ioctl(bdev, mode, cmd, arg);
633a08b81   Al Viro   [PATCH] introduce...
232

633a08b81   Al Viro   [PATCH] introduce...
233
234
235
236
237
238
239
240
  	return -ENOTTY;
  }
  /*
   * For the record: _GPL here is only because somebody decided to slap it
   * on the previous export.  Sheer idiocy, since it wasn't copyrightable
   * at all and could be open-coded without any exports by anybody who cares.
   */
  EXPORT_SYMBOL_GPL(__blkdev_driver_ioctl);
f58c4c0a1   Arnd Bergmann   compat_ioctl: mov...
241
  /*
07d106d0a   Linus Torvalds   vfs: fix up ENOIO...
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
   * Is it an unrecognized ioctl? The correct returns are either
   * ENOTTY (final) or ENOIOCTLCMD ("I don't know this one, try a
   * fallback"). ENOIOCTLCMD gets turned into ENOTTY by the ioctl
   * code before returning.
   *
   * Confused drivers sometimes return EINVAL, which is wrong. It
   * means "I understood the ioctl command, but the parameters to
   * it were wrong".
   *
   * We should aim to just fix the broken drivers, the EINVAL case
   * should go away.
   */
  static inline int is_unrecognized_ioctl(int ret)
  {
  	return	ret == -EINVAL ||
  		ret == -ENOTTY ||
  		ret == -ENOIOCTLCMD;
  }
  
  /*
8a6cfeb6d   Arnd Bergmann   block: push down ...
262
   * always keep this in sync with compat_blkdev_ioctl()
f58c4c0a1   Arnd Bergmann   compat_ioctl: mov...
263
   */
56b26add0   Al Viro   [PATCH] kill the ...
264
  int blkdev_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
bb93e3a52   Arnd Bergmann   [PATCH] block: ad...
265
266
  			unsigned long arg)
  {
bb93e3a52   Arnd Bergmann   [PATCH] block: ad...
267
  	struct gendisk *disk = bdev->bd_disk;
45048d096   Al Viro   [PATCH] get rid o...
268
269
  	struct backing_dev_info *bdi;
  	loff_t size;
bb93e3a52   Arnd Bergmann   [PATCH] block: ad...
270
271
272
  	int ret, n;
  
  	switch(cmd) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
273
274
275
  	case BLKFLSBUF:
  		if (!capable(CAP_SYS_ADMIN))
  			return -EACCES;
bb93e3a52   Arnd Bergmann   [PATCH] block: ad...
276

e436fdae7   Al Viro   [PATCH] get rid o...
277
  		ret = __blkdev_driver_ioctl(bdev, mode, cmd, arg);
07d106d0a   Linus Torvalds   vfs: fix up ENOIO...
278
  		if (!is_unrecognized_ioctl(ret))
bb93e3a52   Arnd Bergmann   [PATCH] block: ad...
279
  			return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
280
  		fsync_bdev(bdev);
f98393a64   Peter Zijlstra   mm: remove destro...
281
  		invalidate_bdev(bdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
282
  		return 0;
bb93e3a52   Arnd Bergmann   [PATCH] block: ad...
283

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
284
  	case BLKROSET:
e436fdae7   Al Viro   [PATCH] get rid o...
285
  		ret = __blkdev_driver_ioctl(bdev, mode, cmd, arg);
07d106d0a   Linus Torvalds   vfs: fix up ENOIO...
286
  		if (!is_unrecognized_ioctl(ret))
bb93e3a52   Arnd Bergmann   [PATCH] block: ad...
287
  			return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
288
289
290
291
292
293
  		if (!capable(CAP_SYS_ADMIN))
  			return -EACCES;
  		if (get_user(n, (int __user *)(arg)))
  			return -EFAULT;
  		set_device_ro(bdev, n);
  		return 0;
d30a2605b   David Woodhouse   Add BLKDISCARD io...
294

8d57a98cc   Adrian Hunter   block: add secure...
295
296
  	case BLKDISCARD:
  	case BLKSECDISCARD: {
d30a2605b   David Woodhouse   Add BLKDISCARD io...
297
  		uint64_t range[2];
e436fdae7   Al Viro   [PATCH] get rid o...
298
  		if (!(mode & FMODE_WRITE))
d30a2605b   David Woodhouse   Add BLKDISCARD io...
299
300
301
302
  			return -EBADF;
  
  		if (copy_from_user(range, (void __user *)arg, sizeof(range)))
  			return -EFAULT;
8d57a98cc   Adrian Hunter   block: add secure...
303
304
  		return blk_ioctl_discard(bdev, range[0], range[1],
  					 cmd == BLKSECDISCARD);
d30a2605b   David Woodhouse   Add BLKDISCARD io...
305
  	}
66ba32dc1   Martin K. Petersen   block: ioctl to z...
306
307
308
309
310
311
312
313
314
315
316
  	case BLKZEROOUT: {
  		uint64_t range[2];
  
  		if (!(mode & FMODE_WRITE))
  			return -EBADF;
  
  		if (copy_from_user(range, (void __user *)arg, sizeof(range)))
  			return -EFAULT;
  
  		return blk_ioctl_zeroout(bdev, range[0], range[1]);
  	}
d30a2605b   David Woodhouse   Add BLKDISCARD io...
317

a885c8c43   Christoph Hellwig   [PATCH] Add block...
318
319
320
321
322
323
324
325
326
327
328
329
  	case HDIO_GETGEO: {
  		struct hd_geometry geo;
  
  		if (!arg)
  			return -EINVAL;
  		if (!disk->fops->getgeo)
  			return -ENOTTY;
  
  		/*
  		 * We need to set the startsect first, the driver may
  		 * want to override it.
  		 */
a014741c0   Vasiliy Kulikov   block: ioctl: fix...
330
  		memset(&geo, 0, sizeof(geo));
a885c8c43   Christoph Hellwig   [PATCH] Add block...
331
332
333
334
335
336
337
338
339
  		geo.start = get_start_sect(bdev);
  		ret = disk->fops->getgeo(bdev, &geo);
  		if (ret)
  			return ret;
  		if (copy_to_user((struct hd_geometry __user *)arg, &geo,
  					sizeof(geo)))
  			return -EFAULT;
  		return 0;
  	}
45048d096   Al Viro   [PATCH] get rid o...
340
341
342
343
344
345
346
347
348
349
  	case BLKRAGET:
  	case BLKFRAGET:
  		if (!arg)
  			return -EINVAL;
  		bdi = blk_get_backing_dev_info(bdev);
  		if (bdi == NULL)
  			return -ENOTTY;
  		return put_long(arg, (bdi->ra_pages * PAGE_CACHE_SIZE) / 512);
  	case BLKROGET:
  		return put_int(arg, bdev_read_only(bdev) != 0);
ac481c20e   Martin K. Petersen   block: Topology i...
350
  	case BLKBSZGET: /* get block device soft block size (cf. BLKSSZGET) */
45048d096   Al Viro   [PATCH] get rid o...
351
  		return put_int(arg, block_size(bdev));
ac481c20e   Martin K. Petersen   block: Topology i...
352
  	case BLKSSZGET: /* get block device logical block size */
e1defc4ff   Martin K. Petersen   block: Do away wi...
353
  		return put_int(arg, bdev_logical_block_size(bdev));
ac481c20e   Martin K. Petersen   block: Topology i...
354
355
356
357
358
359
360
361
  	case BLKPBSZGET: /* get block device physical block size */
  		return put_uint(arg, bdev_physical_block_size(bdev));
  	case BLKIOMIN:
  		return put_uint(arg, bdev_io_min(bdev));
  	case BLKIOOPT:
  		return put_uint(arg, bdev_io_opt(bdev));
  	case BLKALIGNOFF:
  		return put_int(arg, bdev_alignment_offset(bdev));
98262f276   Martin K. Petersen   block: Allow devi...
362
363
  	case BLKDISCARDZEROES:
  		return put_uint(arg, bdev_discard_zeroes_data(bdev));
45048d096   Al Viro   [PATCH] get rid o...
364
  	case BLKSECTGET:
ae03bf639   Martin K. Petersen   block: Use access...
365
  		return put_ushort(arg, queue_max_sectors(bdev_get_queue(bdev)));
ef00f59c9   Martin K. Petersen   block: Add BLKROT...
366
367
  	case BLKROTATIONAL:
  		return put_ushort(arg, !blk_queue_nonrot(bdev_get_queue(bdev)));
45048d096   Al Viro   [PATCH] get rid o...
368
369
370
371
372
373
374
  	case BLKRASET:
  	case BLKFRASET:
  		if(!capable(CAP_SYS_ADMIN))
  			return -EACCES;
  		bdi = blk_get_backing_dev_info(bdev);
  		if (bdi == NULL)
  			return -ENOTTY;
45048d096   Al Viro   [PATCH] get rid o...
375
  		bdi->ra_pages = (arg * 512) / PAGE_CACHE_SIZE;
45048d096   Al Viro   [PATCH] get rid o...
376
377
378
379
380
381
382
383
384
  		return 0;
  	case BLKBSZSET:
  		/* set the logical block size */
  		if (!capable(CAP_SYS_ADMIN))
  			return -EACCES;
  		if (!arg)
  			return -EINVAL;
  		if (get_user(n, (int __user *) arg))
  			return -EFAULT;
3c522cedb   Miklos Szeredi   block: fix refcou...
385
386
387
388
389
  		if (!(mode & FMODE_EXCL)) {
  			bdgrab(bdev);
  			if (blkdev_get(bdev, mode | FMODE_EXCL, &bdev) < 0)
  				return -EBUSY;
  		}
45048d096   Al Viro   [PATCH] get rid o...
390
  		ret = set_blocksize(bdev, n);
6af3a56e1   Al Viro   [PATCH] get rid o...
391
  		if (!(mode & FMODE_EXCL))
e525fd89d   Tejun Heo   block: make blkde...
392
  			blkdev_put(bdev, mode | FMODE_EXCL);
bb93e3a52   Arnd Bergmann   [PATCH] block: ad...
393
  		return ret;
45048d096   Al Viro   [PATCH] get rid o...
394
  	case BLKPG:
45048d096   Al Viro   [PATCH] get rid o...
395
  		ret = blkpg_ioctl(bdev, (struct blkpg_ioctl_arg __user *) arg);
45048d096   Al Viro   [PATCH] get rid o...
396
397
  		break;
  	case BLKRRPART:
45048d096   Al Viro   [PATCH] get rid o...
398
  		ret = blkdev_reread_part(bdev);
45048d096   Al Viro   [PATCH] get rid o...
399
400
  		break;
  	case BLKGETSIZE:
77304d2ab   Mike Snitzer   block: read i_siz...
401
  		size = i_size_read(bdev->bd_inode);
45048d096   Al Viro   [PATCH] get rid o...
402
403
404
405
  		if ((size >> 9) > ~0UL)
  			return -EFBIG;
  		return put_ulong(arg, size >> 9);
  	case BLKGETSIZE64:
77304d2ab   Mike Snitzer   block: read i_siz...
406
  		return put_u64(arg, i_size_read(bdev->bd_inode));
45048d096   Al Viro   [PATCH] get rid o...
407
408
409
410
  	case BLKTRACESTART:
  	case BLKTRACESTOP:
  	case BLKTRACESETUP:
  	case BLKTRACETEARDOWN:
45048d096   Al Viro   [PATCH] get rid o...
411
  		ret = blk_trace_ioctl(bdev, cmd, (char __user *) arg);
45048d096   Al Viro   [PATCH] get rid o...
412
413
414
415
416
  		break;
  	default:
  		ret = __blkdev_driver_ioctl(bdev, mode, cmd, arg);
  	}
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
417
  }
68f66feb3   Stephen Tweedie   [PATCH] Fix root ...
418
  EXPORT_SYMBOL_GPL(blkdev_ioctl);