00001
00002
00003
00004
00005
00006
00007
00008 #include <linux/init.h>
00009 #include <linux/mm.h>
00010 #include <linux/fcntl.h>
00011 #include <linux/slab.h>
00012 #include <linux/kmod.h>
00013 #include <linux/major.h>
00014 #include <linux/smp_lock.h>
00015 #include <linux/device_cgroup.h>
00016 #include <linux/highmem.h>
00017 #include <linux/blkdev.h>
00018 #include <linux/module.h>
00019 #include <linux/blkpg.h>
00020 #include <linux/buffer_head.h>
00021 #include <linux/writeback.h>
00022 #include <linux/mpage.h>
00023 #include <linux/mount.h>
00024 #include <linux/uio.h>
00025 #include <linux/namei.h>
00026 #include <linux/log2.h>
00027 #include <asm/uaccess.h>
00028 #include "internal.h"
00029
00030 #ifdef DDE_LINUX
00031 #include "local.h"
00032 #endif
00033
00034 struct bdev_inode {
00035 struct block_device bdev;
00036 struct inode vfs_inode;
00037 };
00038
00039 static const struct address_space_operations def_blk_aops;
00040
00041 static inline struct bdev_inode *BDEV_I(struct inode *inode)
00042 {
00043 return container_of(inode, struct bdev_inode, vfs_inode);
00044 }
00045
00046 inline struct block_device *I_BDEV(struct inode *inode)
00047 {
00048 return &BDEV_I(inode)->bdev;
00049 }
00050
00051 EXPORT_SYMBOL(I_BDEV);
00052
00053 static sector_t max_block(struct block_device *bdev)
00054 {
00055 sector_t retval = ~((sector_t)0);
00056 loff_t sz = i_size_read(bdev->bd_inode);
00057
00058 if (sz) {
00059 unsigned int size = block_size(bdev);
00060 unsigned int sizebits = blksize_bits(size);
00061 retval = (sz >> sizebits);
00062 }
00063 return retval;
00064 }
00065
00066
00067 static void kill_bdev(struct block_device *bdev)
00068 {
00069 if (bdev->bd_inode->i_mapping->nrpages == 0)
00070 return;
00071 invalidate_bh_lrus();
00072 truncate_inode_pages(bdev->bd_inode->i_mapping, 0);
00073 }
00074
00075 int set_blocksize(struct block_device *bdev, int size)
00076 {
00077
00078 if (size > PAGE_SIZE || size < 512 || !is_power_of_2(size))
00079 return -EINVAL;
00080
00081
00082 if (size < bdev_hardsect_size(bdev))
00083 return -EINVAL;
00084
00085
00086 if (bdev->bd_block_size != size) {
00087 sync_blockdev(bdev);
00088 bdev->bd_block_size = size;
00089 bdev->bd_inode->i_blkbits = blksize_bits(size);
00090 kill_bdev(bdev);
00091 }
00092 return 0;
00093 }
00094
00095 EXPORT_SYMBOL(set_blocksize);
00096
00097 int sb_set_blocksize(struct super_block *sb, int size)
00098 {
00099 if (set_blocksize(sb->s_bdev, size))
00100 return 0;
00101
00102
00103 sb->s_blocksize = size;
00104 sb->s_blocksize_bits = blksize_bits(size);
00105 return sb->s_blocksize;
00106 }
00107
00108 EXPORT_SYMBOL(sb_set_blocksize);
00109
00110 int sb_min_blocksize(struct super_block *sb, int size)
00111 {
00112 int minsize = bdev_hardsect_size(sb->s_bdev);
00113 if (size < minsize)
00114 size = minsize;
00115 return sb_set_blocksize(sb, size);
00116 }
00117
00118 EXPORT_SYMBOL(sb_min_blocksize);
00119
00120 static int
00121 blkdev_get_block(struct inode *inode, sector_t iblock,
00122 struct buffer_head *bh, int create)
00123 {
00124 if (iblock >= max_block(I_BDEV(inode))) {
00125 if (create)
00126 return -EIO;
00127
00128
00129
00130
00131
00132
00133
00134 return 0;
00135 }
00136 bh->b_bdev = I_BDEV(inode);
00137 bh->b_blocknr = iblock;
00138 set_buffer_mapped(bh);
00139 return 0;
00140 }
00141
00142 static int
00143 blkdev_get_blocks(struct inode *inode, sector_t iblock,
00144 struct buffer_head *bh, int create)
00145 {
00146 sector_t end_block = max_block(I_BDEV(inode));
00147 unsigned long max_blocks = bh->b_size >> inode->i_blkbits;
00148
00149 if ((iblock + max_blocks) > end_block) {
00150 max_blocks = end_block - iblock;
00151 if ((long)max_blocks <= 0) {
00152 if (create)
00153 return -EIO;
00154
00155
00156
00157
00158 max_blocks = 0;
00159 }
00160 }
00161
00162 bh->b_bdev = I_BDEV(inode);
00163 bh->b_blocknr = iblock;
00164 bh->b_size = max_blocks << inode->i_blkbits;
00165 if (max_blocks)
00166 set_buffer_mapped(bh);
00167 return 0;
00168 }
00169
00170 static ssize_t
00171 blkdev_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
00172 loff_t offset, unsigned long nr_segs)
00173 {
00174 struct file *file = iocb->ki_filp;
00175 struct inode *inode = file->f_mapping->host;
00176
00177 #ifndef DDE_LINUX
00178 return blockdev_direct_IO_no_locking(rw, iocb, inode, I_BDEV(inode),
00179 iov, offset, nr_segs, blkdev_get_blocks, NULL);
00180 #else
00181 WARN_UNIMPL;
00182 return 0;
00183 #endif
00184 }
00185
00186 static int blkdev_writepage(struct page *page, struct writeback_control *wbc)
00187 {
00188 return block_write_full_page(page, blkdev_get_block, wbc);
00189 }
00190
00191 static int blkdev_readpage(struct file * file, struct page * page)
00192 {
00193 return block_read_full_page(page, blkdev_get_block);
00194 }
00195
00196 static int blkdev_write_begin(struct file *file, struct address_space *mapping,
00197 loff_t pos, unsigned len, unsigned flags,
00198 struct page **pagep, void **fsdata)
00199 {
00200 *pagep = NULL;
00201 return block_write_begin(file, mapping, pos, len, flags, pagep, fsdata,
00202 blkdev_get_block);
00203 }
00204
00205 static int blkdev_write_end(struct file *file, struct address_space *mapping,
00206 loff_t pos, unsigned len, unsigned copied,
00207 struct page *page, void *fsdata)
00208 {
00209 int ret;
00210 ret = block_write_end(file, mapping, pos, len, copied, page, fsdata);
00211
00212 unlock_page(page);
00213 page_cache_release(page);
00214
00215 return ret;
00216 }
00217
00218
00219
00220
00221
00222
00223 static loff_t block_llseek(struct file *file, loff_t offset, int origin)
00224 {
00225 struct inode *bd_inode = file->f_mapping->host;
00226 loff_t size;
00227 loff_t retval;
00228
00229 mutex_lock(&bd_inode->i_mutex);
00230 size = i_size_read(bd_inode);
00231
00232 switch (origin) {
00233 case 2:
00234 offset += size;
00235 break;
00236 case 1:
00237 offset += file->f_pos;
00238 }
00239 retval = -EINVAL;
00240 if (offset >= 0 && offset <= size) {
00241 if (offset != file->f_pos) {
00242 file->f_pos = offset;
00243 }
00244 retval = offset;
00245 }
00246 mutex_unlock(&bd_inode->i_mutex);
00247 return retval;
00248 }
00249
00250
00251
00252
00253
00254
00255 static int block_fsync(struct file *filp, struct dentry *dentry, int datasync)
00256 {
00257 return sync_blockdev(I_BDEV(filp->f_mapping->host));
00258 }
00259
00260
00261
00262
00263
00264 static __cacheline_aligned_in_smp DEFINE_SPINLOCK(bdev_lock);
00265 static struct kmem_cache * bdev_cachep __read_mostly;
00266
00267 static struct inode *bdev_alloc_inode(struct super_block *sb)
00268 {
00269 struct bdev_inode *ei = kmem_cache_alloc(bdev_cachep, GFP_KERNEL);
00270 if (!ei)
00271 return NULL;
00272 return &ei->vfs_inode;
00273 }
00274
00275 static void bdev_destroy_inode(struct inode *inode)
00276 {
00277 struct bdev_inode *bdi = BDEV_I(inode);
00278
00279 bdi->bdev.bd_inode_backing_dev_info = NULL;
00280 kmem_cache_free(bdev_cachep, bdi);
00281 }
00282
00283 static void init_once(void *foo)
00284 {
00285 struct bdev_inode *ei = (struct bdev_inode *) foo;
00286 struct block_device *bdev = &ei->bdev;
00287
00288 memset(bdev, 0, sizeof(*bdev));
00289 mutex_init(&bdev->bd_mutex);
00290 sema_init(&bdev->bd_mount_sem, 1);
00291 INIT_LIST_HEAD(&bdev->bd_inodes);
00292 INIT_LIST_HEAD(&bdev->bd_list);
00293 #ifdef CONFIG_SYSFS
00294 INIT_LIST_HEAD(&bdev->bd_holder_list);
00295 #endif
00296 inode_init_once(&ei->vfs_inode);
00297
00298 mutex_init(&bdev->bd_fsfreeze_mutex);
00299 }
00300
00301 static inline void __bd_forget(struct inode *inode)
00302 {
00303 list_del_init(&inode->i_devices);
00304 inode->i_bdev = NULL;
00305 inode->i_mapping = &inode->i_data;
00306 }
00307
00308 static void bdev_clear_inode(struct inode *inode)
00309 {
00310 struct block_device *bdev = &BDEV_I(inode)->bdev;
00311 struct list_head *p;
00312 spin_lock(&bdev_lock);
00313 while ( (p = bdev->bd_inodes.next) != &bdev->bd_inodes ) {
00314 __bd_forget(list_entry(p, struct inode, i_devices));
00315 }
00316 list_del_init(&bdev->bd_list);
00317 spin_unlock(&bdev_lock);
00318 }
00319
00320 static const struct super_operations bdev_sops = {
00321 .statfs = simple_statfs,
00322 .alloc_inode = bdev_alloc_inode,
00323 .destroy_inode = bdev_destroy_inode,
00324 .drop_inode = generic_delete_inode,
00325 .clear_inode = bdev_clear_inode,
00326 };
00327
00328 static int bd_get_sb(struct file_system_type *fs_type,
00329 int flags, const char *dev_name, void *data, struct vfsmount *mnt)
00330 {
00331 return get_sb_pseudo(fs_type, "bdev:", &bdev_sops, 0x62646576, mnt);
00332 }
00333
00334 static struct file_system_type bd_type = {
00335 .name = "bdev",
00336 .get_sb = bd_get_sb,
00337 .kill_sb = kill_anon_super,
00338 };
00339
00340 struct super_block *blockdev_superblock __read_mostly;
00341
00342 void __init bdev_cache_init(void)
00343 {
00344 int err;
00345 struct vfsmount *bd_mnt;
00346
00347 bdev_cachep = kmem_cache_create("bdev_cache", sizeof(struct bdev_inode),
00348 0, (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
00349 SLAB_MEM_SPREAD|SLAB_PANIC),
00350 init_once);
00351 err = register_filesystem(&bd_type);
00352 if (err)
00353 panic("Cannot register bdev pseudo-fs");
00354 bd_mnt = kern_mount(&bd_type);
00355 if (IS_ERR(bd_mnt))
00356 panic("Cannot create bdev pseudo-fs");
00357 blockdev_superblock = bd_mnt->mnt_sb;
00358 }
00359
00360
00361
00362
00363
00364
00365 static inline unsigned long hash(dev_t dev)
00366 {
00367 return MAJOR(dev)+MINOR(dev);
00368 }
00369
00370 static int bdev_test(struct inode *inode, void *data)
00371 {
00372 return BDEV_I(inode)->bdev.bd_dev == *(dev_t *)data;
00373 }
00374
00375 static int bdev_set(struct inode *inode, void *data)
00376 {
00377 BDEV_I(inode)->bdev.bd_dev = *(dev_t *)data;
00378 return 0;
00379 }
00380
00381 static LIST_HEAD(all_bdevs);
00382
00383 struct block_device *bdget(dev_t dev)
00384 {
00385 struct block_device *bdev;
00386 struct inode *inode;
00387
00388 printk_all_partitions();
00389
00390 inode = iget5_locked(blockdev_superblock, hash(dev),
00391 bdev_test, bdev_set, &dev);
00392
00393 if (!inode)
00394 return NULL;
00395
00396 bdev = &BDEV_I(inode)->bdev;
00397
00398 if (inode->i_state & I_NEW) {
00399 bdev->bd_contains = NULL;
00400 bdev->bd_inode = inode;
00401 bdev->bd_block_size = (1 << inode->i_blkbits);
00402 bdev->bd_part_count = 0;
00403 bdev->bd_invalidated = 0;
00404 inode->i_mode = S_IFBLK;
00405 inode->i_rdev = dev;
00406 inode->i_bdev = bdev;
00407 inode->i_data.a_ops = &def_blk_aops;
00408 mapping_set_gfp_mask(&inode->i_data, GFP_USER);
00409 inode->i_data.backing_dev_info = &default_backing_dev_info;
00410 spin_lock(&bdev_lock);
00411 list_add(&bdev->bd_list, &all_bdevs);
00412 spin_unlock(&bdev_lock);
00413 unlock_new_inode(inode);
00414 }
00415 return bdev;
00416 }
00417
00418 EXPORT_SYMBOL(bdget);
00419
00420 long nr_blockdev_pages(void)
00421 {
00422 struct block_device *bdev;
00423 long ret = 0;
00424 spin_lock(&bdev_lock);
00425 list_for_each_entry(bdev, &all_bdevs, bd_list) {
00426 ret += bdev->bd_inode->i_mapping->nrpages;
00427 }
00428 spin_unlock(&bdev_lock);
00429 return ret;
00430 }
00431
00432 void bdput(struct block_device *bdev)
00433 {
00434 iput(bdev->bd_inode);
00435 }
00436
00437 EXPORT_SYMBOL(bdput);
00438
00439 static struct block_device *bd_acquire(struct inode *inode)
00440 {
00441 struct block_device *bdev;
00442
00443 spin_lock(&bdev_lock);
00444 bdev = inode->i_bdev;
00445 if (bdev) {
00446 atomic_inc(&bdev->bd_inode->i_count);
00447 spin_unlock(&bdev_lock);
00448 return bdev;
00449 }
00450 spin_unlock(&bdev_lock);
00451
00452 bdev = bdget(inode->i_rdev);
00453 if (bdev) {
00454 spin_lock(&bdev_lock);
00455 if (!inode->i_bdev) {
00456
00457
00458
00459
00460
00461
00462 atomic_inc(&bdev->bd_inode->i_count);
00463 inode->i_bdev = bdev;
00464 inode->i_mapping = bdev->bd_inode->i_mapping;
00465 list_add(&inode->i_devices, &bdev->bd_inodes);
00466 }
00467 spin_unlock(&bdev_lock);
00468 }
00469 return bdev;
00470 }
00471
00472
00473
00474 void bd_forget(struct inode *inode)
00475 {
00476 struct block_device *bdev = NULL;
00477
00478 spin_lock(&bdev_lock);
00479 if (inode->i_bdev) {
00480 if (!sb_is_blkdev_sb(inode->i_sb))
00481 bdev = inode->i_bdev;
00482 __bd_forget(inode);
00483 }
00484 spin_unlock(&bdev_lock);
00485
00486 if (bdev)
00487 iput(bdev->bd_inode);
00488 }
00489
00490 int bd_claim(struct block_device *bdev, void *holder)
00491 {
00492 int res;
00493 spin_lock(&bdev_lock);
00494
00495
00496 if (bdev->bd_holder == holder)
00497 res = 0;
00498 else if (bdev->bd_holder != NULL)
00499 res = -EBUSY;
00500 else if (bdev->bd_contains == bdev)
00501 res = 0;
00502
00503 else if (bdev->bd_contains->bd_holder == bd_claim)
00504 res = 0;
00505 else if (bdev->bd_contains->bd_holder != NULL)
00506 res = -EBUSY;
00507 else
00508 res = 0;
00509
00510
00511 if (res==0) {
00512
00513
00514
00515
00516 bdev->bd_contains->bd_holders ++;
00517 bdev->bd_contains->bd_holder = bd_claim;
00518 bdev->bd_holders++;
00519 bdev->bd_holder = holder;
00520 }
00521 spin_unlock(&bdev_lock);
00522 return res;
00523 }
00524
00525 EXPORT_SYMBOL(bd_claim);
00526
00527 void bd_release(struct block_device *bdev)
00528 {
00529 spin_lock(&bdev_lock);
00530 if (!--bdev->bd_contains->bd_holders)
00531 bdev->bd_contains->bd_holder = NULL;
00532 if (!--bdev->bd_holders)
00533 bdev->bd_holder = NULL;
00534 spin_unlock(&bdev_lock);
00535 }
00536
00537 EXPORT_SYMBOL(bd_release);
00538
00539 #ifdef CONFIG_SYSFS
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557 static int add_symlink(struct kobject *from, struct kobject *to)
00558 {
00559 if (!from || !to)
00560 return 0;
00561 return sysfs_create_link(from, to, kobject_name(to));
00562 }
00563
00564 static void del_symlink(struct kobject *from, struct kobject *to)
00565 {
00566 if (!from || !to)
00567 return;
00568 sysfs_remove_link(from, kobject_name(to));
00569 }
00570
00571
00572
00573
00574
00575
00576 struct bd_holder {
00577 struct list_head list;
00578 int count;
00579 struct kobject *sdir;
00580 struct kobject *hdev;
00581 struct kobject *hdir;
00582 struct kobject *sdev;
00583 };
00584
00585
00586
00587
00588
00589
00590
00591 static int bd_holder_grab_dirs(struct block_device *bdev,
00592 struct bd_holder *bo)
00593 {
00594 if (!bdev || !bo)
00595 return 0;
00596
00597 bo->sdir = kobject_get(bo->sdir);
00598 if (!bo->sdir)
00599 return 0;
00600
00601 bo->hdev = kobject_get(bo->sdir->parent);
00602 if (!bo->hdev)
00603 goto fail_put_sdir;
00604
00605 bo->sdev = kobject_get(&part_to_dev(bdev->bd_part)->kobj);
00606 if (!bo->sdev)
00607 goto fail_put_hdev;
00608
00609 bo->hdir = kobject_get(bdev->bd_part->holder_dir);
00610 if (!bo->hdir)
00611 goto fail_put_sdev;
00612
00613 return 1;
00614
00615 fail_put_sdev:
00616 kobject_put(bo->sdev);
00617 fail_put_hdev:
00618 kobject_put(bo->hdev);
00619 fail_put_sdir:
00620 kobject_put(bo->sdir);
00621
00622 return 0;
00623 }
00624
00625
00626 static void bd_holder_release_dirs(struct bd_holder *bo)
00627 {
00628 kobject_put(bo->hdir);
00629 kobject_put(bo->sdev);
00630 kobject_put(bo->hdev);
00631 kobject_put(bo->sdir);
00632 }
00633
00634 static struct bd_holder *alloc_bd_holder(struct kobject *kobj)
00635 {
00636 struct bd_holder *bo;
00637
00638 bo = kzalloc(sizeof(*bo), GFP_KERNEL);
00639 if (!bo)
00640 return NULL;
00641
00642 bo->count = 1;
00643 bo->sdir = kobj;
00644
00645 return bo;
00646 }
00647
00648 static void free_bd_holder(struct bd_holder *bo)
00649 {
00650 kfree(bo);
00651 }
00652
00653
00654
00655
00656
00657
00658
00659
00660
00661
00662
00663 static struct bd_holder *find_bd_holder(struct block_device *bdev,
00664 struct bd_holder *bo)
00665 {
00666 struct bd_holder *tmp;
00667
00668 list_for_each_entry(tmp, &bdev->bd_holder_list, list)
00669 if (tmp->sdir == bo->sdir) {
00670 tmp->count++;
00671 return tmp;
00672 }
00673
00674 return NULL;
00675 }
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688 static int add_bd_holder(struct block_device *bdev, struct bd_holder *bo)
00689 {
00690 int err;
00691
00692 if (!bo)
00693 return -EINVAL;
00694
00695 if (!bd_holder_grab_dirs(bdev, bo))
00696 return -EBUSY;
00697
00698 err = add_symlink(bo->sdir, bo->sdev);
00699 if (err)
00700 return err;
00701
00702 err = add_symlink(bo->hdir, bo->hdev);
00703 if (err) {
00704 del_symlink(bo->sdir, bo->sdev);
00705 return err;
00706 }
00707
00708 list_add_tail(&bo->list, &bdev->bd_holder_list);
00709 return 0;
00710 }
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726
00727 static struct bd_holder *del_bd_holder(struct block_device *bdev,
00728 struct kobject *kobj)
00729 {
00730 struct bd_holder *bo;
00731
00732 list_for_each_entry(bo, &bdev->bd_holder_list, list) {
00733 if (bo->sdir == kobj) {
00734 bo->count--;
00735 BUG_ON(bo->count < 0);
00736 if (!bo->count) {
00737 list_del(&bo->list);
00738 del_symlink(bo->sdir, bo->sdev);
00739 del_symlink(bo->hdir, bo->hdev);
00740 bd_holder_release_dirs(bo);
00741 return bo;
00742 }
00743 break;
00744 }
00745 }
00746
00747 return NULL;
00748 }
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764 static int bd_claim_by_kobject(struct block_device *bdev, void *holder,
00765 struct kobject *kobj)
00766 {
00767 int err;
00768 struct bd_holder *bo, *found;
00769
00770 if (!kobj)
00771 return -EINVAL;
00772
00773 bo = alloc_bd_holder(kobj);
00774 if (!bo)
00775 return -ENOMEM;
00776
00777 mutex_lock(&bdev->bd_mutex);
00778
00779 err = bd_claim(bdev, holder);
00780 if (err)
00781 goto fail;
00782
00783 found = find_bd_holder(bdev, bo);
00784 if (found)
00785 goto fail;
00786
00787 err = add_bd_holder(bdev, bo);
00788 if (err)
00789 bd_release(bdev);
00790 else
00791 bo = NULL;
00792 fail:
00793 mutex_unlock(&bdev->bd_mutex);
00794 free_bd_holder(bo);
00795 return err;
00796 }
00797
00798
00799
00800
00801
00802
00803
00804
00805
00806 static void bd_release_from_kobject(struct block_device *bdev,
00807 struct kobject *kobj)
00808 {
00809 if (!kobj)
00810 return;
00811
00812 mutex_lock(&bdev->bd_mutex);
00813 bd_release(bdev);
00814 free_bd_holder(del_bd_holder(bdev, kobj));
00815 mutex_unlock(&bdev->bd_mutex);
00816 }
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827 int bd_claim_by_disk(struct block_device *bdev, void *holder,
00828 struct gendisk *disk)
00829 {
00830 return bd_claim_by_kobject(bdev, holder, kobject_get(disk->slave_dir));
00831 }
00832 EXPORT_SYMBOL_GPL(bd_claim_by_disk);
00833
00834
00835
00836
00837
00838
00839
00840
00841
00842 void bd_release_from_disk(struct block_device *bdev, struct gendisk *disk)
00843 {
00844 bd_release_from_kobject(bdev, disk->slave_dir);
00845 kobject_put(disk->slave_dir);
00846 }
00847 EXPORT_SYMBOL_GPL(bd_release_from_disk);
00848 #endif
00849
00850
00851
00852
00853
00854
00855
00856
00857 struct block_device *open_by_devnum(dev_t dev, fmode_t mode)
00858 {
00859 struct block_device *bdev = bdget(dev);
00860 int err = -ENOMEM;
00861 if (bdev)
00862 err = blkdev_get(bdev, mode);
00863 return err ? ERR_PTR(err) : bdev;
00864 }
00865
00866 EXPORT_SYMBOL(open_by_devnum);
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877 static void flush_disk(struct block_device *bdev)
00878 {
00879 if (__invalidate_device(bdev)) {
00880 char name[BDEVNAME_SIZE] = "";
00881
00882 if (bdev->bd_disk)
00883 disk_name(bdev->bd_disk, 0, name);
00884 printk(KERN_WARNING "VFS: busy inodes on changed media or "
00885 "resized disk %s\n", name);
00886 }
00887
00888 if (!bdev->bd_disk)
00889 return;
00890 if (disk_partitionable(bdev->bd_disk))
00891 bdev->bd_invalidated = 1;
00892 }
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902 void check_disk_size_change(struct gendisk *disk, struct block_device *bdev)
00903 {
00904 loff_t disk_size, bdev_size;
00905
00906 disk_size = (loff_t)get_capacity(disk) << 9;
00907 bdev_size = i_size_read(bdev->bd_inode);
00908 if (disk_size != bdev_size) {
00909 char name[BDEVNAME_SIZE];
00910
00911 disk_name(disk, 0, name);
00912 printk(KERN_INFO
00913 "%s: detected capacity change from %lld to %lld\n",
00914 name, bdev_size, disk_size);
00915 i_size_write(bdev->bd_inode, disk_size);
00916 flush_disk(bdev);
00917 }
00918 }
00919 EXPORT_SYMBOL(check_disk_size_change);
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929 int revalidate_disk(struct gendisk *disk)
00930 {
00931 struct block_device *bdev;
00932 int ret = 0;
00933
00934 if (disk->fops->revalidate_disk)
00935 ret = disk->fops->revalidate_disk(disk);
00936
00937 bdev = bdget_disk(disk, 0);
00938 if (!bdev)
00939 return ret;
00940
00941 mutex_lock(&bdev->bd_mutex);
00942 check_disk_size_change(disk, bdev);
00943 mutex_unlock(&bdev->bd_mutex);
00944 bdput(bdev);
00945 return ret;
00946 }
00947 EXPORT_SYMBOL(revalidate_disk);
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958 int check_disk_change(struct block_device *bdev)
00959 {
00960 struct gendisk *disk = bdev->bd_disk;
00961 struct block_device_operations * bdops = disk->fops;
00962
00963 if (!bdops->media_changed)
00964 return 0;
00965 if (!bdops->media_changed(bdev->bd_disk))
00966 return 0;
00967
00968 flush_disk(bdev);
00969 if (bdops->revalidate_disk)
00970 bdops->revalidate_disk(bdev->bd_disk);
00971 return 1;
00972 }
00973
00974 EXPORT_SYMBOL(check_disk_change);
00975
00976 void bd_set_size(struct block_device *bdev, loff_t size)
00977 {
00978 unsigned bsize = bdev_hardsect_size(bdev);
00979
00980 bdev->bd_inode->i_size = size;
00981 while (bsize < PAGE_CACHE_SIZE) {
00982 if (size & bsize)
00983 break;
00984 bsize <<= 1;
00985 }
00986 bdev->bd_block_size = bsize;
00987 bdev->bd_inode->i_blkbits = blksize_bits(bsize);
00988 }
00989 EXPORT_SYMBOL(bd_set_size);
00990
00991 static int __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part);
00992
00993
00994
00995
00996
00997
00998
00999
01000 static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
01001 {
01002 struct gendisk *disk;
01003 int ret;
01004 int partno;
01005 int perm = 0;
01006
01007 if (mode & FMODE_READ)
01008 perm |= MAY_READ;
01009 if (mode & FMODE_WRITE)
01010 perm |= MAY_WRITE;
01011
01012
01013
01014 ret = devcgroup_inode_permission(bdev->bd_inode, perm);
01015 if (ret != 0) {
01016 bdput(bdev);
01017 return ret;
01018 }
01019
01020 lock_kernel();
01021 restart:
01022
01023 ret = -ENXIO;
01024 disk = get_gendisk(bdev->bd_dev, &partno);
01025 if (!disk)
01026 goto out_unlock_kernel;
01027
01028 mutex_lock_nested(&bdev->bd_mutex, for_part);
01029 if (!bdev->bd_openers) {
01030 bdev->bd_disk = disk;
01031 bdev->bd_contains = bdev;
01032 if (!partno) {
01033 struct backing_dev_info *bdi;
01034
01035 ret = -ENXIO;
01036 bdev->bd_part = disk_get_part(disk, partno);
01037 if (!bdev->bd_part)
01038 goto out_clear;
01039
01040 if (disk->fops->open) {
01041 ret = disk->fops->open(bdev, mode);
01042 if (ret == -ERESTARTSYS) {
01043
01044
01045
01046
01047 disk_put_part(bdev->bd_part);
01048 bdev->bd_part = NULL;
01049 module_put(disk->fops->owner);
01050 put_disk(disk);
01051 bdev->bd_disk = NULL;
01052 mutex_unlock(&bdev->bd_mutex);
01053 goto restart;
01054 }
01055 if (ret)
01056 goto out_clear;
01057 }
01058 if (!bdev->bd_openers) {
01059 bd_set_size(bdev,(loff_t)get_capacity(disk)<<9);
01060 bdi = blk_get_backing_dev_info(bdev);
01061 if (bdi == NULL)
01062 bdi = &default_backing_dev_info;
01063 bdev->bd_inode->i_data.backing_dev_info = bdi;
01064 }
01065 if (bdev->bd_invalidated)
01066 rescan_partitions(disk, bdev);
01067 } else {
01068 struct block_device *whole;
01069 whole = bdget_disk(disk, 0);
01070 ret = -ENOMEM;
01071 if (!whole)
01072 goto out_clear;
01073 BUG_ON(for_part);
01074 ret = __blkdev_get(whole, mode, 1);
01075 if (ret)
01076 goto out_clear;
01077 bdev->bd_contains = whole;
01078 bdev->bd_inode->i_data.backing_dev_info =
01079 whole->bd_inode->i_data.backing_dev_info;
01080 bdev->bd_part = disk_get_part(disk, partno);
01081 if (!(disk->flags & GENHD_FL_UP) ||
01082 !bdev->bd_part || !bdev->bd_part->nr_sects) {
01083 ret = -ENXIO;
01084 goto out_clear;
01085 }
01086 bd_set_size(bdev, (loff_t)bdev->bd_part->nr_sects << 9);
01087 }
01088 } else {
01089 put_disk(disk);
01090 module_put(disk->fops->owner);
01091 disk = NULL;
01092 if (bdev->bd_contains == bdev) {
01093 if (bdev->bd_disk->fops->open) {
01094 ret = bdev->bd_disk->fops->open(bdev, mode);
01095 if (ret)
01096 goto out_unlock_bdev;
01097 }
01098 if (bdev->bd_invalidated)
01099 rescan_partitions(bdev->bd_disk, bdev);
01100 }
01101 }
01102 bdev->bd_openers++;
01103 if (for_part)
01104 bdev->bd_part_count++;
01105 mutex_unlock(&bdev->bd_mutex);
01106 unlock_kernel();
01107 return 0;
01108
01109 out_clear:
01110 disk_put_part(bdev->bd_part);
01111 bdev->bd_disk = NULL;
01112 bdev->bd_part = NULL;
01113 bdev->bd_inode->i_data.backing_dev_info = &default_backing_dev_info;
01114 if (bdev != bdev->bd_contains)
01115 __blkdev_put(bdev->bd_contains, mode, 1);
01116 bdev->bd_contains = NULL;
01117 out_unlock_bdev:
01118 mutex_unlock(&bdev->bd_mutex);
01119 out_unlock_kernel:
01120 unlock_kernel();
01121
01122 if (disk)
01123 module_put(disk->fops->owner);
01124 put_disk(disk);
01125 bdput(bdev);
01126
01127 return ret;
01128 }
01129
01130 int blkdev_get(struct block_device *bdev, fmode_t mode)
01131 {
01132 return __blkdev_get(bdev, mode, 0);
01133 }
01134 EXPORT_SYMBOL(blkdev_get);
01135
01136 static int blkdev_open(struct inode * inode, struct file * filp)
01137 {
01138 struct block_device *bdev;
01139 int res;
01140
01141
01142
01143
01144
01145
01146
01147 filp->f_flags |= O_LARGEFILE;
01148
01149 if (filp->f_flags & O_NDELAY)
01150 filp->f_mode |= FMODE_NDELAY;
01151 if (filp->f_flags & O_EXCL)
01152 filp->f_mode |= FMODE_EXCL;
01153 if ((filp->f_flags & O_ACCMODE) == 3)
01154 filp->f_mode |= FMODE_WRITE_IOCTL;
01155
01156 bdev = bd_acquire(inode);
01157 if (bdev == NULL)
01158 return -ENOMEM;
01159
01160 filp->f_mapping = bdev->bd_inode->i_mapping;
01161
01162 res = blkdev_get(bdev, filp->f_mode);
01163 if (res)
01164 return res;
01165
01166 if (filp->f_mode & FMODE_EXCL) {
01167 res = bd_claim(bdev, filp);
01168 if (res)
01169 goto out_blkdev_put;
01170 }
01171
01172 return 0;
01173
01174 out_blkdev_put:
01175 blkdev_put(bdev, filp->f_mode);
01176 return res;
01177 }
01178
01179 static int __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part)
01180 {
01181 int ret = 0;
01182 struct gendisk *disk = bdev->bd_disk;
01183 struct block_device *victim = NULL;
01184
01185 mutex_lock_nested(&bdev->bd_mutex, for_part);
01186 lock_kernel();
01187 if (for_part)
01188 bdev->bd_part_count--;
01189
01190 if (!--bdev->bd_openers) {
01191 sync_blockdev(bdev);
01192 kill_bdev(bdev);
01193 }
01194 if (bdev->bd_contains == bdev) {
01195 if (disk->fops->release)
01196 ret = disk->fops->release(disk, mode);
01197 }
01198 if (!bdev->bd_openers) {
01199 struct module *owner = disk->fops->owner;
01200
01201 put_disk(disk);
01202 module_put(owner);
01203 disk_put_part(bdev->bd_part);
01204 bdev->bd_part = NULL;
01205 bdev->bd_disk = NULL;
01206 bdev->bd_inode->i_data.backing_dev_info = &default_backing_dev_info;
01207 if (bdev != bdev->bd_contains)
01208 victim = bdev->bd_contains;
01209 bdev->bd_contains = NULL;
01210 }
01211 unlock_kernel();
01212 mutex_unlock(&bdev->bd_mutex);
01213 bdput(bdev);
01214 if (victim)
01215 __blkdev_put(victim, mode, 1);
01216 return ret;
01217 }
01218
01219 int blkdev_put(struct block_device *bdev, fmode_t mode)
01220 {
01221 return __blkdev_put(bdev, mode, 0);
01222 }
01223 EXPORT_SYMBOL(blkdev_put);
01224
01225 static int blkdev_close(struct inode * inode, struct file * filp)
01226 {
01227 struct block_device *bdev = I_BDEV(filp->f_mapping->host);
01228 if (bdev->bd_holder == filp)
01229 bd_release(bdev);
01230 return blkdev_put(bdev, filp->f_mode);
01231 }
01232
01233 static long block_ioctl(struct file *file, unsigned cmd, unsigned long arg)
01234 {
01235 struct block_device *bdev = I_BDEV(file->f_mapping->host);
01236 fmode_t mode = file->f_mode;
01237
01238
01239
01240
01241
01242 if (file->f_flags & O_NDELAY)
01243 mode |= FMODE_NDELAY;
01244 else
01245 mode &= ~FMODE_NDELAY;
01246
01247 return blkdev_ioctl(bdev, mode, cmd, arg);
01248 }
01249
01250
01251
01252
01253
01254 static int blkdev_releasepage(struct page *page, gfp_t wait)
01255 {
01256 struct super_block *super = BDEV_I(page->mapping->host)->bdev.bd_super;
01257
01258 if (super && super->s_op->bdev_try_to_free_page)
01259 return super->s_op->bdev_try_to_free_page(super, page, wait);
01260
01261 return try_to_free_buffers(page);
01262 }
01263
01264 static const struct address_space_operations def_blk_aops = {
01265 .readpage = blkdev_readpage,
01266 .writepage = blkdev_writepage,
01267 .sync_page = block_sync_page,
01268 .write_begin = blkdev_write_begin,
01269 .write_end = blkdev_write_end,
01270 .writepages = generic_writepages,
01271 .releasepage = blkdev_releasepage,
01272 .direct_IO = blkdev_direct_IO,
01273 };
01274
01275 const struct file_operations def_blk_fops = {
01276 .open = blkdev_open,
01277 .release = blkdev_close,
01278 #ifndef DDE_LINUX
01279 .llseek = block_llseek,
01280 .read = do_sync_read,
01281 .write = do_sync_write,
01282 .aio_read = generic_file_aio_read,
01283 .aio_write = generic_file_aio_write_nolock,
01284 .mmap = generic_file_mmap,
01285 .fsync = block_fsync,
01286 .unlocked_ioctl = block_ioctl,
01287 #ifdef CONFIG_COMPAT
01288 .compat_ioctl = compat_blkdev_ioctl,
01289 #endif
01290 .splice_read = generic_file_splice_read,
01291 .splice_write = generic_file_splice_write,
01292 #endif
01293 };
01294
01295 int ioctl_by_bdev(struct block_device *bdev, unsigned cmd, unsigned long arg)
01296 {
01297 int res;
01298 mm_segment_t old_fs = get_fs();
01299 set_fs(KERNEL_DS);
01300 res = blkdev_ioctl(bdev, 0, cmd, arg);
01301 set_fs(old_fs);
01302 return res;
01303 }
01304
01305 EXPORT_SYMBOL(ioctl_by_bdev);
01306
01307
01308
01309
01310
01311
01312
01313
01314
01315 struct block_device *lookup_bdev(const char *pathname)
01316 {
01317 struct block_device *bdev;
01318 struct inode *inode;
01319 struct path path;
01320 int error;
01321
01322 if (!pathname || !*pathname)
01323 return ERR_PTR(-EINVAL);
01324
01325 error = kern_path(pathname, LOOKUP_FOLLOW, &path);
01326 if (error)
01327 return ERR_PTR(error);
01328
01329 inode = path.dentry->d_inode;
01330 error = -ENOTBLK;
01331 if (!S_ISBLK(inode->i_mode))
01332 goto fail;
01333 error = -EACCES;
01334 if (path.mnt->mnt_flags & MNT_NODEV)
01335 goto fail;
01336 error = -ENOMEM;
01337 bdev = bd_acquire(inode);
01338 if (!bdev)
01339 goto fail;
01340 out:
01341 path_put(&path);
01342 return bdev;
01343 fail:
01344 bdev = ERR_PTR(error);
01345 goto out;
01346 }
01347 EXPORT_SYMBOL(lookup_bdev);
01348
01349
01350
01351
01352
01353
01354
01355
01356
01357
01358
01359 struct block_device *open_bdev_exclusive(const char *path, fmode_t mode, void *holder)
01360 {
01361 struct block_device *bdev;
01362 int error = 0;
01363
01364 bdev = lookup_bdev(path);
01365 if (IS_ERR(bdev))
01366 return bdev;
01367
01368 error = blkdev_get(bdev, mode);
01369 if (error)
01370 return ERR_PTR(error);
01371 error = -EACCES;
01372 if ((mode & FMODE_WRITE) && bdev_read_only(bdev))
01373 goto blkdev_put;
01374 error = bd_claim(bdev, holder);
01375 if (error)
01376 goto blkdev_put;
01377
01378 return bdev;
01379
01380 blkdev_put:
01381 blkdev_put(bdev, mode);
01382 return ERR_PTR(error);
01383 }
01384
01385 EXPORT_SYMBOL(open_bdev_exclusive);
01386
01387
01388
01389
01390
01391
01392
01393
01394
01395 void close_bdev_exclusive(struct block_device *bdev, fmode_t mode)
01396 {
01397 bd_release(bdev);
01398 blkdev_put(bdev, mode);
01399 }
01400
01401 EXPORT_SYMBOL(close_bdev_exclusive);
01402
01403 int __invalidate_device(struct block_device *bdev)
01404 {
01405 struct super_block *sb = get_super(bdev);
01406 int res = 0;
01407
01408 if (sb) {
01409
01410
01411
01412
01413
01414
01415 shrink_dcache_sb(sb);
01416 res = invalidate_inodes(sb);
01417 drop_super(sb);
01418 }
01419 invalidate_bdev(bdev);
01420 return res;
01421 }
01422 EXPORT_SYMBOL(__invalidate_device);