block_dev.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:16k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/fs/block_dev.c
  3.  *
  4.  *  Copyright (C) 1991, 1992  Linus Torvalds
  5.  *  Copyright (C) 2001  Andrea Arcangeli <andrea@suse.de> SuSE
  6.  */
  7. #include <linux/config.h>
  8. #include <linux/init.h>
  9. #include <linux/mm.h>
  10. #include <linux/locks.h>
  11. #include <linux/fcntl.h>
  12. #include <linux/slab.h>
  13. #include <linux/kmod.h>
  14. #include <linux/major.h>
  15. #include <linux/devfs_fs_kernel.h>
  16. #include <linux/smp_lock.h>
  17. #include <linux/iobuf.h>
  18. #include <linux/highmem.h>
  19. #include <linux/blkdev.h>
  20. #include <linux/module.h>
  21. #include <asm/uaccess.h>
  22. static unsigned long max_block(kdev_t dev)
  23. {
  24. unsigned int retval = ~0U;
  25. int major = MAJOR(dev);
  26. if (blk_size[major]) {
  27. int minor = MINOR(dev);
  28. unsigned int blocks = blk_size[major][minor];
  29. if (blocks) {
  30. unsigned int size = block_size(dev);
  31. unsigned int sizebits = blksize_bits(size);
  32. blocks += (size-1) >> BLOCK_SIZE_BITS;
  33. retval = blocks << (BLOCK_SIZE_BITS - sizebits);
  34. if (sizebits > BLOCK_SIZE_BITS)
  35. retval = blocks >> (sizebits - BLOCK_SIZE_BITS);
  36. }
  37. }
  38. return retval;
  39. }
  40. static loff_t blkdev_size(kdev_t dev)
  41. {
  42. unsigned int blocks = ~0U;
  43. int major = MAJOR(dev);
  44. if (blk_size[major]) {
  45. int minor = MINOR(dev);
  46. blocks = blk_size[major][minor];
  47. }
  48. return (loff_t) blocks << BLOCK_SIZE_BITS;
  49. }
  50. /* Kill _all_ buffers, dirty or not.. */
  51. static void kill_bdev(struct block_device *bdev)
  52. {
  53. invalidate_bdev(bdev, 1);
  54. truncate_inode_pages(bdev->bd_inode->i_mapping, 0);
  55. }
  56. int set_blocksize(kdev_t dev, int size)
  57. {
  58. int oldsize;
  59. struct block_device *bdev;
  60. /* Size must be a power of two, and between 512 and PAGE_SIZE */
  61. if (size > PAGE_SIZE || size < 512 || (size & (size-1)))
  62. return -EINVAL;
  63. /* Size cannot be smaller than the size supported by the device */
  64. if (size < get_hardsect_size(dev))
  65. return -EINVAL;
  66. /* No blocksize array? Implies hardcoded BLOCK_SIZE */
  67. if (!blksize_size[MAJOR(dev)]) {
  68. if (size == BLOCK_SIZE)
  69. return 0;
  70. return -EINVAL;
  71. }
  72. oldsize = blksize_size[MAJOR(dev)][MINOR(dev)];
  73. if (oldsize == size)
  74. return 0;
  75. if (!oldsize && size == BLOCK_SIZE) {
  76. blksize_size[MAJOR(dev)][MINOR(dev)] = size;
  77. return 0;
  78. }
  79. /* Ok, we're actually changing the blocksize.. */
  80. bdev = bdget(dev);
  81. sync_buffers(dev, 2);
  82. blksize_size[MAJOR(dev)][MINOR(dev)] = size;
  83. bdev->bd_inode->i_blkbits = blksize_bits(size);
  84. kill_bdev(bdev);
  85. bdput(bdev);
  86. return 0;
  87. }
  88. int sb_set_blocksize(struct super_block *sb, int size)
  89. {
  90. int bits;
  91. if (set_blocksize(sb->s_dev, size) < 0)
  92. return 0;
  93. sb->s_blocksize = size;
  94. for (bits = 9, size >>= 9; size >>= 1; bits++)
  95. ;
  96. sb->s_blocksize_bits = bits;
  97. return sb->s_blocksize;
  98. }
  99. int sb_min_blocksize(struct super_block *sb, int size)
  100. {
  101. int minsize = get_hardsect_size(sb->s_dev);
  102. if (size < minsize)
  103. size = minsize;
  104. return sb_set_blocksize(sb, size);
  105. }
  106. static int blkdev_get_block(struct inode * inode, long iblock, struct buffer_head * bh, int create)
  107. {
  108. if (iblock >= max_block(inode->i_rdev))
  109. return -EIO;
  110. bh->b_dev = inode->i_rdev;
  111. bh->b_blocknr = iblock;
  112. bh->b_state |= 1UL << BH_Mapped;
  113. return 0;
  114. }
  115. static int blkdev_direct_IO(int rw, struct inode * inode, struct kiobuf * iobuf, unsigned long blocknr, int blocksize)
  116. {
  117. return generic_direct_IO(rw, inode, iobuf, blocknr, blocksize, blkdev_get_block);
  118. }
  119. static int blkdev_writepage(struct page * page)
  120. {
  121. return block_write_full_page(page, blkdev_get_block);
  122. }
  123. static int blkdev_readpage(struct file * file, struct page * page)
  124. {
  125. return block_read_full_page(page, blkdev_get_block);
  126. }
  127. static int blkdev_prepare_write(struct file *file, struct page *page, unsigned from, unsigned to)
  128. {
  129. return block_prepare_write(page, from, to, blkdev_get_block);
  130. }
  131. static int blkdev_commit_write(struct file *file, struct page *page, unsigned from, unsigned to)
  132. {
  133. return block_commit_write(page, from, to);
  134. }
  135. /*
  136.  * private llseek:
  137.  * for a block special file file->f_dentry->d_inode->i_size is zero
  138.  * so we compute the size by hand (just as in block_read/write above)
  139.  */
  140. static loff_t block_llseek(struct file *file, loff_t offset, int origin)
  141. {
  142. /* ewww */
  143. loff_t size = file->f_dentry->d_inode->i_bdev->bd_inode->i_size;
  144. loff_t retval;
  145. switch (origin) {
  146. case 2:
  147. offset += size;
  148. break;
  149. case 1:
  150. offset += file->f_pos;
  151. }
  152. retval = -EINVAL;
  153. if (offset >= 0 && offset <= size) {
  154. if (offset != file->f_pos) {
  155. file->f_pos = offset;
  156. file->f_reada = 0;
  157. file->f_version = ++event;
  158. }
  159. retval = offset;
  160. }
  161. return retval;
  162. }
  163. static int __block_fsync(struct inode * inode)
  164. {
  165. int ret, err;
  166. ret = filemap_fdatasync(inode->i_mapping);
  167. err = sync_buffers(inode->i_rdev, 1);
  168. if (err && !ret)
  169. ret = err;
  170. err = filemap_fdatawait(inode->i_mapping);
  171. if (err && !ret)
  172. ret = err;
  173. return ret;
  174. }
  175. /*
  176.  * Filp may be NULL when we are called by an msync of a vma
  177.  * since the vma has no handle.
  178.  */
  179.  
  180. static int block_fsync(struct file *filp, struct dentry *dentry, int datasync)
  181. {
  182. struct inode * inode = dentry->d_inode;
  183. return __block_fsync(inode);
  184. }
  185. /*
  186.  * pseudo-fs
  187.  */
  188. static struct super_block *bd_read_super(struct super_block *sb, void *data, int silent)
  189. {
  190. static struct super_operations sops = {};
  191. struct inode *root = new_inode(sb);
  192. if (!root)
  193. return NULL;
  194. root->i_mode = S_IFDIR | S_IRUSR | S_IWUSR;
  195. root->i_uid = root->i_gid = 0;
  196. root->i_atime = root->i_mtime = root->i_ctime = CURRENT_TIME;
  197. sb->s_maxbytes = ~0ULL;
  198. sb->s_blocksize = 1024;
  199. sb->s_blocksize_bits = 10;
  200. sb->s_magic = 0x62646576;
  201. sb->s_op = &sops;
  202. sb->s_root = d_alloc(NULL, &(const struct qstr) { "bdev:", 5, 0 });
  203. if (!sb->s_root) {
  204. iput(root);
  205. return NULL;
  206. }
  207. sb->s_root->d_sb = sb;
  208. sb->s_root->d_parent = sb->s_root;
  209. d_instantiate(sb->s_root, root);
  210. return sb;
  211. }
  212. static DECLARE_FSTYPE(bd_type, "bdev", bd_read_super, FS_NOMOUNT);
  213. static struct vfsmount *bd_mnt;
  214. /*
  215.  * bdev cache handling - shamelessly stolen from inode.c
  216.  * We use smaller hashtable, though.
  217.  */
  218. #define HASH_BITS 6
  219. #define HASH_SIZE (1UL << HASH_BITS)
  220. #define HASH_MASK (HASH_SIZE-1)
  221. static struct list_head bdev_hashtable[HASH_SIZE];
  222. static spinlock_t bdev_lock __cacheline_aligned_in_smp = SPIN_LOCK_UNLOCKED;
  223. static kmem_cache_t * bdev_cachep;
  224. #define alloc_bdev() 
  225.  ((struct block_device *) kmem_cache_alloc(bdev_cachep, SLAB_KERNEL))
  226. #define destroy_bdev(bdev) kmem_cache_free(bdev_cachep, (bdev))
  227. static void init_once(void * foo, kmem_cache_t * cachep, unsigned long flags)
  228. {
  229. struct block_device * bdev = (struct block_device *) foo;
  230. if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) ==
  231.     SLAB_CTOR_CONSTRUCTOR)
  232. {
  233. memset(bdev, 0, sizeof(*bdev));
  234. sema_init(&bdev->bd_sem, 1);
  235. INIT_LIST_HEAD(&bdev->bd_inodes);
  236. }
  237. }
  238. void __init bdev_cache_init(void)
  239. {
  240. int i, err;
  241. struct list_head *head = bdev_hashtable;
  242. i = HASH_SIZE;
  243. do {
  244. INIT_LIST_HEAD(head);
  245. head++;
  246. i--;
  247. } while (i);
  248. bdev_cachep = kmem_cache_create("bdev_cache",
  249.  sizeof(struct block_device),
  250.  0, SLAB_HWCACHE_ALIGN, init_once,
  251.  NULL);
  252. if (!bdev_cachep)
  253. panic("Cannot create bdev_cache SLAB cache");
  254. err = register_filesystem(&bd_type);
  255. if (err)
  256. panic("Cannot register bdev pseudo-fs");
  257. bd_mnt = kern_mount(&bd_type);
  258. err = PTR_ERR(bd_mnt);
  259. if (IS_ERR(bd_mnt))
  260. panic("Cannot create bdev pseudo-fs");
  261. }
  262. /*
  263.  * Most likely _very_ bad one - but then it's hardly critical for small
  264.  * /dev and can be fixed when somebody will need really large one.
  265.  */
  266. static inline unsigned long hash(dev_t dev)
  267. {
  268. unsigned long tmp = dev;
  269. tmp = tmp + (tmp >> HASH_BITS) + (tmp >> HASH_BITS*2);
  270. return tmp & HASH_MASK;
  271. }
  272. static struct block_device *bdfind(dev_t dev, struct list_head *head)
  273. {
  274. struct list_head *p;
  275. struct block_device *bdev;
  276. for (p=head->next; p!=head; p=p->next) {
  277. bdev = list_entry(p, struct block_device, bd_hash);
  278. if (bdev->bd_dev != dev)
  279. continue;
  280. atomic_inc(&bdev->bd_count);
  281. return bdev;
  282. }
  283. return NULL;
  284. }
  285. struct block_device *bdget(dev_t dev)
  286. {
  287. struct list_head * head = bdev_hashtable + hash(dev);
  288. struct block_device *bdev, *new_bdev;
  289. spin_lock(&bdev_lock);
  290. bdev = bdfind(dev, head);
  291. spin_unlock(&bdev_lock);
  292. if (bdev)
  293. return bdev;
  294. new_bdev = alloc_bdev();
  295. if (new_bdev) {
  296. struct inode *inode = new_inode(bd_mnt->mnt_sb);
  297. if (inode) {
  298. kdev_t kdev = to_kdev_t(dev);
  299. atomic_set(&new_bdev->bd_count,1);
  300. new_bdev->bd_dev = dev;
  301. new_bdev->bd_op = NULL;
  302. new_bdev->bd_inode = inode;
  303. inode->i_rdev = kdev;
  304. inode->i_dev = kdev;
  305. inode->i_bdev = new_bdev;
  306. inode->i_data.a_ops = &def_blk_aops;
  307. inode->i_data.gfp_mask = GFP_USER;
  308. inode->i_mode = S_IFBLK;
  309. spin_lock(&bdev_lock);
  310. bdev = bdfind(dev, head);
  311. if (!bdev) {
  312. list_add(&new_bdev->bd_hash, head);
  313. spin_unlock(&bdev_lock);
  314. return new_bdev;
  315. }
  316. spin_unlock(&bdev_lock);
  317. iput(new_bdev->bd_inode);
  318. }
  319. destroy_bdev(new_bdev);
  320. }
  321. return bdev;
  322. }
  323. static inline void __bd_forget(struct inode *inode)
  324. {
  325. list_del_init(&inode->i_devices);
  326. inode->i_bdev = NULL;
  327. inode->i_mapping = &inode->i_data;
  328. }
  329. void bdput(struct block_device *bdev)
  330. {
  331. if (atomic_dec_and_lock(&bdev->bd_count, &bdev_lock)) {
  332. struct list_head *p;
  333. if (bdev->bd_openers)
  334. BUG();
  335. list_del(&bdev->bd_hash);
  336. while ( (p = bdev->bd_inodes.next) != &bdev->bd_inodes ) {
  337. __bd_forget(list_entry(p, struct inode, i_devices));
  338. }
  339. spin_unlock(&bdev_lock);
  340. iput(bdev->bd_inode);
  341. destroy_bdev(bdev);
  342. }
  343. }
  344.  
  345. int bd_acquire(struct inode *inode)
  346. {
  347. struct block_device *bdev;
  348. spin_lock(&bdev_lock);
  349. if (inode->i_bdev) {
  350. atomic_inc(&inode->i_bdev->bd_count);
  351. spin_unlock(&bdev_lock);
  352. return 0;
  353. }
  354. spin_unlock(&bdev_lock);
  355. bdev = bdget(kdev_t_to_nr(inode->i_rdev));
  356. if (!bdev)
  357. return -ENOMEM;
  358. spin_lock(&bdev_lock);
  359. if (!inode->i_bdev) {
  360. inode->i_bdev = bdev;
  361. inode->i_mapping = bdev->bd_inode->i_mapping;
  362. list_add(&inode->i_devices, &bdev->bd_inodes);
  363. } else if (inode->i_bdev != bdev)
  364. BUG();
  365. spin_unlock(&bdev_lock);
  366. return 0;
  367. }
  368. /* Call when you free inode */
  369. void bd_forget(struct inode *inode)
  370. {
  371. spin_lock(&bdev_lock);
  372. if (inode->i_bdev)
  373. __bd_forget(inode);
  374. spin_unlock(&bdev_lock);
  375. }
  376. static struct {
  377. const char *name;
  378. struct block_device_operations *bdops;
  379. } blkdevs[MAX_BLKDEV];
  380. int get_blkdev_list(char * p)
  381. {
  382. int i;
  383. int len;
  384. len = sprintf(p, "nBlock devices:n");
  385. for (i = 0; i < MAX_BLKDEV ; i++) {
  386. if (blkdevs[i].bdops) {
  387. len += sprintf(p+len, "%3d %sn", i, blkdevs[i].name);
  388. }
  389. }
  390. return len;
  391. }
  392. /*
  393. Return the function table of a device.
  394. Load the driver if needed.
  395. */
  396. const struct block_device_operations * get_blkfops(unsigned int major)
  397. {
  398. const struct block_device_operations *ret = NULL;
  399. /* major 0 is used for non-device mounts */
  400. if (major && major < MAX_BLKDEV) {
  401. #ifdef CONFIG_KMOD
  402. if (!blkdevs[major].bdops) {
  403. char name[20];
  404. sprintf(name, "block-major-%d", major);
  405. request_module(name);
  406. }
  407. #endif
  408. ret = blkdevs[major].bdops;
  409. }
  410. return ret;
  411. }
  412. int register_blkdev(unsigned int major, const char * name, struct block_device_operations *bdops)
  413. {
  414. if (major == 0) {
  415. for (major = MAX_BLKDEV-1; major > 0; major--) {
  416. if (blkdevs[major].bdops == NULL) {
  417. blkdevs[major].name = name;
  418. blkdevs[major].bdops = bdops;
  419. return major;
  420. }
  421. }
  422. return -EBUSY;
  423. }
  424. if (major >= MAX_BLKDEV)
  425. return -EINVAL;
  426. if (blkdevs[major].bdops && blkdevs[major].bdops != bdops)
  427. return -EBUSY;
  428. blkdevs[major].name = name;
  429. blkdevs[major].bdops = bdops;
  430. return 0;
  431. }
  432. int unregister_blkdev(unsigned int major, const char * name)
  433. {
  434. if (major >= MAX_BLKDEV)
  435. return -EINVAL;
  436. if (!blkdevs[major].bdops)
  437. return -EINVAL;
  438. if (strcmp(blkdevs[major].name, name))
  439. return -EINVAL;
  440. blkdevs[major].name = NULL;
  441. blkdevs[major].bdops = NULL;
  442. return 0;
  443. }
  444. /*
  445.  * This routine checks whether a removable media has been changed,
  446.  * and invalidates all buffer-cache-entries in that case. This
  447.  * is a relatively slow routine, so we have to try to minimize using
  448.  * it. Thus it is called only upon a 'mount' or 'open'. This
  449.  * is the best way of combining speed and utility, I think.
  450.  * People changing diskettes in the middle of an operation deserve
  451.  * to lose :-)
  452.  */
  453. int check_disk_change(kdev_t dev)
  454. {
  455. int i;
  456. const struct block_device_operations * bdops = NULL;
  457. i = MAJOR(dev);
  458. if (i < MAX_BLKDEV)
  459. bdops = blkdevs[i].bdops;
  460. if (bdops == NULL) {
  461. devfs_handle_t de;
  462. de = devfs_find_handle (NULL, NULL, i, MINOR (dev),
  463. DEVFS_SPECIAL_BLK, 0);
  464. if (de) {
  465. bdops = devfs_get_ops (de);
  466. devfs_put_ops (de); /* We're running in owner module */
  467. }
  468. }
  469. if (bdops == NULL)
  470. return 0;
  471. if (bdops->check_media_change == NULL)
  472. return 0;
  473. if (!bdops->check_media_change(dev))
  474. return 0;
  475. if (invalidate_device(dev, 0))
  476. printk("VFS: busy inodes on changed media.n");
  477. if (bdops->revalidate)
  478. bdops->revalidate(dev);
  479. return 1;
  480. }
  481. int ioctl_by_bdev(struct block_device *bdev, unsigned cmd, unsigned long arg)
  482. {
  483. int res;
  484. mm_segment_t old_fs = get_fs();
  485. if (!bdev->bd_op->ioctl)
  486. return -EINVAL;
  487. set_fs(KERNEL_DS);
  488. res = bdev->bd_op->ioctl(bdev->bd_inode, NULL, cmd, arg);
  489. set_fs(old_fs);
  490. return res;
  491. }
  492. static int do_open(struct block_device *bdev, struct inode *inode, struct file *file)
  493. {
  494. int ret = -ENXIO;
  495. kdev_t dev = to_kdev_t(bdev->bd_dev);
  496. down(&bdev->bd_sem);
  497. lock_kernel();
  498. if (!bdev->bd_op)
  499. bdev->bd_op = get_blkfops(MAJOR(dev));
  500. if (bdev->bd_op) {
  501. ret = 0;
  502. if (bdev->bd_op->owner)
  503. __MOD_INC_USE_COUNT(bdev->bd_op->owner);
  504. if (bdev->bd_op->open)
  505. ret = bdev->bd_op->open(inode, file);
  506. if (!ret) {
  507. bdev->bd_openers++;
  508. bdev->bd_inode->i_size = blkdev_size(dev);
  509. bdev->bd_inode->i_blkbits = blksize_bits(block_size(dev));
  510. } else {
  511. if (bdev->bd_op->owner)
  512. __MOD_DEC_USE_COUNT(bdev->bd_op->owner);
  513. if (!bdev->bd_openers)
  514. bdev->bd_op = NULL;
  515. }
  516. }
  517. unlock_kernel();
  518. up(&bdev->bd_sem);
  519. if (ret)
  520. bdput(bdev);
  521. return ret;
  522. }
  523. int blkdev_get(struct block_device *bdev, mode_t mode, unsigned flags, int kind)
  524. {
  525. /*
  526.  * This crockload is due to bad choice of ->open() type.
  527.  * It will go away.
  528.  * For now, block device ->open() routine must _not_
  529.  * examine anything in 'inode' argument except ->i_rdev.
  530.  */
  531. struct file fake_file = {};
  532. struct dentry fake_dentry = {};
  533. fake_file.f_mode = mode;
  534. fake_file.f_flags = flags;
  535. fake_file.f_dentry = &fake_dentry;
  536. fake_dentry.d_inode = bdev->bd_inode;
  537. return do_open(bdev, bdev->bd_inode, &fake_file);
  538. }
  539. int blkdev_open(struct inode * inode, struct file * filp)
  540. {
  541. struct block_device *bdev;
  542. /*
  543.  * Preserve backwards compatibility and allow large file access
  544.  * even if userspace doesn't ask for it explicitly. Some mkfs
  545.  * binary needs it. We might want to drop this workaround
  546.  * during an unstable branch.
  547.  */
  548. filp->f_flags |= O_LARGEFILE;
  549. bd_acquire(inode);
  550. bdev = inode->i_bdev;
  551. return do_open(bdev, inode, filp);
  552. }
  553. int blkdev_put(struct block_device *bdev, int kind)
  554. {
  555. int ret = 0;
  556. kdev_t rdev = to_kdev_t(bdev->bd_dev); /* this should become bdev */
  557. struct inode *bd_inode = bdev->bd_inode;
  558. down(&bdev->bd_sem);
  559. lock_kernel();
  560. if (kind == BDEV_FILE && bdev->bd_openers == 1)
  561. __block_fsync(bd_inode);
  562. else if (kind == BDEV_FS)
  563. fsync_no_super(rdev);
  564. if (!--bdev->bd_openers)
  565. kill_bdev(bdev);
  566. if (bdev->bd_op->release)
  567. ret = bdev->bd_op->release(bd_inode, NULL);
  568. if (bdev->bd_op->owner)
  569. __MOD_DEC_USE_COUNT(bdev->bd_op->owner);
  570. if (!bdev->bd_openers)
  571. bdev->bd_op = NULL;
  572. unlock_kernel();
  573. up(&bdev->bd_sem);
  574. bdput(bdev);
  575. return ret;
  576. }
  577. int blkdev_close(struct inode * inode, struct file * filp)
  578. {
  579. return blkdev_put(inode->i_bdev, BDEV_FILE);
  580. }
  581. static int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd,
  582. unsigned long arg)
  583. {
  584. if (inode->i_bdev->bd_op->ioctl)
  585. return inode->i_bdev->bd_op->ioctl(inode, file, cmd, arg);
  586. return -EINVAL;
  587. }
  588. struct address_space_operations def_blk_aops = {
  589. readpage: blkdev_readpage,
  590. writepage: blkdev_writepage,
  591. sync_page: block_sync_page,
  592. prepare_write: blkdev_prepare_write,
  593. commit_write: blkdev_commit_write,
  594. direct_IO: blkdev_direct_IO,
  595. };
  596. struct file_operations def_blk_fops = {
  597. open: blkdev_open,
  598. release: blkdev_close,
  599. llseek: block_llseek,
  600. read: generic_file_read,
  601. write: generic_file_write,
  602. mmap: generic_file_mmap,
  603. fsync: block_fsync,
  604. ioctl: blkdev_ioctl,
  605. };
  606. const char * bdevname(kdev_t dev)
  607. {
  608. static char buffer[32];
  609. const char * name = blkdevs[MAJOR(dev)].name;
  610. if (!name)
  611. name = "unknown-block";
  612. sprintf(buffer, "%s(%d,%d)", name, MAJOR(dev), MINOR(dev));
  613. return buffer;
  614. }