linux/fs/block_dev.c
<<
>>
Prefs
   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
   8#include <linux/init.h>
   9#include <linux/mm.h>
  10#include <linux/fcntl.h>
  11#include <linux/slab.h>
  12#include <linux/kmod.h>
  13#include <linux/major.h>
  14#include <linux/smp_lock.h>
  15#include <linux/highmem.h>
  16#include <linux/blkdev.h>
  17#include <linux/module.h>
  18#include <linux/blkpg.h>
  19#include <linux/buffer_head.h>
  20#include <linux/writeback.h>
  21#include <linux/mpage.h>
  22#include <linux/mount.h>
  23#include <linux/uio.h>
  24#include <linux/namei.h>
  25#include <linux/log2.h>
  26#include <asm/uaccess.h>
  27#include "internal.h"
  28
  29struct bdev_inode {
  30        struct block_device bdev;
  31        struct inode vfs_inode;
  32};
  33
  34static inline struct bdev_inode *BDEV_I(struct inode *inode)
  35{
  36        return container_of(inode, struct bdev_inode, vfs_inode);
  37}
  38
  39inline struct block_device *I_BDEV(struct inode *inode)
  40{
  41        return &BDEV_I(inode)->bdev;
  42}
  43
  44EXPORT_SYMBOL(I_BDEV);
  45
  46static sector_t max_block(struct block_device *bdev)
  47{
  48        sector_t retval = ~((sector_t)0);
  49        loff_t sz = i_size_read(bdev->bd_inode);
  50
  51        if (sz) {
  52                unsigned int size = block_size(bdev);
  53                unsigned int sizebits = blksize_bits(size);
  54                retval = (sz >> sizebits);
  55        }
  56        return retval;
  57}
  58
  59/* Kill _all_ buffers and pagecache , dirty or not.. */
  60static void kill_bdev(struct block_device *bdev)
  61{
  62        if (bdev->bd_inode->i_mapping->nrpages == 0)
  63                return;
  64        invalidate_bh_lrus();
  65        truncate_inode_pages(bdev->bd_inode->i_mapping, 0);
  66}       
  67
  68int set_blocksize(struct block_device *bdev, int size)
  69{
  70        /* Size must be a power of two, and between 512 and PAGE_SIZE */
  71        if (size > PAGE_SIZE || size < 512 || !is_power_of_2(size))
  72                return -EINVAL;
  73
  74        /* Size cannot be smaller than the size supported by the device */
  75        if (size < bdev_hardsect_size(bdev))
  76                return -EINVAL;
  77
  78        /* Don't change the size if it is same as current */
  79        if (bdev->bd_block_size != size) {
  80                sync_blockdev(bdev);
  81                bdev->bd_block_size = size;
  82                bdev->bd_inode->i_blkbits = blksize_bits(size);
  83                kill_bdev(bdev);
  84        }
  85        return 0;
  86}
  87
  88EXPORT_SYMBOL(set_blocksize);
  89
  90int sb_set_blocksize(struct super_block *sb, int size)
  91{
  92        if (set_blocksize(sb->s_bdev, size))
  93                return 0;
  94        /* If we get here, we know size is power of two
  95         * and it's value is between 512 and PAGE_SIZE */
  96        sb->s_blocksize = size;
  97        sb->s_blocksize_bits = blksize_bits(size);
  98        return sb->s_blocksize;
  99}
 100
 101EXPORT_SYMBOL(sb_set_blocksize);
 102
 103int sb_min_blocksize(struct super_block *sb, int size)
 104{
 105        int minsize = bdev_hardsect_size(sb->s_bdev);
 106        if (size < minsize)
 107                size = minsize;
 108        return sb_set_blocksize(sb, size);
 109}
 110
 111EXPORT_SYMBOL(sb_min_blocksize);
 112
 113static int
 114blkdev_get_block(struct inode *inode, sector_t iblock,
 115                struct buffer_head *bh, int create)
 116{
 117        if (iblock >= max_block(I_BDEV(inode))) {
 118                if (create)
 119                        return -EIO;
 120
 121                /*
 122                 * for reads, we're just trying to fill a partial page.
 123                 * return a hole, they will have to call get_block again
 124                 * before they can fill it, and they will get -EIO at that
 125                 * time
 126                 */
 127                return 0;
 128        }
 129        bh->b_bdev = I_BDEV(inode);
 130        bh->b_blocknr = iblock;
 131        set_buffer_mapped(bh);
 132        return 0;
 133}
 134
 135static int
 136blkdev_get_blocks(struct inode *inode, sector_t iblock,
 137                struct buffer_head *bh, int create)
 138{
 139        sector_t end_block = max_block(I_BDEV(inode));
 140        unsigned long max_blocks = bh->b_size >> inode->i_blkbits;
 141
 142        if ((iblock + max_blocks) > end_block) {
 143                max_blocks = end_block - iblock;
 144                if ((long)max_blocks <= 0) {
 145                        if (create)
 146                                return -EIO;    /* write fully beyond EOF */
 147                        /*
 148                         * It is a read which is fully beyond EOF.  We return
 149                         * a !buffer_mapped buffer
 150                         */
 151                        max_blocks = 0;
 152                }
 153        }
 154
 155        bh->b_bdev = I_BDEV(inode);
 156        bh->b_blocknr = iblock;
 157        bh->b_size = max_blocks << inode->i_blkbits;
 158        if (max_blocks)
 159                set_buffer_mapped(bh);
 160        return 0;
 161}
 162
 163static ssize_t
 164blkdev_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
 165                        loff_t offset, unsigned long nr_segs)
 166{
 167        struct file *file = iocb->ki_filp;
 168        struct inode *inode = file->f_mapping->host;
 169
 170        return blockdev_direct_IO_no_locking(rw, iocb, inode, I_BDEV(inode),
 171                                iov, offset, nr_segs, blkdev_get_blocks, NULL);
 172}
 173
 174#if 0
 175static int blk_end_aio(struct bio *bio, unsigned int bytes_done, int error)
 176{
 177        struct kiocb *iocb = bio->bi_private;
 178        atomic_t *bio_count = &iocb->ki_bio_count;
 179
 180        if (bio_data_dir(bio) == READ)
 181                bio_check_pages_dirty(bio);
 182        else {
 183                bio_release_pages(bio);
 184                bio_put(bio);
 185        }
 186
 187        /* iocb->ki_nbytes stores error code from LLDD */
 188        if (error)
 189                iocb->ki_nbytes = -EIO;
 190
 191        if (atomic_dec_and_test(bio_count)) {
 192                if ((long)iocb->ki_nbytes < 0)
 193                        aio_complete(iocb, iocb->ki_nbytes, 0);
 194                else
 195                        aio_complete(iocb, iocb->ki_left, 0);
 196        }
 197
 198        return 0;
 199}
 200
 201#define VEC_SIZE        16
 202struct pvec {
 203        unsigned short nr;
 204        unsigned short idx;
 205        struct page *page[VEC_SIZE];
 206};
 207
 208#define PAGES_SPANNED(addr, len)        \
 209        (DIV_ROUND_UP((addr) + (len), PAGE_SIZE) - (addr) / PAGE_SIZE);
 210
 211/*
 212 * get page pointer for user addr, we internally cache struct page array for
 213 * (addr, count) range in pvec to avoid frequent call to get_user_pages.  If
 214 * internal page list is exhausted, a batch count of up to VEC_SIZE is used
 215 * to get next set of page struct.
 216 */
 217static struct page *blk_get_page(unsigned long addr, size_t count, int rw,
 218                                 struct pvec *pvec)
 219{
 220        int ret, nr_pages;
 221        if (pvec->idx == pvec->nr) {
 222                nr_pages = PAGES_SPANNED(addr, count);
 223                nr_pages = min(nr_pages, VEC_SIZE);
 224                down_read(&current->mm->mmap_sem);
 225                ret = get_user_pages(current, current->mm, addr, nr_pages,
 226                                     rw == READ, 0, pvec->page, NULL);
 227                up_read(&current->mm->mmap_sem);
 228                if (ret < 0)
 229                        return ERR_PTR(ret);
 230                pvec->nr = ret;
 231                pvec->idx = 0;
 232        }
 233        return pvec->page[pvec->idx++];
 234}
 235
 236/* return a page back to pvec array */
 237static void blk_unget_page(struct page *page, struct pvec *pvec)
 238{
 239        pvec->page[--pvec->idx] = page;
 240}
 241
 242static ssize_t
 243blkdev_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
 244                 loff_t pos, unsigned long nr_segs)
 245{
 246        struct inode *inode = iocb->ki_filp->f_mapping->host;
 247        unsigned blkbits = blksize_bits(bdev_hardsect_size(I_BDEV(inode)));
 248        unsigned blocksize_mask = (1 << blkbits) - 1;
 249        unsigned long seg = 0;  /* iov segment iterator */
 250        unsigned long nvec;     /* number of bio vec needed */
 251        unsigned long cur_off;  /* offset into current page */
 252        unsigned long cur_len;  /* I/O len of current page, up to PAGE_SIZE */
 253
 254        unsigned long addr;     /* user iovec address */
 255        size_t count;           /* user iovec len */
 256        size_t nbytes = iocb->ki_nbytes = iocb->ki_left; /* total xfer size */
 257        loff_t size;            /* size of block device */
 258        struct bio *bio;
 259        atomic_t *bio_count = &iocb->ki_bio_count;
 260        struct page *page;
 261        struct pvec pvec;
 262
 263        pvec.nr = 0;
 264        pvec.idx = 0;
 265
 266        if (pos & blocksize_mask)
 267                return -EINVAL;
 268
 269        size = i_size_read(inode);
 270        if (pos + nbytes > size) {
 271                nbytes = size - pos;
 272                iocb->ki_left = nbytes;
 273        }
 274
 275        /*
 276         * check first non-zero iov alignment, the remaining
 277         * iov alignment is checked inside bio loop below.
 278         */
 279        do {
 280                addr = (unsigned long) iov[seg].iov_base;
 281                count = min(iov[seg].iov_len, nbytes);
 282                if (addr & blocksize_mask || count & blocksize_mask)
 283                        return -EINVAL;
 284        } while (!count && ++seg < nr_segs);
 285        atomic_set(bio_count, 1);
 286
 287        while (nbytes) {
 288                /* roughly estimate number of bio vec needed */
 289                nvec = (nbytes + PAGE_SIZE - 1) / PAGE_SIZE;
 290                nvec = max(nvec, nr_segs - seg);
 291                nvec = min(nvec, (unsigned long) BIO_MAX_PAGES);
 292
 293                /* bio_alloc should not fail with GFP_KERNEL flag */
 294                bio = bio_alloc(GFP_KERNEL, nvec);
 295                bio->bi_bdev = I_BDEV(inode);
 296                bio->bi_end_io = blk_end_aio;
 297                bio->bi_private = iocb;
 298                bio->bi_sector = pos >> blkbits;
 299same_bio:
 300                cur_off = addr & ~PAGE_MASK;
 301                cur_len = PAGE_SIZE - cur_off;
 302                if (count < cur_len)
 303                        cur_len = count;
 304
 305                page = blk_get_page(addr, count, rw, &pvec);
 306                if (unlikely(IS_ERR(page)))
 307                        goto backout;
 308
 309                if (bio_add_page(bio, page, cur_len, cur_off)) {
 310                        pos += cur_len;
 311                        addr += cur_len;
 312                        count -= cur_len;
 313                        nbytes -= cur_len;
 314
 315                        if (count)
 316                                goto same_bio;
 317                        while (++seg < nr_segs) {
 318                                addr = (unsigned long) iov[seg].iov_base;
 319                                count = iov[seg].iov_len;
 320                                if (!count)
 321                                        continue;
 322                                if (unlikely(addr & blocksize_mask ||
 323                                             count & blocksize_mask)) {
 324                                        page = ERR_PTR(-EINVAL);
 325                                        goto backout;
 326                                }
 327                                count = min(count, nbytes);
 328                                goto same_bio;
 329                        }
 330                } else {
 331                        blk_unget_page(page, &pvec);
 332                }
 333
 334                /* bio is ready, submit it */
 335                if (rw == READ)
 336                        bio_set_pages_dirty(bio);
 337                atomic_inc(bio_count);
 338                submit_bio(rw, bio);
 339        }
 340
 341completion:
 342        iocb->ki_left -= nbytes;
 343        nbytes = iocb->ki_left;
 344        iocb->ki_pos += nbytes;
 345
 346        blk_run_address_space(inode->i_mapping);
 347        if (atomic_dec_and_test(bio_count))
 348                aio_complete(iocb, nbytes, 0);
 349
 350        return -EIOCBQUEUED;
 351
 352backout:
 353        /*
 354         * back out nbytes count constructed so far for this bio,
 355         * we will throw away current bio.
 356         */
 357        nbytes += bio->bi_size;
 358        bio_release_pages(bio);
 359        bio_put(bio);
 360
 361        /*
 362         * if no bio was submmitted, return the error code.
 363         * otherwise, proceed with pending I/O completion.
 364         */
 365        if (atomic_read(bio_count) == 1)
 366                return PTR_ERR(page);
 367        goto completion;
 368}
 369#endif
 370
 371static int blkdev_writepage(struct page *page, struct writeback_control *wbc)
 372{
 373        return block_write_full_page(page, blkdev_get_block, wbc);
 374}
 375
 376static int blkdev_readpage(struct file * file, struct page * page)
 377{
 378        return block_read_full_page(page, blkdev_get_block);
 379}
 380
 381static int blkdev_prepare_write(struct file *file, struct page *page, unsigned from, unsigned to)
 382{
 383        return block_prepare_write(page, from, to, blkdev_get_block);
 384}
 385
 386static int blkdev_commit_write(struct file *file, struct page *page, unsigned from, unsigned to)
 387{
 388        return block_commit_write(page, from, to);
 389}
 390
 391/*
 392 * private llseek:
 393 * for a block special file file->f_path.dentry->d_inode->i_size is zero
 394 * so we compute the size by hand (just as in block_read/write above)
 395 */
 396static loff_t block_llseek(struct file *file, loff_t offset, int origin)
 397{
 398        struct inode *bd_inode = file->f_mapping->host;
 399        loff_t size;
 400        loff_t retval;
 401
 402        mutex_lock(&bd_inode->i_mutex);
 403        size = i_size_read(bd_inode);
 404
 405        switch (origin) {
 406                case 2:
 407                        offset += size;
 408                        break;
 409                case 1:
 410                        offset += file->f_pos;
 411        }
 412        retval = -EINVAL;
 413        if (offset >= 0 && offset <= size) {
 414                if (offset != file->f_pos) {
 415                        file->f_pos = offset;
 416                }
 417                retval = offset;
 418        }
 419        mutex_unlock(&bd_inode->i_mutex);
 420        return retval;
 421}
 422        
 423/*
 424 *      Filp is never NULL; the only case when ->fsync() is called with
 425 *      NULL first argument is nfsd_sync_dir() and that's not a directory.
 426 */
 427 
 428static int block_fsync(struct file *filp, struct dentry *dentry, int datasync)
 429{
 430        return sync_blockdev(I_BDEV(filp->f_mapping->host));
 431}
 432
 433/*
 434 * pseudo-fs
 435 */
 436
 437static  __cacheline_aligned_in_smp DEFINE_SPINLOCK(bdev_lock);
 438static struct kmem_cache * bdev_cachep __read_mostly;
 439
 440static struct inode *bdev_alloc_inode(struct super_block *sb)
 441{
 442        struct bdev_inode *ei = kmem_cache_alloc(bdev_cachep, GFP_KERNEL);
 443        if (!ei)
 444                return NULL;
 445        return &ei->vfs_inode;
 446}
 447
 448static void bdev_destroy_inode(struct inode *inode)
 449{
 450        struct bdev_inode *bdi = BDEV_I(inode);
 451
 452        bdi->bdev.bd_inode_backing_dev_info = NULL;
 453        kmem_cache_free(bdev_cachep, bdi);
 454}
 455
 456static void init_once(void * foo, struct kmem_cache * cachep, unsigned long flags)
 457{
 458        struct bdev_inode *ei = (struct bdev_inode *) foo;
 459        struct block_device *bdev = &ei->bdev;
 460
 461        memset(bdev, 0, sizeof(*bdev));
 462        mutex_init(&bdev->bd_mutex);
 463        sema_init(&bdev->bd_mount_sem, 1);
 464        INIT_LIST_HEAD(&bdev->bd_inodes);
 465        INIT_LIST_HEAD(&bdev->bd_list);
 466#ifdef CONFIG_SYSFS
 467        INIT_LIST_HEAD(&bdev->bd_holder_list);
 468#endif
 469        inode_init_once(&ei->vfs_inode);
 470}
 471
 472static inline void __bd_forget(struct inode *inode)
 473{
 474        list_del_init(&inode->i_devices);
 475        inode->i_bdev = NULL;
 476        inode->i_mapping = &inode->i_data;
 477}
 478
 479static void bdev_clear_inode(struct inode *inode)
 480{
 481        struct block_device *bdev = &BDEV_I(inode)->bdev;
 482        struct list_head *p;
 483        spin_lock(&bdev_lock);
 484        while ( (p = bdev->bd_inodes.next) != &bdev->bd_inodes ) {
 485                __bd_forget(list_entry(p, struct inode, i_devices));
 486        }
 487        list_del_init(&bdev->bd_list);
 488        spin_unlock(&bdev_lock);
 489}
 490
 491static const struct super_operations bdev_sops = {
 492        .statfs = simple_statfs,
 493        .alloc_inode = bdev_alloc_inode,
 494        .destroy_inode = bdev_destroy_inode,
 495        .drop_inode = generic_delete_inode,
 496        .clear_inode = bdev_clear_inode,
 497};
 498
 499static int bd_get_sb(struct file_system_type *fs_type,
 500        int flags, const char *dev_name, void *data, struct vfsmount *mnt)
 501{
 502        return get_sb_pseudo(fs_type, "bdev:", &bdev_sops, 0x62646576, mnt);
 503}
 504
 505static struct file_system_type bd_type = {
 506        .name           = "bdev",
 507        .get_sb         = bd_get_sb,
 508        .kill_sb        = kill_anon_super,
 509};
 510
 511static struct vfsmount *bd_mnt __read_mostly;
 512struct super_block *blockdev_superblock;
 513
 514void __init bdev_cache_init(void)
 515{
 516        int err;
 517        bdev_cachep = kmem_cache_create("bdev_cache", sizeof(struct bdev_inode),
 518                        0, (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
 519                                SLAB_MEM_SPREAD|SLAB_PANIC),
 520                        init_once, NULL);
 521        err = register_filesystem(&bd_type);
 522        if (err)
 523                panic("Cannot register bdev pseudo-fs");
 524        bd_mnt = kern_mount(&bd_type);
 525        err = PTR_ERR(bd_mnt);
 526        if (IS_ERR(bd_mnt))
 527                panic("Cannot create bdev pseudo-fs");
 528        blockdev_superblock = bd_mnt->mnt_sb;   /* For writeback */
 529}
 530
 531/*
 532 * Most likely _very_ bad one - but then it's hardly critical for small
 533 * /dev and can be fixed when somebody will need really large one.
 534 * Keep in mind that it will be fed through icache hash function too.
 535 */
 536static inline unsigned long hash(dev_t dev)
 537{
 538        return MAJOR(dev)+MINOR(dev);
 539}
 540
 541static int bdev_test(struct inode *inode, void *data)
 542{
 543        return BDEV_I(inode)->bdev.bd_dev == *(dev_t *)data;
 544}
 545
 546static int bdev_set(struct inode *inode, void *data)
 547{
 548        BDEV_I(inode)->bdev.bd_dev = *(dev_t *)data;
 549        return 0;
 550}
 551
 552static LIST_HEAD(all_bdevs);
 553
 554struct block_device *bdget(dev_t dev)
 555{
 556        struct block_device *bdev;
 557        struct inode *inode;
 558
 559        inode = iget5_locked(bd_mnt->mnt_sb, hash(dev),
 560                        bdev_test, bdev_set, &dev);
 561
 562        if (!inode)
 563                return NULL;
 564
 565        bdev = &BDEV_I(inode)->bdev;
 566
 567        if (inode->i_state & I_NEW) {
 568                bdev->bd_contains = NULL;
 569                bdev->bd_inode = inode;
 570                bdev->bd_block_size = (1 << inode->i_blkbits);
 571                bdev->bd_part_count = 0;
 572                bdev->bd_invalidated = 0;
 573                inode->i_mode = S_IFBLK;
 574                inode->i_rdev = dev;
 575                inode->i_bdev = bdev;
 576                inode->i_data.a_ops = &def_blk_aops;
 577                mapping_set_gfp_mask(&inode->i_data, GFP_USER);
 578                inode->i_data.backing_dev_info = &default_backing_dev_info;
 579                spin_lock(&bdev_lock);
 580                list_add(&bdev->bd_list, &all_bdevs);
 581                spin_unlock(&bdev_lock);
 582                unlock_new_inode(inode);
 583        }
 584        return bdev;
 585}
 586
 587EXPORT_SYMBOL(bdget);
 588
 589long nr_blockdev_pages(void)
 590{
 591        struct list_head *p;
 592        long ret = 0;
 593        spin_lock(&bdev_lock);
 594        list_for_each(p, &all_bdevs) {
 595                struct block_device *bdev;
 596                bdev = list_entry(p, struct block_device, bd_list);
 597                ret += bdev->bd_inode->i_mapping->nrpages;
 598        }
 599        spin_unlock(&bdev_lock);
 600        return ret;
 601}
 602
 603void bdput(struct block_device *bdev)
 604{
 605        iput(bdev->bd_inode);
 606}
 607
 608EXPORT_SYMBOL(bdput);
 609 
 610static struct block_device *bd_acquire(struct inode *inode)
 611{
 612        struct block_device *bdev;
 613
 614        spin_lock(&bdev_lock);
 615        bdev = inode->i_bdev;
 616        if (bdev) {
 617                atomic_inc(&bdev->bd_inode->i_count);
 618                spin_unlock(&bdev_lock);
 619                return bdev;
 620        }
 621        spin_unlock(&bdev_lock);
 622
 623        bdev = bdget(inode->i_rdev);
 624        if (bdev) {
 625                spin_lock(&bdev_lock);
 626                if (!inode->i_bdev) {
 627                        /*
 628                         * We take an additional bd_inode->i_count for inode,
 629                         * and it's released in clear_inode() of inode.
 630                         * So, we can access it via ->i_mapping always
 631                         * without igrab().
 632                         */
 633                        atomic_inc(&bdev->bd_inode->i_count);
 634                        inode->i_bdev = bdev;
 635                        inode->i_mapping = bdev->bd_inode->i_mapping;
 636                        list_add(&inode->i_devices, &bdev->bd_inodes);
 637                }
 638                spin_unlock(&bdev_lock);
 639        }
 640        return bdev;
 641}
 642
 643/* Call when you free inode */
 644
 645void bd_forget(struct inode *inode)
 646{
 647        struct block_device *bdev = NULL;
 648
 649        spin_lock(&bdev_lock);
 650        if (inode->i_bdev) {
 651                if (inode->i_sb != blockdev_superblock)
 652                        bdev = inode->i_bdev;
 653                __bd_forget(inode);
 654        }
 655        spin_unlock(&bdev_lock);
 656
 657        if (bdev)
 658                iput(bdev->bd_inode);
 659}
 660
 661int bd_claim(struct block_device *bdev, void *holder)
 662{
 663        int res;
 664        spin_lock(&bdev_lock);
 665
 666        /* first decide result */
 667        if (bdev->bd_holder == holder)
 668                res = 0;         /* already a holder */
 669        else if (bdev->bd_holder != NULL)
 670                res = -EBUSY;    /* held by someone else */
 671        else if (bdev->bd_contains == bdev)
 672                res = 0;         /* is a whole device which isn't held */
 673
 674        else if (bdev->bd_contains->bd_holder == bd_claim)
 675                res = 0;         /* is a partition of a device that is being partitioned */
 676        else if (bdev->bd_contains->bd_holder != NULL)
 677                res = -EBUSY;    /* is a partition of a held device */
 678        else
 679                res = 0;         /* is a partition of an un-held device */
 680
 681        /* now impose change */
 682        if (res==0) {
 683                /* note that for a whole device bd_holders
 684                 * will be incremented twice, and bd_holder will
 685                 * be set to bd_claim before being set to holder
 686                 */
 687                bdev->bd_contains->bd_holders ++;
 688                bdev->bd_contains->bd_holder = bd_claim;
 689                bdev->bd_holders++;
 690                bdev->bd_holder = holder;
 691        }
 692        spin_unlock(&bdev_lock);
 693        return res;
 694}
 695
 696EXPORT_SYMBOL(bd_claim);
 697
 698void bd_release(struct block_device *bdev)
 699{
 700        spin_lock(&bdev_lock);
 701        if (!--bdev->bd_contains->bd_holders)
 702                bdev->bd_contains->bd_holder = NULL;
 703        if (!--bdev->bd_holders)
 704                bdev->bd_holder = NULL;
 705        spin_unlock(&bdev_lock);
 706}
 707
 708EXPORT_SYMBOL(bd_release);
 709
 710#ifdef CONFIG_SYSFS
 711/*
 712 * Functions for bd_claim_by_kobject / bd_release_from_kobject
 713 *
 714 *     If a kobject is passed to bd_claim_by_kobject()
 715 *     and the kobject has a parent directory,
 716 *     following symlinks are created:
 717 *        o from the kobject to the claimed bdev
 718 *        o from "holders" directory of the bdev to the parent of the kobject
 719 *     bd_release_from_kobject() removes these symlinks.
 720 *
 721 *     Example:
 722 *        If /dev/dm-0 maps to /dev/sda, kobject corresponding to
 723 *        /sys/block/dm-0/slaves is passed to bd_claim_by_kobject(), then:
 724 *           /sys/block/dm-0/slaves/sda --> /sys/block/sda
 725 *           /sys/block/sda/holders/dm-0 --> /sys/block/dm-0
 726 */
 727
 728static struct kobject *bdev_get_kobj(struct block_device *bdev)
 729{
 730        if (bdev->bd_contains != bdev)
 731                return kobject_get(&bdev->bd_part->kobj);
 732        else
 733                return kobject_get(&bdev->bd_disk->kobj);
 734}
 735
 736static struct kobject *bdev_get_holder(struct block_device *bdev)
 737{
 738        if (bdev->bd_contains != bdev)
 739                return kobject_get(bdev->bd_part->holder_dir);
 740        else
 741                return kobject_get(bdev->bd_disk->holder_dir);
 742}
 743
 744static int add_symlink(struct kobject *from, struct kobject *to)
 745{
 746        if (!from || !to)
 747                return 0;
 748        return sysfs_create_link(from, to, kobject_name(to));
 749}
 750
 751static void del_symlink(struct kobject *from, struct kobject *to)
 752{
 753        if (!from || !to)
 754                return;
 755        sysfs_remove_link(from, kobject_name(to));
 756}
 757
 758/*
 759 * 'struct bd_holder' contains pointers to kobjects symlinked by
 760 * bd_claim_by_kobject.
 761 * It's connected to bd_holder_list which is protected by bdev->bd_sem.
 762 */
 763struct bd_holder {
 764        struct list_head list;  /* chain of holders of the bdev */
 765        int count;              /* references from the holder */
 766        struct kobject *sdir;   /* holder object, e.g. "/block/dm-0/slaves" */
 767        struct kobject *hdev;   /* e.g. "/block/dm-0" */
 768        struct kobject *hdir;   /* e.g. "/block/sda/holders" */
 769        struct kobject *sdev;   /* e.g. "/block/sda" */
 770};
 771
 772/*
 773 * Get references of related kobjects at once.
 774 * Returns 1 on success. 0 on failure.
 775 *
 776 * Should call bd_holder_release_dirs() after successful use.
 777 */
 778static int bd_holder_grab_dirs(struct block_device *bdev,
 779                        struct bd_holder *bo)
 780{
 781        if (!bdev || !bo)
 782                return 0;
 783
 784        bo->sdir = kobject_get(bo->sdir);
 785        if (!bo->sdir)
 786                return 0;
 787
 788        bo->hdev = kobject_get(bo->sdir->parent);
 789        if (!bo->hdev)
 790                goto fail_put_sdir;
 791
 792        bo->sdev = bdev_get_kobj(bdev);
 793        if (!bo->sdev)
 794                goto fail_put_hdev;
 795
 796        bo->hdir = bdev_get_holder(bdev);
 797        if (!bo->hdir)
 798                goto fail_put_sdev;
 799
 800        return 1;
 801
 802fail_put_sdev:
 803        kobject_put(bo->sdev);
 804fail_put_hdev:
 805        kobject_put(bo->hdev);
 806fail_put_sdir:
 807        kobject_put(bo->sdir);
 808
 809        return 0;
 810}
 811
 812/* Put references of related kobjects at once. */
 813static void bd_holder_release_dirs(struct bd_holder *bo)
 814{
 815        kobject_put(bo->hdir);
 816        kobject_put(bo->sdev);
 817        kobject_put(bo->hdev);
 818        kobject_put(bo->sdir);
 819}
 820
 821static struct bd_holder *alloc_bd_holder(struct kobject *kobj)
 822{
 823        struct bd_holder *bo;
 824
 825        bo = kzalloc(sizeof(*bo), GFP_KERNEL);
 826        if (!bo)
 827                return NULL;
 828
 829        bo->count = 1;
 830        bo->sdir = kobj;
 831
 832        return bo;
 833}
 834
 835static void free_bd_holder(struct bd_holder *bo)
 836{
 837        kfree(bo);
 838}
 839
 840/**
 841 * find_bd_holder - find matching struct bd_holder from the block device
 842 *
 843 * @bdev:       struct block device to be searched
 844 * @bo:         target struct bd_holder
 845 *
 846 * Returns matching entry with @bo in @bdev->bd_holder_list.
 847 * If found, increment the reference count and return the pointer.
 848 * If not found, returns NULL.
 849 */
 850static struct bd_holder *find_bd_holder(struct block_device *bdev,
 851                                        struct bd_holder *bo)
 852{
 853        struct bd_holder *tmp;
 854
 855        list_for_each_entry(tmp, &bdev->bd_holder_list, list)
 856                if (tmp->sdir == bo->sdir) {
 857                        tmp->count++;
 858                        return tmp;
 859                }
 860
 861        return NULL;
 862}
 863
 864/**
 865 * add_bd_holder - create sysfs symlinks for bd_claim() relationship
 866 *
 867 * @bdev:       block device to be bd_claimed
 868 * @bo:         preallocated and initialized by alloc_bd_holder()
 869 *
 870 * Add @bo to @bdev->bd_holder_list, create symlinks.
 871 *
 872 * Returns 0 if symlinks are created.
 873 * Returns -ve if something fails.
 874 */
 875static int add_bd_holder(struct block_device *bdev, struct bd_holder *bo)
 876{
 877        int ret;
 878
 879        if (!bo)
 880                return -EINVAL;
 881
 882        if (!bd_holder_grab_dirs(bdev, bo))
 883                return -EBUSY;
 884
 885        ret = add_symlink(bo->sdir, bo->sdev);
 886        if (ret == 0) {
 887                ret = add_symlink(bo->hdir, bo->hdev);
 888                if (ret)
 889                        del_symlink(bo->sdir, bo->sdev);
 890        }
 891        if (ret == 0)
 892                list_add_tail(&bo->list, &bdev->bd_holder_list);
 893        return ret;
 894}
 895
 896/**
 897 * del_bd_holder - delete sysfs symlinks for bd_claim() relationship
 898 *
 899 * @bdev:       block device to be bd_claimed
 900 * @kobj:       holder's kobject
 901 *
 902 * If there is matching entry with @kobj in @bdev->bd_holder_list
 903 * and no other bd_claim() from the same kobject,
 904 * remove the struct bd_holder from the list, delete symlinks for it.
 905 *
 906 * Returns a pointer to the struct bd_holder when it's removed from the list
 907 * and ready to be freed.
 908 * Returns NULL if matching claim isn't found or there is other bd_claim()
 909 * by the same kobject.
 910 */
 911static struct bd_holder *del_bd_holder(struct block_device *bdev,
 912                                        struct kobject *kobj)
 913{
 914        struct bd_holder *bo;
 915
 916        list_for_each_entry(bo, &bdev->bd_holder_list, list) {
 917                if (bo->sdir == kobj) {
 918                        bo->count--;
 919                        BUG_ON(bo->count < 0);
 920                        if (!bo->count) {
 921                                list_del(&bo->list);
 922                                del_symlink(bo->sdir, bo->sdev);
 923                                del_symlink(bo->hdir, bo->hdev);
 924                                bd_holder_release_dirs(bo);
 925                                return bo;
 926                        }
 927                        break;
 928                }
 929        }
 930
 931        return NULL;
 932}
 933
 934/**
 935 * bd_claim_by_kobject - bd_claim() with additional kobject signature
 936 *
 937 * @bdev:       block device to be claimed
 938 * @holder:     holder's signature
 939 * @kobj:       holder's kobject
 940 *
 941 * Do bd_claim() and if it succeeds, create sysfs symlinks between
 942 * the bdev and the holder's kobject.
 943 * Use bd_release_from_kobject() when relesing the claimed bdev.
 944 *
 945 * Returns 0 on success. (same as bd_claim())
 946 * Returns errno on failure.
 947 */
 948static int bd_claim_by_kobject(struct block_device *bdev, void *holder,
 949                                struct kobject *kobj)
 950{
 951        int res;
 952        struct bd_holder *bo, *found;
 953
 954        if (!kobj)
 955                return -EINVAL;
 956
 957        bo = alloc_bd_holder(kobj);
 958        if (!bo)
 959                return -ENOMEM;
 960
 961        mutex_lock(&bdev->bd_mutex);
 962        res = bd_claim(bdev, holder);
 963        if (res == 0) {
 964                found = find_bd_holder(bdev, bo);
 965                if (found == NULL) {
 966                        res = add_bd_holder(bdev, bo);
 967                        if (res)
 968                                bd_release(bdev);
 969                }
 970        }
 971
 972        if (res || found)
 973                free_bd_holder(bo);
 974        mutex_unlock(&bdev->bd_mutex);
 975
 976        return res;
 977}
 978
 979/**
 980 * bd_release_from_kobject - bd_release() with additional kobject signature
 981 *
 982 * @bdev:       block device to be released
 983 * @kobj:       holder's kobject
 984 *
 985 * Do bd_release() and remove sysfs symlinks created by bd_claim_by_kobject().
 986 */
 987static void bd_release_from_kobject(struct block_device *bdev,
 988                                        struct kobject *kobj)
 989{
 990        struct bd_holder *bo;
 991
 992        if (!kobj)
 993                return;
 994
 995        mutex_lock(&bdev->bd_mutex);
 996        bd_release(bdev);
 997        if ((bo = del_bd_holder(bdev, kobj)))
 998                free_bd_holder(bo);
 999        mutex_unlock(&bdev->bd_mutex);
1000}
1001
1002/**
1003 * bd_claim_by_disk - wrapper function for bd_claim_by_kobject()
1004 *
1005 * @bdev:       block device to be claimed
1006 * @holder:     holder's signature
1007 * @disk:       holder's gendisk
1008 *
1009 * Call bd_claim_by_kobject() with getting @disk->slave_dir.
1010 */
1011int bd_claim_by_disk(struct block_device *bdev, void *holder,
1012                        struct gendisk *disk)
1013{
1014        return bd_claim_by_kobject(bdev, holder, kobject_get(disk->slave_dir));
1015}
1016EXPORT_SYMBOL_GPL(bd_claim_by_disk);
1017
1018/**
1019 * bd_release_from_disk - wrapper function for bd_release_from_kobject()
1020 *
1021 * @bdev:       block device to be claimed
1022 * @disk:       holder's gendisk
1023 *
1024 * Call bd_release_from_kobject() and put @disk->slave_dir.
1025 */
1026void bd_release_from_disk(struct block_device *bdev, struct gendisk *disk)
1027{
1028        bd_release_from_kobject(bdev, disk->slave_dir);
1029        kobject_put(disk->slave_dir);
1030}
1031EXPORT_SYMBOL_GPL(bd_release_from_disk);
1032#endif
1033
1034/*
1035 * Tries to open block device by device number.  Use it ONLY if you
1036 * really do not have anything better - i.e. when you are behind a
1037 * truly sucky interface and all you are given is a device number.  _Never_
1038 * to be used for internal purposes.  If you ever need it - reconsider
1039 * your API.
1040 */
1041struct block_device *open_by_devnum(dev_t dev, unsigned mode)
1042{
1043        struct block_device *bdev = bdget(dev);
1044        int err = -ENOMEM;
1045        int flags = mode & FMODE_WRITE ? O_RDWR : O_RDONLY;
1046        if (bdev)
1047                err = blkdev_get(bdev, mode, flags);
1048        return err ? ERR_PTR(err) : bdev;
1049}
1050
1051EXPORT_SYMBOL(open_by_devnum);
1052
1053/*
1054 * This routine checks whether a removable media has been changed,
1055 * and invalidates all buffer-cache-entries in that case. This
1056 * is a relatively slow routine, so we have to try to minimize using
1057 * it. Thus it is called only upon a 'mount' or 'open'. This
1058 * is the best way of combining speed and utility, I think.
1059 * People changing diskettes in the middle of an operation deserve
1060 * to lose :-)
1061 */
1062int check_disk_change(struct block_device *bdev)
1063{
1064        struct gendisk *disk = bdev->bd_disk;
1065        struct block_device_operations * bdops = disk->fops;
1066
1067        if (!bdops->media_changed)
1068                return 0;
1069        if (!bdops->media_changed(bdev->bd_disk))
1070                return 0;
1071
1072        if (__invalidate_device(bdev))
1073                printk("VFS: busy inodes on changed media.\n");
1074
1075        if (bdops->revalidate_disk)
1076                bdops->revalidate_disk(bdev->bd_disk);
1077        if (bdev->bd_disk->minors > 1)
1078                bdev->bd_invalidated = 1;
1079        return 1;
1080}
1081
1082EXPORT_SYMBOL(check_disk_change);
1083
1084void bd_set_size(struct block_device *bdev, loff_t size)
1085{
1086        unsigned bsize = bdev_hardsect_size(bdev);
1087
1088        bdev->bd_inode->i_size = size;
1089        while (bsize < PAGE_CACHE_SIZE) {
1090                if (size & bsize)
1091                        break;
1092                bsize <<= 1;
1093        }
1094        bdev->bd_block_size = bsize;
1095        bdev->bd_inode->i_blkbits = blksize_bits(bsize);
1096}
1097EXPORT_SYMBOL(bd_set_size);
1098
1099static int __blkdev_get(struct block_device *bdev, mode_t mode, unsigned flags,
1100                        int for_part);
1101static int __blkdev_put(struct block_device *bdev, int for_part);
1102
1103/*
1104 * bd_mutex locking:
1105 *
1106 *  mutex_lock(part->bd_mutex)
1107 *    mutex_lock_nested(whole->bd_mutex, 1)
1108 */
1109
1110static int do_open(struct block_device *bdev, struct file *file, int for_part)
1111{
1112        struct module *owner = NULL;
1113        struct gendisk *disk;
1114        int ret = -ENXIO;
1115        int part;
1116
1117        file->f_mapping = bdev->bd_inode->i_mapping;
1118        lock_kernel();
1119        disk = get_gendisk(bdev->bd_dev, &part);
1120        if (!disk) {
1121                unlock_kernel();
1122                bdput(bdev);
1123                return ret;
1124        }
1125        owner = disk->fops->owner;
1126
1127        mutex_lock_nested(&bdev->bd_mutex, for_part);
1128        if (!bdev->bd_openers) {
1129                bdev->bd_disk = disk;
1130                bdev->bd_contains = bdev;
1131                if (!part) {
1132                        struct backing_dev_info *bdi;
1133                        if (disk->fops->open) {
1134                                ret = disk->fops->open(bdev->bd_inode, file);
1135                                if (ret)
1136                                        goto out_first;
1137                        }
1138                        if (!bdev->bd_openers) {
1139                                bd_set_size(bdev,(loff_t)get_capacity(disk)<<9);
1140                                bdi = blk_get_backing_dev_info(bdev);
1141                                if (bdi == NULL)
1142                                        bdi = &default_backing_dev_info;
1143                                bdev->bd_inode->i_data.backing_dev_info = bdi;
1144                        }
1145                        if (bdev->bd_invalidated)
1146                                rescan_partitions(disk, bdev);
1147                } else {
1148                        struct hd_struct *p;
1149                        struct block_device *whole;
1150                        whole = bdget_disk(disk, 0);
1151                        ret = -ENOMEM;
1152                        if (!whole)
1153                                goto out_first;
1154                        BUG_ON(for_part);
1155                        ret = __blkdev_get(whole, file->f_mode, file->f_flags, 1);
1156                        if (ret)
1157                                goto out_first;
1158                        bdev->bd_contains = whole;
1159                        p = disk->part[part - 1];
1160                        bdev->bd_inode->i_data.backing_dev_info =
1161                           whole->bd_inode->i_data.backing_dev_info;
1162                        if (!(disk->flags & GENHD_FL_UP) || !p || !p->nr_sects) {
1163                                ret = -ENXIO;
1164                                goto out_first;
1165                        }
1166                        kobject_get(&p->kobj);
1167                        bdev->bd_part = p;
1168                        bd_set_size(bdev, (loff_t) p->nr_sects << 9);
1169                }
1170        } else {
1171                put_disk(disk);
1172                module_put(owner);
1173                if (bdev->bd_contains == bdev) {
1174                        if (bdev->bd_disk->fops->open) {
1175                                ret = bdev->bd_disk->fops->open(bdev->bd_inode, file);
1176                                if (ret)
1177                                        goto out;
1178                        }
1179                        if (bdev->bd_invalidated)
1180                                rescan_partitions(bdev->bd_disk, bdev);
1181                }
1182        }
1183        bdev->bd_openers++;
1184        if (for_part)
1185                bdev->bd_part_count++;
1186        mutex_unlock(&bdev->bd_mutex);
1187        unlock_kernel();
1188        return 0;
1189
1190out_first:
1191        bdev->bd_disk = NULL;
1192        bdev->bd_inode->i_data.backing_dev_info = &default_backing_dev_info;
1193        if (bdev != bdev->bd_contains)
1194                __blkdev_put(bdev->bd_contains, 1);
1195        bdev->bd_contains = NULL;
1196        put_disk(disk);
1197        module_put(owner);
1198out:
1199        mutex_unlock(&bdev->bd_mutex);
1200        unlock_kernel();
1201        if (ret)
1202                bdput(bdev);
1203        return ret;
1204}
1205
1206static int __blkdev_get(struct block_device *bdev, mode_t mode, unsigned flags,
1207                        int for_part)
1208{
1209        /*
1210         * This crockload is due to bad choice of ->open() type.
1211         * It will go away.
1212         * For now, block device ->open() routine must _not_
1213         * examine anything in 'inode' argument except ->i_rdev.
1214         */
1215        struct file fake_file = {};
1216        struct dentry fake_dentry = {};
1217        fake_file.f_mode = mode;
1218        fake_file.f_flags = flags;
1219        fake_file.f_path.dentry = &fake_dentry;
1220        fake_dentry.d_inode = bdev->bd_inode;
1221
1222        return do_open(bdev, &fake_file, for_part);
1223}
1224
1225int blkdev_get(struct block_device *bdev, mode_t mode, unsigned flags)
1226{
1227        return __blkdev_get(bdev, mode, flags, 0);
1228}
1229EXPORT_SYMBOL(blkdev_get);
1230
1231static int blkdev_open(struct inode * inode, struct file * filp)
1232{
1233        struct block_device *bdev;
1234        int res;
1235
1236        /*
1237         * Preserve backwards compatibility and allow large file access
1238         * even if userspace doesn't ask for it explicitly. Some mkfs
1239         * binary needs it. We might want to drop this workaround
1240         * during an unstable branch.
1241         */
1242        filp->f_flags |= O_LARGEFILE;
1243
1244        bdev = bd_acquire(inode);
1245        if (bdev == NULL)
1246                return -ENOMEM;
1247
1248        res = do_open(bdev, filp, 0);
1249        if (res)
1250                return res;
1251
1252        if (!(filp->f_flags & O_EXCL) )
1253                return 0;
1254
1255        if (!(res = bd_claim(bdev, filp)))
1256                return 0;
1257
1258        blkdev_put(bdev);
1259        return res;
1260}
1261
1262static int __blkdev_put(struct block_device *bdev, int for_part)
1263{
1264        int ret = 0;
1265        struct inode *bd_inode = bdev->bd_inode;
1266        struct gendisk *disk = bdev->bd_disk;
1267        struct block_device *victim = NULL;
1268
1269        mutex_lock_nested(&bdev->bd_mutex, for_part);
1270        lock_kernel();
1271        if (for_part)
1272                bdev->bd_part_count--;
1273
1274        if (!--bdev->bd_openers) {
1275                sync_blockdev(bdev);
1276                kill_bdev(bdev);
1277        }
1278        if (bdev->bd_contains == bdev) {
1279                if (disk->fops->release)
1280                        ret = disk->fops->release(bd_inode, NULL);
1281        }
1282        if (!bdev->bd_openers) {
1283                struct module *owner = disk->fops->owner;
1284
1285                put_disk(disk);
1286                module_put(owner);
1287
1288                if (bdev->bd_contains != bdev) {
1289                        kobject_put(&bdev->bd_part->kobj);
1290                        bdev->bd_part = NULL;
1291                }
1292                bdev->bd_disk = NULL;
1293                bdev->bd_inode->i_data.backing_dev_info = &default_backing_dev_info;
1294                if (bdev != bdev->bd_contains)
1295                        victim = bdev->bd_contains;
1296                bdev->bd_contains = NULL;
1297        }
1298        unlock_kernel();
1299        mutex_unlock(&bdev->bd_mutex);
1300        bdput(bdev);
1301        if (victim)
1302                __blkdev_put(victim, 1);
1303        return ret;
1304}
1305
1306int blkdev_put(struct block_device *bdev)
1307{
1308        return __blkdev_put(bdev, 0);
1309}
1310EXPORT_SYMBOL(blkdev_put);
1311
1312static int blkdev_close(struct inode * inode, struct file * filp)
1313{
1314        struct block_device *bdev = I_BDEV(filp->f_mapping->host);
1315        if (bdev->bd_holder == filp)
1316                bd_release(bdev);
1317        return blkdev_put(bdev);
1318}
1319
1320static long block_ioctl(struct file *file, unsigned cmd, unsigned long arg)
1321{
1322        return blkdev_ioctl(file->f_mapping->host, file, cmd, arg);
1323}
1324
1325const struct address_space_operations def_blk_aops = {
1326        .readpage       = blkdev_readpage,
1327        .writepage      = blkdev_writepage,
1328        .sync_page      = block_sync_page,
1329        .prepare_write  = blkdev_prepare_write,
1330        .commit_write   = blkdev_commit_write,
1331        .writepages     = generic_writepages,
1332        .direct_IO      = blkdev_direct_IO,
1333};
1334
1335const struct file_operations def_blk_fops = {
1336        .open           = blkdev_open,
1337        .release        = blkdev_close,
1338        .llseek         = block_llseek,
1339        .read           = do_sync_read,
1340        .write          = do_sync_write,
1341        .aio_read       = generic_file_aio_read,
1342        .aio_write      = generic_file_aio_write_nolock,
1343        .mmap           = generic_file_mmap,
1344        .fsync          = block_fsync,
1345        .unlocked_ioctl = block_ioctl,
1346#ifdef CONFIG_COMPAT
1347        .compat_ioctl   = compat_blkdev_ioctl,
1348#endif
1349        .sendfile       = generic_file_sendfile,
1350        .splice_read    = generic_file_splice_read,
1351        .splice_write   = generic_file_splice_write,
1352};
1353
1354int ioctl_by_bdev(struct block_device *bdev, unsigned cmd, unsigned long arg)
1355{
1356        int res;
1357        mm_segment_t old_fs = get_fs();
1358        set_fs(KERNEL_DS);
1359        res = blkdev_ioctl(bdev->bd_inode, NULL, cmd, arg);
1360        set_fs(old_fs);
1361        return res;
1362}
1363
1364EXPORT_SYMBOL(ioctl_by_bdev);
1365
1366/**
1367 * lookup_bdev  - lookup a struct block_device by name
1368 *
1369 * @path:       special file representing the block device
1370 *
1371 * Get a reference to the blockdevice at @path in the current
1372 * namespace if possible and return it.  Return ERR_PTR(error)
1373 * otherwise.
1374 */
1375struct block_device *lookup_bdev(const char *path)
1376{
1377        struct block_device *bdev;
1378        struct inode *inode;
1379        struct nameidata nd;
1380        int error;
1381
1382        if (!path || !*path)
1383                return ERR_PTR(-EINVAL);
1384
1385        error = path_lookup(path, LOOKUP_FOLLOW, &nd);
1386        if (error)
1387                return ERR_PTR(error);
1388
1389        inode = nd.dentry->d_inode;
1390        error = -ENOTBLK;
1391        if (!S_ISBLK(inode->i_mode))
1392                goto fail;
1393        error = -EACCES;
1394        if (nd.mnt->mnt_flags & MNT_NODEV)
1395                goto fail;
1396        error = -ENOMEM;
1397        bdev = bd_acquire(inode);
1398        if (!bdev)
1399                goto fail;
1400out:
1401        path_release(&nd);
1402        return bdev;
1403fail:
1404        bdev = ERR_PTR(error);
1405        goto out;
1406}
1407
1408/**
1409 * open_bdev_excl  -  open a block device by name and set it up for use
1410 *
1411 * @path:       special file representing the block device
1412 * @flags:      %MS_RDONLY for opening read-only
1413 * @holder:     owner for exclusion
1414 *
1415 * Open the blockdevice described by the special file at @path, claim it
1416 * for the @holder.
1417 */
1418struct block_device *open_bdev_excl(const char *path, int flags, void *holder)
1419{
1420        struct block_device *bdev;
1421        mode_t mode = FMODE_READ;
1422        int error = 0;
1423
1424        bdev = lookup_bdev(path);
1425        if (IS_ERR(bdev))
1426                return bdev;
1427
1428        if (!(flags & MS_RDONLY))
1429                mode |= FMODE_WRITE;
1430        error = blkdev_get(bdev, mode, 0);
1431        if (error)
1432                return ERR_PTR(error);
1433        error = -EACCES;
1434        if (!(flags & MS_RDONLY) && bdev_read_only(bdev))
1435                goto blkdev_put;
1436        error = bd_claim(bdev, holder);
1437        if (error)
1438                goto blkdev_put;
1439
1440        return bdev;
1441        
1442blkdev_put:
1443        blkdev_put(bdev);
1444        return ERR_PTR(error);
1445}
1446
1447EXPORT_SYMBOL(open_bdev_excl);
1448
1449/**
1450 * close_bdev_excl  -  release a blockdevice openen by open_bdev_excl()
1451 *
1452 * @bdev:       blockdevice to close
1453 *
1454 * This is the counterpart to open_bdev_excl().
1455 */
1456void close_bdev_excl(struct block_device *bdev)
1457{
1458        bd_release(bdev);
1459        blkdev_put(bdev);
1460}
1461
1462EXPORT_SYMBOL(close_bdev_excl);
1463
1464int __invalidate_device(struct block_device *bdev)
1465{
1466        struct super_block *sb = get_super(bdev);
1467        int res = 0;
1468
1469        if (sb) {
1470                /*
1471                 * no need to lock the super, get_super holds the
1472                 * read mutex so the filesystem cannot go away
1473                 * under us (->put_super runs with the write lock
1474                 * hold).
1475                 */
1476                shrink_dcache_sb(sb);
1477                res = invalidate_inodes(sb);
1478                drop_super(sb);
1479        }
1480        invalidate_bdev(bdev);
1481        return res;
1482}
1483EXPORT_SYMBOL(__invalidate_device);
1484
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.