LCOV - code coverage report
Current view: top level - fs - block_dev.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 100 573 17.5 %
Date: 2014-02-18 Functions: 19 62 30.6 %
Branches: 39 360 10.8 %

           Branch data     Line data    Source code
       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/device_cgroup.h>
      15                 :            : #include <linux/highmem.h>
      16                 :            : #include <linux/blkdev.h>
      17                 :            : #include <linux/module.h>
      18                 :            : #include <linux/blkpg.h>
      19                 :            : #include <linux/magic.h>
      20                 :            : #include <linux/buffer_head.h>
      21                 :            : #include <linux/swap.h>
      22                 :            : #include <linux/pagevec.h>
      23                 :            : #include <linux/writeback.h>
      24                 :            : #include <linux/mpage.h>
      25                 :            : #include <linux/mount.h>
      26                 :            : #include <linux/uio.h>
      27                 :            : #include <linux/namei.h>
      28                 :            : #include <linux/log2.h>
      29                 :            : #include <linux/cleancache.h>
      30                 :            : #include <linux/aio.h>
      31                 :            : #include <asm/uaccess.h>
      32                 :            : #include "internal.h"
      33                 :            : 
      34                 :            : struct bdev_inode {
      35                 :            :         struct block_device bdev;
      36                 :            :         struct inode vfs_inode;
      37                 :            : };
      38                 :            : 
      39                 :            : static const struct address_space_operations def_blk_aops;
      40                 :            : 
      41                 :            : static inline struct bdev_inode *BDEV_I(struct inode *inode)
      42                 :            : {
      43                 :            :         return container_of(inode, struct bdev_inode, vfs_inode);
      44                 :            : }
      45                 :            : 
      46                 :          0 : inline struct block_device *I_BDEV(struct inode *inode)
      47                 :            : {
      48                 :      59596 :         return &BDEV_I(inode)->bdev;
      49                 :            : }
      50                 :            : EXPORT_SYMBOL(I_BDEV);
      51                 :            : 
      52                 :            : /*
      53                 :            :  * Move the inode from its current bdi to a new bdi. If the inode is dirty we
      54                 :            :  * need to move it onto the dirty list of @dst so that the inode is always on
      55                 :            :  * the right list.
      56                 :            :  */
      57                 :          0 : static void bdev_inode_switch_bdi(struct inode *inode,
      58                 :          0 :                         struct backing_dev_info *dst)
      59                 :            : {
      60                 :          0 :         struct backing_dev_info *old = inode->i_data.backing_dev_info;
      61                 :            :         bool wakeup_bdi = false;
      62                 :            : 
      63         [ #  # ]:          0 :         if (unlikely(dst == old))               /* deadlock avoidance */
      64                 :          0 :                 return;
      65                 :          0 :         bdi_lock_two(&old->wb, &dst->wb);
      66                 :            :         spin_lock(&inode->i_lock);
      67                 :          0 :         inode->i_data.backing_dev_info = dst;
      68         [ #  # ]:          0 :         if (inode->i_state & I_DIRTY) {
      69 [ #  # ][ #  # ]:          0 :                 if (bdi_cap_writeback_dirty(dst) && !wb_has_dirty_io(&dst->wb))
      70                 :            :                         wakeup_bdi = true;
      71                 :          0 :                 list_move(&inode->i_wb_list, &dst->wb.b_dirty);
      72                 :            :         }
      73                 :            :         spin_unlock(&inode->i_lock);
      74                 :            :         spin_unlock(&old->wb.list_lock);
      75                 :            :         spin_unlock(&dst->wb.list_lock);
      76                 :            : 
      77         [ #  # ]:          0 :         if (wakeup_bdi)
      78                 :          0 :                 bdi_wakeup_thread_delayed(dst);
      79                 :            : }
      80                 :            : 
      81                 :            : /* Kill _all_ buffers and pagecache , dirty or not.. */
      82                 :          0 : void kill_bdev(struct block_device *bdev)
      83                 :            : {
      84                 :          0 :         struct address_space *mapping = bdev->bd_inode->i_mapping;
      85                 :            : 
      86         [ #  # ]:          0 :         if (mapping->nrpages == 0)
      87                 :          0 :                 return;
      88                 :            : 
      89                 :          0 :         invalidate_bh_lrus();
      90                 :          0 :         truncate_inode_pages(mapping, 0);
      91                 :            : }       
      92                 :            : EXPORT_SYMBOL(kill_bdev);
      93                 :            : 
      94                 :            : /* Invalidate clean unused buffers and pagecache. */
      95                 :          0 : void invalidate_bdev(struct block_device *bdev)
      96                 :            : {
      97                 :          0 :         struct address_space *mapping = bdev->bd_inode->i_mapping;
      98                 :            : 
      99         [ #  # ]:          0 :         if (mapping->nrpages == 0)
     100                 :          0 :                 return;
     101                 :            : 
     102                 :          0 :         invalidate_bh_lrus();
     103                 :          0 :         lru_add_drain_all();    /* make sure all lru add caches are flushed */
     104                 :          0 :         invalidate_mapping_pages(mapping, 0, -1);
     105                 :            :         /* 99% of the time, we don't need to flush the cleancache on the bdev.
     106                 :            :          * But, for the strange corners, lets be cautious
     107                 :            :          */
     108                 :            :         cleancache_invalidate_inode(mapping);
     109                 :            : }
     110                 :            : EXPORT_SYMBOL(invalidate_bdev);
     111                 :            : 
     112                 :          0 : int set_blocksize(struct block_device *bdev, int size)
     113                 :            : {
     114                 :            :         /* Size must be a power of two, and between 512 and PAGE_SIZE */
     115 [ #  # ][ #  # ]:          0 :         if (size > PAGE_SIZE || size < 512 || !is_power_of_2(size))
     116                 :            :                 return -EINVAL;
     117                 :            : 
     118                 :            :         /* Size cannot be smaller than the size supported by the device */
     119         [ #  # ]:          0 :         if (size < bdev_logical_block_size(bdev))
     120                 :            :                 return -EINVAL;
     121                 :            : 
     122                 :            :         /* Don't change the size if it is same as current */
     123         [ #  # ]:          0 :         if (bdev->bd_block_size != size) {
     124                 :            :                 sync_blockdev(bdev);
     125                 :          0 :                 bdev->bd_block_size = size;
     126                 :          0 :                 bdev->bd_inode->i_blkbits = blksize_bits(size);
     127                 :          0 :                 kill_bdev(bdev);
     128                 :            :         }
     129                 :            :         return 0;
     130                 :            : }
     131                 :            : 
     132                 :            : EXPORT_SYMBOL(set_blocksize);
     133                 :            : 
     134                 :          0 : int sb_set_blocksize(struct super_block *sb, int size)
     135                 :            : {
     136         [ #  # ]:          0 :         if (set_blocksize(sb->s_bdev, size))
     137                 :            :                 return 0;
     138                 :            :         /* If we get here, we know size is power of two
     139                 :            :          * and it's value is between 512 and PAGE_SIZE */
     140                 :          0 :         sb->s_blocksize = size;
     141                 :          0 :         sb->s_blocksize_bits = blksize_bits(size);
     142                 :          0 :         return sb->s_blocksize;
     143                 :            : }
     144                 :            : 
     145                 :            : EXPORT_SYMBOL(sb_set_blocksize);
     146                 :            : 
     147                 :          0 : int sb_min_blocksize(struct super_block *sb, int size)
     148                 :            : {
     149                 :          0 :         int minsize = bdev_logical_block_size(sb->s_bdev);
     150         [ #  # ]:          0 :         if (size < minsize)
     151                 :            :                 size = minsize;
     152                 :          0 :         return sb_set_blocksize(sb, size);
     153                 :            : }
     154                 :            : 
     155                 :            : EXPORT_SYMBOL(sb_min_blocksize);
     156                 :            : 
     157                 :            : static int
     158                 :          0 : blkdev_get_block(struct inode *inode, sector_t iblock,
     159                 :            :                 struct buffer_head *bh, int create)
     160                 :            : {
     161                 :        668 :         bh->b_bdev = I_BDEV(inode);
     162                 :        668 :         bh->b_blocknr = iblock;
     163                 :            :         set_buffer_mapped(bh);
     164                 :        668 :         return 0;
     165                 :            : }
     166                 :            : 
     167                 :            : static ssize_t
     168                 :          0 : blkdev_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
     169                 :            :                         loff_t offset, unsigned long nr_segs)
     170                 :            : {
     171                 :          0 :         struct file *file = iocb->ki_filp;
     172                 :          0 :         struct inode *inode = file->f_mapping->host;
     173                 :            : 
     174                 :          0 :         return __blockdev_direct_IO(rw, iocb, inode, I_BDEV(inode), iov, offset,
     175                 :            :                                     nr_segs, blkdev_get_block, NULL, NULL, 0);
     176                 :            : }
     177                 :            : 
     178                 :          0 : int __sync_blockdev(struct block_device *bdev, int wait)
     179                 :            : {
     180         [ +  + ]:         14 :         if (!bdev)
     181                 :            :                 return 0;
     182         [ +  + ]:          8 :         if (!wait)
     183                 :          4 :                 return filemap_flush(bdev->bd_inode->i_mapping);
     184                 :          4 :         return filemap_write_and_wait(bdev->bd_inode->i_mapping);
     185                 :            : }
     186                 :            : 
     187                 :            : /*
     188                 :            :  * Write out and wait upon all the dirty data associated with a block
     189                 :            :  * device via its mapping.  Does not take the superblock lock.
     190                 :            :  */
     191                 :          0 : int sync_blockdev(struct block_device *bdev)
     192                 :            : {
     193                 :          0 :         return __sync_blockdev(bdev, 1);
     194                 :            : }
     195                 :            : EXPORT_SYMBOL(sync_blockdev);
     196                 :            : 
     197                 :            : /*
     198                 :            :  * Write out and wait upon all dirty data associated with this
     199                 :            :  * device.   Filesystem data as well as the underlying block
     200                 :            :  * device.  Takes the superblock lock.
     201                 :            :  */
     202                 :          0 : int fsync_bdev(struct block_device *bdev)
     203                 :            : {
     204                 :          0 :         struct super_block *sb = get_super(bdev);
     205         [ #  # ]:          0 :         if (sb) {
     206                 :          0 :                 int res = sync_filesystem(sb);
     207                 :          0 :                 drop_super(sb);
     208                 :          0 :                 return res;
     209                 :            :         }
     210                 :          0 :         return sync_blockdev(bdev);
     211                 :            : }
     212                 :            : EXPORT_SYMBOL(fsync_bdev);
     213                 :            : 
     214                 :            : /**
     215                 :            :  * freeze_bdev  --  lock a filesystem and force it into a consistent state
     216                 :            :  * @bdev:       blockdevice to lock
     217                 :            :  *
     218                 :            :  * If a superblock is found on this device, we take the s_umount semaphore
     219                 :            :  * on it to make sure nobody unmounts until the snapshot creation is done.
     220                 :            :  * The reference counter (bd_fsfreeze_count) guarantees that only the last
     221                 :            :  * unfreeze process can unfreeze the frozen filesystem actually when multiple
     222                 :            :  * freeze requests arrive simultaneously. It counts up in freeze_bdev() and
     223                 :            :  * count down in thaw_bdev(). When it becomes 0, thaw_bdev() will unfreeze
     224                 :            :  * actually.
     225                 :            :  */
     226                 :          0 : struct super_block *freeze_bdev(struct block_device *bdev)
     227                 :            : {
     228                 :            :         struct super_block *sb;
     229                 :            :         int error = 0;
     230                 :            : 
     231                 :          0 :         mutex_lock(&bdev->bd_fsfreeze_mutex);
     232         [ #  # ]:          0 :         if (++bdev->bd_fsfreeze_count > 1) {
     233                 :            :                 /*
     234                 :            :                  * We don't even need to grab a reference - the first call
     235                 :            :                  * to freeze_bdev grab an active reference and only the last
     236                 :            :                  * thaw_bdev drops it.
     237                 :            :                  */
     238                 :          0 :                 sb = get_super(bdev);
     239                 :          0 :                 drop_super(sb);
     240                 :          0 :                 mutex_unlock(&bdev->bd_fsfreeze_mutex);
     241                 :          0 :                 return sb;
     242                 :            :         }
     243                 :            : 
     244                 :          0 :         sb = get_active_super(bdev);
     245         [ #  # ]:          0 :         if (!sb)
     246                 :            :                 goto out;
     247                 :          0 :         error = freeze_super(sb);
     248         [ #  # ]:          0 :         if (error) {
     249                 :          0 :                 deactivate_super(sb);
     250                 :          0 :                 bdev->bd_fsfreeze_count--;
     251                 :          0 :                 mutex_unlock(&bdev->bd_fsfreeze_mutex);
     252                 :          0 :                 return ERR_PTR(error);
     253                 :            :         }
     254                 :          0 :         deactivate_super(sb);
     255                 :            :  out:
     256                 :            :         sync_blockdev(bdev);
     257                 :          0 :         mutex_unlock(&bdev->bd_fsfreeze_mutex);
     258                 :          0 :         return sb;      /* thaw_bdev releases s->s_umount */
     259                 :            : }
     260                 :            : EXPORT_SYMBOL(freeze_bdev);
     261                 :            : 
     262                 :            : /**
     263                 :            :  * thaw_bdev  -- unlock filesystem
     264                 :            :  * @bdev:       blockdevice to unlock
     265                 :            :  * @sb:         associated superblock
     266                 :            :  *
     267                 :            :  * Unlocks the filesystem and marks it writeable again after freeze_bdev().
     268                 :            :  */
     269                 :          0 : int thaw_bdev(struct block_device *bdev, struct super_block *sb)
     270                 :            : {
     271                 :            :         int error = -EINVAL;
     272                 :            : 
     273                 :          0 :         mutex_lock(&bdev->bd_fsfreeze_mutex);
     274         [ #  # ]:          0 :         if (!bdev->bd_fsfreeze_count)
     275                 :            :                 goto out;
     276                 :            : 
     277                 :            :         error = 0;
     278         [ #  # ]:          0 :         if (--bdev->bd_fsfreeze_count > 0)
     279                 :            :                 goto out;
     280                 :            : 
     281         [ #  # ]:          0 :         if (!sb)
     282                 :            :                 goto out;
     283                 :            : 
     284                 :          0 :         error = thaw_super(sb);
     285         [ #  # ]:          0 :         if (error) {
     286                 :          0 :                 bdev->bd_fsfreeze_count++;
     287                 :          0 :                 mutex_unlock(&bdev->bd_fsfreeze_mutex);
     288                 :          0 :                 return error;
     289                 :            :         }
     290                 :            : out:
     291                 :          0 :         mutex_unlock(&bdev->bd_fsfreeze_mutex);
     292                 :          0 :         return 0;
     293                 :            : }
     294                 :            : EXPORT_SYMBOL(thaw_bdev);
     295                 :            : 
     296                 :          0 : static int blkdev_writepage(struct page *page, struct writeback_control *wbc)
     297                 :            : {
     298                 :      26055 :         return block_write_full_page(page, blkdev_get_block, wbc);
     299                 :            : }
     300                 :            : 
     301                 :          0 : static int blkdev_readpage(struct file * file, struct page * page)
     302                 :            : {
     303                 :        668 :         return block_read_full_page(page, blkdev_get_block);
     304                 :            : }
     305                 :            : 
     306                 :          0 : static int blkdev_write_begin(struct file *file, struct address_space *mapping,
     307                 :            :                         loff_t pos, unsigned len, unsigned flags,
     308                 :            :                         struct page **pagep, void **fsdata)
     309                 :            : {
     310                 :          0 :         return block_write_begin(mapping, pos, len, flags, pagep,
     311                 :            :                                  blkdev_get_block);
     312                 :            : }
     313                 :            : 
     314                 :          0 : static int blkdev_write_end(struct file *file, struct address_space *mapping,
     315                 :            :                         loff_t pos, unsigned len, unsigned copied,
     316                 :            :                         struct page *page, void *fsdata)
     317                 :            : {
     318                 :            :         int ret;
     319                 :          0 :         ret = block_write_end(file, mapping, pos, len, copied, page, fsdata);
     320                 :            : 
     321                 :          0 :         unlock_page(page);
     322                 :          0 :         page_cache_release(page);
     323                 :            : 
     324                 :          0 :         return ret;
     325                 :            : }
     326                 :            : 
     327                 :            : /*
     328                 :            :  * private llseek:
     329                 :            :  * for a block special file file_inode(file)->i_size is zero
     330                 :            :  * so we compute the size by hand (just as in block_read/write above)
     331                 :            :  */
     332                 :          0 : static loff_t block_llseek(struct file *file, loff_t offset, int whence)
     333                 :            : {
     334                 :        364 :         struct inode *bd_inode = file->f_mapping->host;
     335                 :            :         loff_t retval;
     336                 :            : 
     337                 :        364 :         mutex_lock(&bd_inode->i_mutex);
     338                 :        364 :         retval = fixed_size_llseek(file, offset, whence, i_size_read(bd_inode));
     339                 :        364 :         mutex_unlock(&bd_inode->i_mutex);
     340                 :        364 :         return retval;
     341                 :            : }
     342                 :            :         
     343                 :          0 : int blkdev_fsync(struct file *filp, loff_t start, loff_t end, int datasync)
     344                 :            : {
     345                 :          0 :         struct inode *bd_inode = filp->f_mapping->host;
     346                 :          0 :         struct block_device *bdev = I_BDEV(bd_inode);
     347                 :            :         int error;
     348                 :            :         
     349                 :          0 :         error = filemap_write_and_wait_range(filp->f_mapping, start, end);
     350         [ #  # ]:          0 :         if (error)
     351                 :            :                 return error;
     352                 :            : 
     353                 :            :         /*
     354                 :            :          * There is no need to serialise calls to blkdev_issue_flush with
     355                 :            :          * i_mutex and doing so causes performance issues with concurrent
     356                 :            :          * O_SYNC writers to a block device.
     357                 :            :          */
     358                 :          0 :         error = blkdev_issue_flush(bdev, GFP_KERNEL, NULL);
     359         [ #  # ]:          0 :         if (error == -EOPNOTSUPP)
     360                 :            :                 error = 0;
     361                 :            : 
     362                 :          0 :         return error;
     363                 :            : }
     364                 :            : EXPORT_SYMBOL(blkdev_fsync);
     365                 :            : 
     366                 :            : /*
     367                 :            :  * pseudo-fs
     368                 :            :  */
     369                 :            : 
     370                 :            : static  __cacheline_aligned_in_smp DEFINE_SPINLOCK(bdev_lock);
     371                 :            : static struct kmem_cache * bdev_cachep __read_mostly;
     372                 :            : 
     373                 :          0 : static struct inode *bdev_alloc_inode(struct super_block *sb)
     374                 :            : {
     375                 :          0 :         struct bdev_inode *ei = kmem_cache_alloc(bdev_cachep, GFP_KERNEL);
     376         [ #  # ]:          0 :         if (!ei)
     377                 :            :                 return NULL;
     378                 :          0 :         return &ei->vfs_inode;
     379                 :            : }
     380                 :            : 
     381                 :          0 : static void bdev_i_callback(struct rcu_head *head)
     382                 :            : {
     383                 :            :         struct inode *inode = container_of(head, struct inode, i_rcu);
     384                 :          0 :         struct bdev_inode *bdi = BDEV_I(inode);
     385                 :            : 
     386                 :          0 :         kmem_cache_free(bdev_cachep, bdi);
     387                 :          0 : }
     388                 :            : 
     389                 :          0 : static void bdev_destroy_inode(struct inode *inode)
     390                 :            : {
     391                 :          0 :         call_rcu(&inode->i_rcu, bdev_i_callback);
     392                 :          0 : }
     393                 :            : 
     394                 :          0 : static void init_once(void *foo)
     395                 :            : {
     396                 :            :         struct bdev_inode *ei = (struct bdev_inode *) foo;
     397                 :          0 :         struct block_device *bdev = &ei->bdev;
     398                 :            : 
     399                 :          0 :         memset(bdev, 0, sizeof(*bdev));
     400                 :          0 :         mutex_init(&bdev->bd_mutex);
     401                 :          0 :         INIT_LIST_HEAD(&bdev->bd_inodes);
     402                 :          0 :         INIT_LIST_HEAD(&bdev->bd_list);
     403                 :            : #ifdef CONFIG_SYSFS
     404                 :          0 :         INIT_LIST_HEAD(&bdev->bd_holder_disks);
     405                 :            : #endif
     406                 :          0 :         inode_init_once(&ei->vfs_inode);
     407                 :            :         /* Initialize mutex for freeze. */
     408                 :          0 :         mutex_init(&bdev->bd_fsfreeze_mutex);
     409                 :          0 : }
     410                 :            : 
     411                 :            : static inline void __bd_forget(struct inode *inode)
     412                 :            : {
     413                 :          0 :         list_del_init(&inode->i_devices);
     414                 :          0 :         inode->i_bdev = NULL;
     415                 :          0 :         inode->i_mapping = &inode->i_data;
     416                 :            : }
     417                 :            : 
     418                 :          0 : static void bdev_evict_inode(struct inode *inode)
     419                 :            : {
     420                 :            :         struct block_device *bdev = &BDEV_I(inode)->bdev;
     421                 :            :         struct list_head *p;
     422                 :          0 :         truncate_inode_pages(&inode->i_data, 0);
     423                 :          0 :         invalidate_inode_buffers(inode); /* is it needed here? */
     424                 :          0 :         clear_inode(inode);
     425                 :            :         spin_lock(&bdev_lock);
     426         [ #  # ]:          0 :         while ( (p = bdev->bd_inodes.next) != &bdev->bd_inodes ) {
     427                 :            :                 __bd_forget(list_entry(p, struct inode, i_devices));
     428                 :            :         }
     429                 :          0 :         list_del_init(&bdev->bd_list);
     430                 :            :         spin_unlock(&bdev_lock);
     431                 :          0 : }
     432                 :            : 
     433                 :            : static const struct super_operations bdev_sops = {
     434                 :            :         .statfs = simple_statfs,
     435                 :            :         .alloc_inode = bdev_alloc_inode,
     436                 :            :         .destroy_inode = bdev_destroy_inode,
     437                 :            :         .drop_inode = generic_delete_inode,
     438                 :            :         .evict_inode = bdev_evict_inode,
     439                 :            : };
     440                 :            : 
     441                 :          0 : static struct dentry *bd_mount(struct file_system_type *fs_type,
     442                 :            :         int flags, const char *dev_name, void *data)
     443                 :            : {
     444                 :          0 :         return mount_pseudo(fs_type, "bdev:", &bdev_sops, NULL, BDEVFS_MAGIC);
     445                 :            : }
     446                 :            : 
     447                 :            : static struct file_system_type bd_type = {
     448                 :            :         .name           = "bdev",
     449                 :            :         .mount          = bd_mount,
     450                 :            :         .kill_sb        = kill_anon_super,
     451                 :            : };
     452                 :            : 
     453                 :            : static struct super_block *blockdev_superblock __read_mostly;
     454                 :            : 
     455                 :          0 : void __init bdev_cache_init(void)
     456                 :            : {
     457                 :            :         int err;
     458                 :            :         static struct vfsmount *bd_mnt;
     459                 :            : 
     460                 :          0 :         bdev_cachep = kmem_cache_create("bdev_cache", sizeof(struct bdev_inode),
     461                 :            :                         0, (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
     462                 :            :                                 SLAB_MEM_SPREAD|SLAB_PANIC),
     463                 :            :                         init_once);
     464                 :          0 :         err = register_filesystem(&bd_type);
     465         [ #  # ]:          0 :         if (err)
     466                 :          0 :                 panic("Cannot register bdev pseudo-fs");
     467                 :          0 :         bd_mnt = kern_mount(&bd_type);
     468         [ #  # ]:          0 :         if (IS_ERR(bd_mnt))
     469                 :          0 :                 panic("Cannot create bdev pseudo-fs");
     470                 :          0 :         blockdev_superblock = bd_mnt->mnt_sb;   /* For writeback */
     471                 :          0 : }
     472                 :            : 
     473                 :            : /*
     474                 :            :  * Most likely _very_ bad one - but then it's hardly critical for small
     475                 :            :  * /dev and can be fixed when somebody will need really large one.
     476                 :            :  * Keep in mind that it will be fed through icache hash function too.
     477                 :            :  */
     478                 :            : static inline unsigned long hash(dev_t dev)
     479                 :            : {
     480                 :          0 :         return MAJOR(dev)+MINOR(dev);
     481                 :            : }
     482                 :            : 
     483                 :          0 : static int bdev_test(struct inode *inode, void *data)
     484                 :            : {
     485                 :          0 :         return BDEV_I(inode)->bdev.bd_dev == *(dev_t *)data;
     486                 :            : }
     487                 :            : 
     488                 :          0 : static int bdev_set(struct inode *inode, void *data)
     489                 :            : {
     490                 :          0 :         BDEV_I(inode)->bdev.bd_dev = *(dev_t *)data;
     491                 :          0 :         return 0;
     492                 :            : }
     493                 :            : 
     494                 :            : static LIST_HEAD(all_bdevs);
     495                 :            : 
     496                 :          0 : struct block_device *bdget(dev_t dev)
     497                 :            : {
     498                 :            :         struct block_device *bdev;
     499                 :            :         struct inode *inode;
     500                 :            : 
     501                 :          0 :         inode = iget5_locked(blockdev_superblock, hash(dev),
     502                 :            :                         bdev_test, bdev_set, &dev);
     503                 :            : 
     504         [ #  # ]:          0 :         if (!inode)
     505                 :            :                 return NULL;
     506                 :            : 
     507                 :          0 :         bdev = &BDEV_I(inode)->bdev;
     508                 :            : 
     509         [ #  # ]:          0 :         if (inode->i_state & I_NEW) {
     510                 :          0 :                 bdev->bd_contains = NULL;
     511                 :          0 :                 bdev->bd_super = NULL;
     512                 :          0 :                 bdev->bd_inode = inode;
     513                 :          0 :                 bdev->bd_block_size = (1 << inode->i_blkbits);
     514                 :          0 :                 bdev->bd_part_count = 0;
     515                 :          0 :                 bdev->bd_invalidated = 0;
     516                 :          0 :                 inode->i_mode = S_IFBLK;
     517                 :          0 :                 inode->i_rdev = dev;
     518                 :          0 :                 inode->i_bdev = bdev;
     519                 :          0 :                 inode->i_data.a_ops = &def_blk_aops;
     520                 :            :                 mapping_set_gfp_mask(&inode->i_data, GFP_USER);
     521                 :          0 :                 inode->i_data.backing_dev_info = &default_backing_dev_info;
     522                 :            :                 spin_lock(&bdev_lock);
     523                 :          0 :                 list_add(&bdev->bd_list, &all_bdevs);
     524                 :            :                 spin_unlock(&bdev_lock);
     525                 :          0 :                 unlock_new_inode(inode);
     526                 :            :         }
     527                 :          0 :         return bdev;
     528                 :            : }
     529                 :            : 
     530                 :            : EXPORT_SYMBOL(bdget);
     531                 :            : 
     532                 :            : /**
     533                 :            :  * bdgrab -- Grab a reference to an already referenced block device
     534                 :            :  * @bdev:       Block device to grab a reference to.
     535                 :            :  */
     536                 :          0 : struct block_device *bdgrab(struct block_device *bdev)
     537                 :            : {
     538                 :          0 :         ihold(bdev->bd_inode);
     539                 :          0 :         return bdev;
     540                 :            : }
     541                 :            : EXPORT_SYMBOL(bdgrab);
     542                 :            : 
     543                 :          0 : long nr_blockdev_pages(void)
     544                 :            : {
     545                 :            :         struct block_device *bdev;
     546                 :            :         long ret = 0;
     547                 :            :         spin_lock(&bdev_lock);
     548         [ +  + ]:     211533 :         list_for_each_entry(bdev, &all_bdevs, bd_list) {
     549                 :     191387 :                 ret += bdev->bd_inode->i_mapping->nrpages;
     550                 :            :         }
     551                 :            :         spin_unlock(&bdev_lock);
     552                 :      10073 :         return ret;
     553                 :            : }
     554                 :            : 
     555                 :          0 : void bdput(struct block_device *bdev)
     556                 :            : {
     557                 :        276 :         iput(bdev->bd_inode);
     558                 :          0 : }
     559                 :            : 
     560                 :            : EXPORT_SYMBOL(bdput);
     561                 :            :  
     562                 :          0 : static struct block_device *bd_acquire(struct inode *inode)
     563                 :            : {
     564                 :            :         struct block_device *bdev;
     565                 :            : 
     566                 :            :         spin_lock(&bdev_lock);
     567                 :        276 :         bdev = inode->i_bdev;
     568         [ +  - ]:        276 :         if (bdev) {
     569                 :        276 :                 ihold(bdev->bd_inode);
     570                 :            :                 spin_unlock(&bdev_lock);
     571                 :        276 :                 return bdev;
     572                 :            :         }
     573                 :            :         spin_unlock(&bdev_lock);
     574                 :            : 
     575                 :          0 :         bdev = bdget(inode->i_rdev);
     576         [ #  # ]:          0 :         if (bdev) {
     577                 :            :                 spin_lock(&bdev_lock);
     578         [ #  # ]:          0 :                 if (!inode->i_bdev) {
     579                 :            :                         /*
     580                 :            :                          * We take an additional reference to bd_inode,
     581                 :            :                          * and it's released in clear_inode() of inode.
     582                 :            :                          * So, we can access it via ->i_mapping always
     583                 :            :                          * without igrab().
     584                 :            :                          */
     585                 :          0 :                         ihold(bdev->bd_inode);
     586                 :          0 :                         inode->i_bdev = bdev;
     587                 :          0 :                         inode->i_mapping = bdev->bd_inode->i_mapping;
     588                 :          0 :                         list_add(&inode->i_devices, &bdev->bd_inodes);
     589                 :            :                 }
     590                 :            :                 spin_unlock(&bdev_lock);
     591                 :            :         }
     592                 :          0 :         return bdev;
     593                 :            : }
     594                 :            : 
     595                 :          0 : int sb_is_blkdev_sb(struct super_block *sb)
     596                 :            : {
     597                 :     240168 :         return sb == blockdev_superblock;
     598                 :            : }
     599                 :            : 
     600                 :            : /* Call when you free inode */
     601                 :            : 
     602                 :          0 : void bd_forget(struct inode *inode)
     603                 :            : {
     604                 :            :         struct block_device *bdev = NULL;
     605                 :            : 
     606                 :            :         spin_lock(&bdev_lock);
     607         [ #  # ]:          0 :         if (!sb_is_blkdev_sb(inode->i_sb))
     608                 :          0 :                 bdev = inode->i_bdev;
     609                 :            :         __bd_forget(inode);
     610                 :            :         spin_unlock(&bdev_lock);
     611                 :            : 
     612         [ #  # ]:          0 :         if (bdev)
     613                 :          0 :                 iput(bdev->bd_inode);
     614                 :          0 : }
     615                 :            : 
     616                 :            : /**
     617                 :            :  * bd_may_claim - test whether a block device can be claimed
     618                 :            :  * @bdev: block device of interest
     619                 :            :  * @whole: whole block device containing @bdev, may equal @bdev
     620                 :            :  * @holder: holder trying to claim @bdev
     621                 :            :  *
     622                 :            :  * Test whether @bdev can be claimed by @holder.
     623                 :            :  *
     624                 :            :  * CONTEXT:
     625                 :            :  * spin_lock(&bdev_lock).
     626                 :            :  *
     627                 :            :  * RETURNS:
     628                 :            :  * %true if @bdev can be claimed, %false otherwise.
     629                 :            :  */
     630                 :          0 : static bool bd_may_claim(struct block_device *bdev, struct block_device *whole,
     631                 :            :                          void *holder)
     632                 :            : {
     633 [ #  # ][ #  # ]:          0 :         if (bdev->bd_holder == holder)
                 [ #  # ]
     634                 :            :                 return true;     /* already a holder */
     635 [ #  # ][ #  # ]:          0 :         else if (bdev->bd_holder != NULL)
                 [ #  # ]
     636                 :            :                 return false;    /* held by someone else */
     637 [ #  # ][ #  # ]:          0 :         else if (bdev->bd_contains == bdev)
                 [ #  # ]
     638                 :            :                 return true;     /* is a whole device which isn't held */
     639                 :            : 
     640 [ #  # ][ #  # ]:          0 :         else if (whole->bd_holder == bd_may_claim)
                 [ #  # ]
     641                 :            :                 return true;     /* is a partition of a device that is being partitioned */
     642 [ #  # ][ #  # ]:          0 :         else if (whole->bd_holder != NULL)
                 [ #  # ]
     643                 :            :                 return false;    /* is a partition of a held device */
     644                 :            :         else
     645                 :          0 :                 return true;     /* is a partition of an un-held device */
     646                 :            : }
     647                 :            : 
     648                 :            : /**
     649                 :            :  * bd_prepare_to_claim - prepare to claim a block device
     650                 :            :  * @bdev: block device of interest
     651                 :            :  * @whole: the whole device containing @bdev, may equal @bdev
     652                 :            :  * @holder: holder trying to claim @bdev
     653                 :            :  *
     654                 :            :  * Prepare to claim @bdev.  This function fails if @bdev is already
     655                 :            :  * claimed by another holder and waits if another claiming is in
     656                 :            :  * progress.  This function doesn't actually claim.  On successful
     657                 :            :  * return, the caller has ownership of bd_claiming and bd_holder[s].
     658                 :            :  *
     659                 :            :  * CONTEXT:
     660                 :            :  * spin_lock(&bdev_lock).  Might release bdev_lock, sleep and regrab
     661                 :            :  * it multiple times.
     662                 :            :  *
     663                 :            :  * RETURNS:
     664                 :            :  * 0 if @bdev can be claimed, -EBUSY otherwise.
     665                 :            :  */
     666                 :          0 : static int bd_prepare_to_claim(struct block_device *bdev,
     667                 :            :                                struct block_device *whole, void *holder)
     668                 :            : {
     669                 :            : retry:
     670                 :            :         /* if someone else claimed, fail */
     671         [ #  # ]:          0 :         if (!bd_may_claim(bdev, whole, holder))
     672                 :            :                 return -EBUSY;
     673                 :            : 
     674                 :            :         /* if claiming is already in progress, wait for it to finish */
     675         [ #  # ]:          0 :         if (whole->bd_claiming) {
     676                 :          0 :                 wait_queue_head_t *wq = bit_waitqueue(&whole->bd_claiming, 0);
     677                 :          0 :                 DEFINE_WAIT(wait);
     678                 :            : 
     679                 :          0 :                 prepare_to_wait(wq, &wait, TASK_UNINTERRUPTIBLE);
     680                 :            :                 spin_unlock(&bdev_lock);
     681                 :          0 :                 schedule();
     682                 :          0 :                 finish_wait(wq, &wait);
     683                 :            :                 spin_lock(&bdev_lock);
     684                 :            :                 goto retry;
     685                 :            :         }
     686                 :            : 
     687                 :            :         /* yay, all mine */
     688                 :            :         return 0;
     689                 :            : }
     690                 :            : 
     691                 :            : /**
     692                 :            :  * bd_start_claiming - start claiming a block device
     693                 :            :  * @bdev: block device of interest
     694                 :            :  * @holder: holder trying to claim @bdev
     695                 :            :  *
     696                 :            :  * @bdev is about to be opened exclusively.  Check @bdev can be opened
     697                 :            :  * exclusively and mark that an exclusive open is in progress.  Each
     698                 :            :  * successful call to this function must be matched with a call to
     699                 :            :  * either bd_finish_claiming() or bd_abort_claiming() (which do not
     700                 :            :  * fail).
     701                 :            :  *
     702                 :            :  * This function is used to gain exclusive access to the block device
     703                 :            :  * without actually causing other exclusive open attempts to fail. It
     704                 :            :  * should be used when the open sequence itself requires exclusive
     705                 :            :  * access but may subsequently fail.
     706                 :            :  *
     707                 :            :  * CONTEXT:
     708                 :            :  * Might sleep.
     709                 :            :  *
     710                 :            :  * RETURNS:
     711                 :            :  * Pointer to the block device containing @bdev on success, ERR_PTR()
     712                 :            :  * value on failure.
     713                 :            :  */
     714                 :          0 : static struct block_device *bd_start_claiming(struct block_device *bdev,
     715                 :            :                                               void *holder)
     716                 :            : {
     717                 :            :         struct gendisk *disk;
     718                 :            :         struct block_device *whole;
     719                 :            :         int partno, err;
     720                 :            : 
     721                 :            :         might_sleep();
     722                 :            : 
     723                 :            :         /*
     724                 :            :          * @bdev might not have been initialized properly yet, look up
     725                 :            :          * and grab the outer block device the hard way.
     726                 :            :          */
     727                 :          0 :         disk = get_gendisk(bdev->bd_dev, &partno);
     728         [ #  # ]:          0 :         if (!disk)
     729                 :            :                 return ERR_PTR(-ENXIO);
     730                 :            : 
     731                 :            :         /*
     732                 :            :          * Normally, @bdev should equal what's returned from bdget_disk()
     733                 :            :          * if partno is 0; however, some drivers (floppy) use multiple
     734                 :            :          * bdev's for the same physical device and @bdev may be one of the
     735                 :            :          * aliases.  Keep @bdev if partno is 0.  This means claimer
     736                 :            :          * tracking is broken for those devices but it has always been that
     737                 :            :          * way.
     738                 :            :          */
     739         [ #  # ]:          0 :         if (partno)
     740                 :          0 :                 whole = bdget_disk(disk, 0);
     741                 :            :         else
     742                 :            :                 whole = bdgrab(bdev);
     743                 :            : 
     744                 :          0 :         module_put(disk->fops->owner);
     745                 :          0 :         put_disk(disk);
     746         [ #  # ]:          0 :         if (!whole)
     747                 :            :                 return ERR_PTR(-ENOMEM);
     748                 :            : 
     749                 :            :         /* prepare to claim, if successful, mark claiming in progress */
     750                 :            :         spin_lock(&bdev_lock);
     751                 :            : 
     752                 :          0 :         err = bd_prepare_to_claim(bdev, whole, holder);
     753         [ #  # ]:          0 :         if (err == 0) {
     754                 :          0 :                 whole->bd_claiming = holder;
     755                 :            :                 spin_unlock(&bdev_lock);
     756                 :          0 :                 return whole;
     757                 :            :         } else {
     758                 :            :                 spin_unlock(&bdev_lock);
     759                 :            :                 bdput(whole);
     760                 :          0 :                 return ERR_PTR(err);
     761                 :            :         }
     762                 :            : }
     763                 :            : 
     764                 :            : #ifdef CONFIG_SYSFS
     765                 :            : struct bd_holder_disk {
     766                 :            :         struct list_head        list;
     767                 :            :         struct gendisk          *disk;
     768                 :            :         int                     refcnt;
     769                 :            : };
     770                 :            : 
     771                 :            : static struct bd_holder_disk *bd_find_holder_disk(struct block_device *bdev,
     772                 :            :                                                   struct gendisk *disk)
     773                 :            : {
     774                 :            :         struct bd_holder_disk *holder;
     775                 :            : 
     776 [ #  # ][ #  # ]:          0 :         list_for_each_entry(holder, &bdev->bd_holder_disks, list)
     777 [ #  # ][ #  # ]:          0 :                 if (holder->disk == disk)
     778                 :            :                         return holder;
     779                 :            :         return NULL;
     780                 :            : }
     781                 :            : 
     782                 :          0 : static int add_symlink(struct kobject *from, struct kobject *to)
     783                 :            : {
     784                 :          0 :         return sysfs_create_link(from, to, kobject_name(to));
     785                 :            : }
     786                 :            : 
     787                 :          0 : static void del_symlink(struct kobject *from, struct kobject *to)
     788                 :            : {
     789                 :          0 :         sysfs_remove_link(from, kobject_name(to));
     790                 :            : }
     791                 :            : 
     792                 :            : /**
     793                 :            :  * bd_link_disk_holder - create symlinks between holding disk and slave bdev
     794                 :            :  * @bdev: the claimed slave bdev
     795                 :            :  * @disk: the holding disk
     796                 :            :  *
     797                 :            :  * DON'T USE THIS UNLESS YOU'RE ALREADY USING IT.
     798                 :            :  *
     799                 :            :  * This functions creates the following sysfs symlinks.
     800                 :            :  *
     801                 :            :  * - from "slaves" directory of the holder @disk to the claimed @bdev
     802                 :            :  * - from "holders" directory of the @bdev to the holder @disk
     803                 :            :  *
     804                 :            :  * For example, if /dev/dm-0 maps to /dev/sda and disk for dm-0 is
     805                 :            :  * passed to bd_link_disk_holder(), then:
     806                 :            :  *
     807                 :            :  *   /sys/block/dm-0/slaves/sda --> /sys/block/sda
     808                 :            :  *   /sys/block/sda/holders/dm-0 --> /sys/block/dm-0
     809                 :            :  *
     810                 :            :  * The caller must have claimed @bdev before calling this function and
     811                 :            :  * ensure that both @bdev and @disk are valid during the creation and
     812                 :            :  * lifetime of these symlinks.
     813                 :            :  *
     814                 :            :  * CONTEXT:
     815                 :            :  * Might sleep.
     816                 :            :  *
     817                 :            :  * RETURNS:
     818                 :            :  * 0 on success, -errno on failure.
     819                 :            :  */
     820                 :          0 : int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk)
     821                 :            : {
     822                 :            :         struct bd_holder_disk *holder;
     823                 :            :         int ret = 0;
     824                 :            : 
     825                 :          0 :         mutex_lock(&bdev->bd_mutex);
     826                 :            : 
     827 [ #  # ][ #  # ]:          0 :         WARN_ON_ONCE(!bdev->bd_holder);
                 [ #  # ]
     828                 :            : 
     829                 :            :         /* FIXME: remove the following once add_disk() handles errors */
     830 [ #  # ][ #  # ]:          0 :         if (WARN_ON(!disk->slave_dir || !bdev->bd_part->holder_dir))
         [ #  # ][ #  # ]
     831                 :            :                 goto out_unlock;
     832                 :            : 
     833                 :            :         holder = bd_find_holder_disk(bdev, disk);
     834         [ #  # ]:          0 :         if (holder) {
     835                 :          0 :                 holder->refcnt++;
     836                 :          0 :                 goto out_unlock;
     837                 :            :         }
     838                 :            : 
     839                 :            :         holder = kzalloc(sizeof(*holder), GFP_KERNEL);
     840         [ #  # ]:          0 :         if (!holder) {
     841                 :            :                 ret = -ENOMEM;
     842                 :            :                 goto out_unlock;
     843                 :            :         }
     844                 :            : 
     845                 :          0 :         INIT_LIST_HEAD(&holder->list);
     846                 :          0 :         holder->disk = disk;
     847                 :          0 :         holder->refcnt = 1;
     848                 :            : 
     849                 :          0 :         ret = add_symlink(disk->slave_dir, &part_to_dev(bdev->bd_part)->kobj);
     850         [ #  # ]:          0 :         if (ret)
     851                 :            :                 goto out_free;
     852                 :            : 
     853                 :          0 :         ret = add_symlink(bdev->bd_part->holder_dir, &disk_to_dev(disk)->kobj);
     854         [ #  # ]:          0 :         if (ret)
     855                 :            :                 goto out_del;
     856                 :            :         /*
     857                 :            :          * bdev could be deleted beneath us which would implicitly destroy
     858                 :            :          * the holder directory.  Hold on to it.
     859                 :            :          */
     860                 :          0 :         kobject_get(bdev->bd_part->holder_dir);
     861                 :            : 
     862                 :            :         list_add(&holder->list, &bdev->bd_holder_disks);
     863                 :            :         goto out_unlock;
     864                 :            : 
     865                 :            : out_del:
     866                 :          0 :         del_symlink(disk->slave_dir, &part_to_dev(bdev->bd_part)->kobj);
     867                 :            : out_free:
     868                 :          0 :         kfree(holder);
     869                 :            : out_unlock:
     870                 :          0 :         mutex_unlock(&bdev->bd_mutex);
     871                 :          0 :         return ret;
     872                 :            : }
     873                 :            : EXPORT_SYMBOL_GPL(bd_link_disk_holder);
     874                 :            : 
     875                 :            : /**
     876                 :            :  * bd_unlink_disk_holder - destroy symlinks created by bd_link_disk_holder()
     877                 :            :  * @bdev: the calimed slave bdev
     878                 :            :  * @disk: the holding disk
     879                 :            :  *
     880                 :            :  * DON'T USE THIS UNLESS YOU'RE ALREADY USING IT.
     881                 :            :  *
     882                 :            :  * CONTEXT:
     883                 :            :  * Might sleep.
     884                 :            :  */
     885                 :          0 : void bd_unlink_disk_holder(struct block_device *bdev, struct gendisk *disk)
     886                 :            : {
     887                 :            :         struct bd_holder_disk *holder;
     888                 :            : 
     889                 :          0 :         mutex_lock(&bdev->bd_mutex);
     890                 :            : 
     891                 :            :         holder = bd_find_holder_disk(bdev, disk);
     892                 :            : 
     893 [ #  # ][ #  # ]:          0 :         if (!WARN_ON_ONCE(holder == NULL) && !--holder->refcnt) {
         [ #  # ][ #  # ]
                 [ #  # ]
     894                 :          0 :                 del_symlink(disk->slave_dir, &part_to_dev(bdev->bd_part)->kobj);
     895                 :          0 :                 del_symlink(bdev->bd_part->holder_dir,
     896                 :            :                             &disk_to_dev(disk)->kobj);
     897                 :          0 :                 kobject_put(bdev->bd_part->holder_dir);
     898                 :          0 :                 list_del_init(&holder->list);
     899                 :          0 :                 kfree(holder);
     900                 :            :         }
     901                 :            : 
     902                 :          0 :         mutex_unlock(&bdev->bd_mutex);
     903                 :          0 : }
     904                 :            : EXPORT_SYMBOL_GPL(bd_unlink_disk_holder);
     905                 :            : #endif
     906                 :            : 
     907                 :            : /**
     908                 :            :  * flush_disk - invalidates all buffer-cache entries on a disk
     909                 :            :  *
     910                 :            :  * @bdev:      struct block device to be flushed
     911                 :            :  * @kill_dirty: flag to guide handling of dirty inodes
     912                 :            :  *
     913                 :            :  * Invalidates all buffer-cache entries on a disk. It should be called
     914                 :            :  * when a disk has been changed -- either by a media change or online
     915                 :            :  * resize.
     916                 :            :  */
     917                 :          0 : static void flush_disk(struct block_device *bdev, bool kill_dirty)
     918                 :            : {
     919         [ #  # ]:          0 :         if (__invalidate_device(bdev, kill_dirty)) {
     920                 :          0 :                 char name[BDEVNAME_SIZE] = "";
     921                 :            : 
     922         [ #  # ]:          0 :                 if (bdev->bd_disk)
     923                 :          0 :                         disk_name(bdev->bd_disk, 0, name);
     924                 :          0 :                 printk(KERN_WARNING "VFS: busy inodes on changed media or "
     925                 :            :                        "resized disk %s\n", name);
     926                 :            :         }
     927                 :            : 
     928         [ #  # ]:          0 :         if (!bdev->bd_disk)
     929                 :          0 :                 return;
     930         [ #  # ]:          0 :         if (disk_part_scan_enabled(bdev->bd_disk))
     931                 :          0 :                 bdev->bd_invalidated = 1;
     932                 :            : }
     933                 :            : 
     934                 :            : /**
     935                 :            :  * check_disk_size_change - checks for disk size change and adjusts bdev size.
     936                 :            :  * @disk: struct gendisk to check
     937                 :            :  * @bdev: struct bdev to adjust.
     938                 :            :  *
     939                 :            :  * This routine checks to see if the bdev size does not match the disk size
     940                 :            :  * and adjusts it if it differs.
     941                 :            :  */
     942                 :          0 : void check_disk_size_change(struct gendisk *disk, struct block_device *bdev)
     943                 :            : {
     944                 :            :         loff_t disk_size, bdev_size;
     945                 :            : 
     946                 :          0 :         disk_size = (loff_t)get_capacity(disk) << 9;
     947                 :          0 :         bdev_size = i_size_read(bdev->bd_inode);
     948         [ #  # ]:          0 :         if (disk_size != bdev_size) {
     949                 :            :                 char name[BDEVNAME_SIZE];
     950                 :            : 
     951                 :          0 :                 disk_name(disk, 0, name);
     952                 :          0 :                 printk(KERN_INFO
     953                 :            :                        "%s: detected capacity change from %lld to %lld\n",
     954                 :            :                        name, bdev_size, disk_size);
     955                 :          0 :                 i_size_write(bdev->bd_inode, disk_size);
     956                 :          0 :                 flush_disk(bdev, false);
     957                 :            :         }
     958                 :          0 : }
     959                 :            : EXPORT_SYMBOL(check_disk_size_change);
     960                 :            : 
     961                 :            : /**
     962                 :            :  * revalidate_disk - wrapper for lower-level driver's revalidate_disk call-back
     963                 :            :  * @disk: struct gendisk to be revalidated
     964                 :            :  *
     965                 :            :  * This routine is a wrapper for lower-level driver's revalidate_disk
     966                 :            :  * call-backs.  It is used to do common pre and post operations needed
     967                 :            :  * for all revalidate_disk operations.
     968                 :            :  */
     969                 :          0 : int revalidate_disk(struct gendisk *disk)
     970                 :            : {
     971                 :            :         struct block_device *bdev;
     972                 :            :         int ret = 0;
     973                 :            : 
     974         [ #  # ]:          0 :         if (disk->fops->revalidate_disk)
     975                 :          0 :                 ret = disk->fops->revalidate_disk(disk);
     976                 :            : 
     977                 :          0 :         bdev = bdget_disk(disk, 0);
     978         [ #  # ]:          0 :         if (!bdev)
     979                 :            :                 return ret;
     980                 :            : 
     981                 :          0 :         mutex_lock(&bdev->bd_mutex);
     982                 :          0 :         check_disk_size_change(disk, bdev);
     983                 :          0 :         bdev->bd_invalidated = 0;
     984                 :          0 :         mutex_unlock(&bdev->bd_mutex);
     985                 :            :         bdput(bdev);
     986                 :          0 :         return ret;
     987                 :            : }
     988                 :            : EXPORT_SYMBOL(revalidate_disk);
     989                 :            : 
     990                 :            : /*
     991                 :            :  * This routine checks whether a removable media has been changed,
     992                 :            :  * and invalidates all buffer-cache-entries in that case. This
     993                 :            :  * is a relatively slow routine, so we have to try to minimize using
     994                 :            :  * it. Thus it is called only upon a 'mount' or 'open'. This
     995                 :            :  * is the best way of combining speed and utility, I think.
     996                 :            :  * People changing diskettes in the middle of an operation deserve
     997                 :            :  * to lose :-)
     998                 :            :  */
     999                 :          0 : int check_disk_change(struct block_device *bdev)
    1000                 :            : {
    1001                 :          0 :         struct gendisk *disk = bdev->bd_disk;
    1002                 :          0 :         const struct block_device_operations *bdops = disk->fops;
    1003                 :            :         unsigned int events;
    1004                 :            : 
    1005                 :          0 :         events = disk_clear_events(disk, DISK_EVENT_MEDIA_CHANGE |
    1006                 :            :                                    DISK_EVENT_EJECT_REQUEST);
    1007         [ #  # ]:          0 :         if (!(events & DISK_EVENT_MEDIA_CHANGE))
    1008                 :            :                 return 0;
    1009                 :            : 
    1010                 :          0 :         flush_disk(bdev, true);
    1011         [ #  # ]:          0 :         if (bdops->revalidate_disk)
    1012                 :          0 :                 bdops->revalidate_disk(bdev->bd_disk);
    1013                 :            :         return 1;
    1014                 :            : }
    1015                 :            : 
    1016                 :            : EXPORT_SYMBOL(check_disk_change);
    1017                 :            : 
    1018                 :          0 : void bd_set_size(struct block_device *bdev, loff_t size)
    1019                 :            : {
    1020                 :          0 :         unsigned bsize = bdev_logical_block_size(bdev);
    1021                 :            : 
    1022                 :          0 :         mutex_lock(&bdev->bd_inode->i_mutex);
    1023                 :          0 :         i_size_write(bdev->bd_inode, size);
    1024                 :          0 :         mutex_unlock(&bdev->bd_inode->i_mutex);
    1025         [ #  # ]:          0 :         while (bsize < PAGE_CACHE_SIZE) {
    1026         [ #  # ]:          0 :                 if (size & bsize)
    1027                 :            :                         break;
    1028                 :          0 :                 bsize <<= 1;
    1029                 :            :         }
    1030                 :          0 :         bdev->bd_block_size = bsize;
    1031                 :          0 :         bdev->bd_inode->i_blkbits = blksize_bits(bsize);
    1032                 :          0 : }
    1033                 :            : EXPORT_SYMBOL(bd_set_size);
    1034                 :            : 
    1035                 :            : static void __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part);
    1036                 :            : 
    1037                 :            : /*
    1038                 :            :  * bd_mutex locking:
    1039                 :            :  *
    1040                 :            :  *  mutex_lock(part->bd_mutex)
    1041                 :            :  *    mutex_lock_nested(whole->bd_mutex, 1)
    1042                 :            :  */
    1043                 :            : 
    1044                 :        276 : static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
    1045                 :            : {
    1046                 :          0 :         struct gendisk *disk;
    1047                 :            :         struct module *owner;
    1048                 :            :         int ret;
    1049                 :            :         int partno;
    1050                 :            :         int perm = 0;
    1051                 :            : 
    1052                 :            :         if (mode & FMODE_READ)
    1053                 :            :                 perm |= MAY_READ;
    1054                 :            :         if (mode & FMODE_WRITE)
    1055                 :            :                 perm |= MAY_WRITE;
    1056                 :            :         /*
    1057                 :            :          * hooks: /n/, see "layering violations".
    1058                 :            :          */
    1059                 :            :         if (!for_part) {
    1060                 :            :                 ret = devcgroup_inode_permission(bdev->bd_inode, perm);
    1061                 :            :                 if (ret != 0) {
    1062                 :            :                         bdput(bdev);
    1063                 :            :                         return ret;
    1064                 :            :                 }
    1065                 :            :         }
    1066                 :            : 
    1067                 :            :  restart:
    1068                 :            : 
    1069                 :            :         ret = -ENXIO;
    1070                 :        276 :         disk = get_gendisk(bdev->bd_dev, &partno);
    1071         [ +  - ]:        276 :         if (!disk)
    1072                 :            :                 goto out;
    1073                 :        276 :         owner = disk->fops->owner;
    1074                 :            : 
    1075                 :        276 :         disk_block_events(disk);
    1076                 :        276 :         mutex_lock_nested(&bdev->bd_mutex, for_part);
    1077         [ -  + ]:        276 :         if (!bdev->bd_openers) {
    1078                 :          0 :                 bdev->bd_disk = disk;
    1079                 :          0 :                 bdev->bd_queue = disk->queue;
    1080                 :          0 :                 bdev->bd_contains = bdev;
    1081         [ #  # ]:          0 :                 if (!partno) {
    1082                 :            :                         struct backing_dev_info *bdi;
    1083                 :            : 
    1084                 :            :                         ret = -ENXIO;
    1085                 :          0 :                         bdev->bd_part = disk_get_part(disk, partno);
    1086         [ #  # ]:          0 :                         if (!bdev->bd_part)
    1087                 :            :                                 goto out_clear;
    1088                 :            : 
    1089                 :            :                         ret = 0;
    1090         [ #  # ]:          0 :                         if (disk->fops->open) {
    1091                 :          0 :                                 ret = disk->fops->open(bdev, mode);
    1092         [ #  # ]:          0 :                                 if (ret == -ERESTARTSYS) {
    1093                 :            :                                         /* Lost a race with 'disk' being
    1094                 :            :                                          * deleted, try again.
    1095                 :            :                                          * See md.c
    1096                 :            :                                          */
    1097                 :          0 :                                         disk_put_part(bdev->bd_part);
    1098                 :          0 :                                         bdev->bd_part = NULL;
    1099                 :          0 :                                         bdev->bd_disk = NULL;
    1100                 :          0 :                                         bdev->bd_queue = NULL;
    1101                 :          0 :                                         mutex_unlock(&bdev->bd_mutex);
    1102                 :          0 :                                         disk_unblock_events(disk);
    1103                 :          0 :                                         put_disk(disk);
    1104                 :          0 :                                         module_put(owner);
    1105                 :          0 :                                         goto restart;
    1106                 :            :                                 }
    1107                 :            :                         }
    1108                 :            : 
    1109         [ #  # ]:          0 :                         if (!ret) {
    1110                 :          0 :                                 bd_set_size(bdev,(loff_t)get_capacity(disk)<<9);
    1111                 :          0 :                                 bdi = blk_get_backing_dev_info(bdev);
    1112         [ #  # ]:          0 :                                 if (bdi == NULL)
    1113                 :            :                                         bdi = &default_backing_dev_info;
    1114                 :          0 :                                 bdev_inode_switch_bdi(bdev->bd_inode, bdi);
    1115                 :            :                         }
    1116                 :            : 
    1117                 :            :                         /*
    1118                 :            :                          * If the device is invalidated, rescan partition
    1119                 :            :                          * if open succeeded or failed with -ENOMEDIUM.
    1120                 :            :                          * The latter is necessary to prevent ghost
    1121                 :            :                          * partitions on a removed medium.
    1122                 :            :                          */
    1123         [ -  + ]:        276 :                         if (bdev->bd_invalidated) {
    1124         [ #  # ]:          0 :                                 if (!ret)
    1125                 :          0 :                                         rescan_partitions(disk, bdev);
    1126         [ #  # ]:          0 :                                 else if (ret == -ENOMEDIUM)
    1127                 :          0 :                                         invalidate_partitions(disk, bdev);
    1128                 :            :                         }
    1129         [ #  # ]:        276 :                         if (ret)
    1130                 :            :                                 goto out_clear;
    1131                 :            :                 } else {
    1132                 :            :                         struct block_device *whole;
    1133                 :          0 :                         whole = bdget_disk(disk, 0);
    1134                 :            :                         ret = -ENOMEM;
    1135         [ #  # ]:          0 :                         if (!whole)
    1136                 :            :                                 goto out_clear;
    1137         [ #  # ]:          0 :                         BUG_ON(for_part);
    1138                 :          0 :                         ret = __blkdev_get(whole, mode, 1);
    1139         [ #  # ]:          0 :                         if (ret)
    1140                 :            :                                 goto out_clear;
    1141                 :          0 :                         bdev->bd_contains = whole;
    1142                 :          0 :                         bdev_inode_switch_bdi(bdev->bd_inode,
    1143                 :          0 :                                 whole->bd_inode->i_data.backing_dev_info);
    1144                 :          0 :                         bdev->bd_part = disk_get_part(disk, partno);
    1145 [ #  # ][ #  # ]:          0 :                         if (!(disk->flags & GENHD_FL_UP) ||
    1146         [ #  # ]:          0 :                             !bdev->bd_part || !bdev->bd_part->nr_sects) {
    1147                 :            :                                 ret = -ENXIO;
    1148                 :            :                                 goto out_clear;
    1149                 :            :                         }
    1150                 :          0 :                         bd_set_size(bdev, (loff_t)bdev->bd_part->nr_sects << 9);
    1151                 :            :                 }
    1152                 :            :         } else {
    1153         [ -  + ]:        276 :                 if (bdev->bd_contains == bdev) {
    1154                 :            :                         ret = 0;
    1155         [ #  # ]:          0 :                         if (bdev->bd_disk->fops->open)
    1156                 :          0 :                                 ret = bdev->bd_disk->fops->open(bdev, mode);
    1157                 :            :                         /* the same as first opener case, read comment there */
    1158         [ #  # ]:          0 :                         if (bdev->bd_invalidated) {
    1159         [ #  # ]:          0 :                                 if (!ret)
    1160                 :          0 :                                         rescan_partitions(bdev->bd_disk, bdev);
    1161         [ #  # ]:          0 :                                 else if (ret == -ENOMEDIUM)
    1162                 :          0 :                                         invalidate_partitions(bdev->bd_disk, bdev);
    1163                 :            :                         }
    1164         [ #  # ]:          0 :                         if (ret)
    1165                 :            :                                 goto out_unlock_bdev;
    1166                 :            :                 }
    1167                 :            :                 /* only one opener holds refs to the module and disk */
    1168                 :        276 :                 put_disk(disk);
    1169                 :        276 :                 module_put(owner);
    1170                 :            :         }
    1171                 :        276 :         bdev->bd_openers++;
    1172         [ -  + ]:        276 :         if (for_part)
    1173                 :          0 :                 bdev->bd_part_count++;
    1174                 :        276 :         mutex_unlock(&bdev->bd_mutex);
    1175                 :        276 :         disk_unblock_events(disk);
    1176                 :        276 :         return 0;
    1177                 :            : 
    1178                 :            :  out_clear:
    1179                 :          0 :         disk_put_part(bdev->bd_part);
    1180                 :          0 :         bdev->bd_disk = NULL;
    1181                 :          0 :         bdev->bd_part = NULL;
    1182                 :          0 :         bdev->bd_queue = NULL;
    1183                 :          0 :         bdev_inode_switch_bdi(bdev->bd_inode, &default_backing_dev_info);
    1184         [ #  # ]:          0 :         if (bdev != bdev->bd_contains)
    1185                 :          0 :                 __blkdev_put(bdev->bd_contains, mode, 1);
    1186                 :          0 :         bdev->bd_contains = NULL;
    1187                 :            :  out_unlock_bdev:
    1188                 :          0 :         mutex_unlock(&bdev->bd_mutex);
    1189                 :          0 :         disk_unblock_events(disk);
    1190                 :          0 :         put_disk(disk);
    1191                 :          0 :         module_put(owner);
    1192                 :            :  out:
    1193                 :            :         bdput(bdev);
    1194                 :            : 
    1195                 :          0 :         return ret;
    1196                 :            : }
    1197                 :            : 
    1198                 :            : /**
    1199                 :            :  * blkdev_get - open a block device
    1200                 :            :  * @bdev: block_device to open
    1201                 :            :  * @mode: FMODE_* mask
    1202                 :            :  * @holder: exclusive holder identifier
    1203                 :            :  *
    1204                 :            :  * Open @bdev with @mode.  If @mode includes %FMODE_EXCL, @bdev is
    1205                 :            :  * open with exclusive access.  Specifying %FMODE_EXCL with %NULL
    1206                 :            :  * @holder is invalid.  Exclusive opens may nest for the same @holder.
    1207                 :            :  *
    1208                 :            :  * On success, the reference count of @bdev is unchanged.  On failure,
    1209                 :            :  * @bdev is put.
    1210                 :            :  *
    1211                 :            :  * CONTEXT:
    1212                 :            :  * Might sleep.
    1213                 :            :  *
    1214                 :            :  * RETURNS:
    1215                 :            :  * 0 on success, -errno on failure.
    1216                 :            :  */
    1217                 :          0 : int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder)
    1218                 :            : {
    1219                 :            :         struct block_device *whole = NULL;
    1220                 :            :         int res;
    1221                 :            : 
    1222 [ -  + ][ #  # ]:        276 :         WARN_ON_ONCE((mode & FMODE_EXCL) && !holder);
         [ -  + ][ #  # ]
                 [ #  # ]
    1223                 :            : 
    1224 [ -  + ][ #  # ]:        276 :         if ((mode & FMODE_EXCL) && holder) {
    1225                 :          0 :                 whole = bd_start_claiming(bdev, holder);
    1226         [ #  # ]:          0 :                 if (IS_ERR(whole)) {
    1227                 :            :                         bdput(bdev);
    1228                 :          0 :                         return PTR_ERR(whole);
    1229                 :            :                 }
    1230                 :            :         }
    1231                 :            : 
    1232                 :        276 :         res = __blkdev_get(bdev, mode, 0);
    1233                 :            : 
    1234         [ -  + ]:        276 :         if (whole) {
    1235                 :          0 :                 struct gendisk *disk = whole->bd_disk;
    1236                 :            : 
    1237                 :            :                 /* finish claiming */
    1238                 :          0 :                 mutex_lock(&bdev->bd_mutex);
    1239                 :            :                 spin_lock(&bdev_lock);
    1240                 :            : 
    1241         [ #  # ]:        276 :                 if (!res) {
    1242         [ #  # ]:          0 :                         BUG_ON(!bd_may_claim(bdev, whole, holder));
    1243                 :            :                         /*
    1244                 :            :                          * Note that for a whole device bd_holders
    1245                 :            :                          * will be incremented twice, and bd_holder
    1246                 :            :                          * will be set to bd_may_claim before being
    1247                 :            :                          * set to holder
    1248                 :            :                          */
    1249                 :          0 :                         whole->bd_holders++;
    1250                 :          0 :                         whole->bd_holder = bd_may_claim;
    1251                 :          0 :                         bdev->bd_holders++;
    1252                 :          0 :                         bdev->bd_holder = holder;
    1253                 :            :                 }
    1254                 :            : 
    1255                 :            :                 /* tell others that we're done */
    1256         [ #  # ]:          0 :                 BUG_ON(whole->bd_claiming != holder);
    1257                 :          0 :                 whole->bd_claiming = NULL;
    1258                 :          0 :                 wake_up_bit(&whole->bd_claiming, 0);
    1259                 :            : 
    1260                 :            :                 spin_unlock(&bdev_lock);
    1261                 :            : 
    1262                 :            :                 /*
    1263                 :            :                  * Block event polling for write claims if requested.  Any
    1264                 :            :                  * write holder makes the write_holder state stick until
    1265                 :            :                  * all are released.  This is good enough and tracking
    1266                 :            :                  * individual writeable reference is too fragile given the
    1267                 :            :                  * way @mode is used in blkdev_get/put().
    1268                 :            :                  */
    1269 [ #  # ][ #  # ]:          0 :                 if (!res && (mode & FMODE_WRITE) && !bdev->bd_write_holder &&
         [ #  # ][ #  # ]
    1270                 :          0 :                     (disk->flags & GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE)) {
    1271                 :          0 :                         bdev->bd_write_holder = true;
    1272                 :          0 :                         disk_block_events(disk);
    1273                 :            :                 }
    1274                 :            : 
    1275                 :          0 :                 mutex_unlock(&bdev->bd_mutex);
    1276                 :            :                 bdput(whole);
    1277                 :            :         }
    1278                 :            : 
    1279                 :        276 :         return res;
    1280                 :            : }
    1281                 :            : EXPORT_SYMBOL(blkdev_get);
    1282                 :            : 
    1283                 :            : /**
    1284                 :            :  * blkdev_get_by_path - open a block device by name
    1285                 :            :  * @path: path to the block device to open
    1286                 :            :  * @mode: FMODE_* mask
    1287                 :            :  * @holder: exclusive holder identifier
    1288                 :            :  *
    1289                 :            :  * Open the blockdevice described by the device file at @path.  @mode
    1290                 :            :  * and @holder are identical to blkdev_get().
    1291                 :            :  *
    1292                 :            :  * On success, the returned block_device has reference count of one.
    1293                 :            :  *
    1294                 :            :  * CONTEXT:
    1295                 :            :  * Might sleep.
    1296                 :            :  *
    1297                 :            :  * RETURNS:
    1298                 :            :  * Pointer to block_device on success, ERR_PTR(-errno) on failure.
    1299                 :            :  */
    1300                 :          0 : struct block_device *blkdev_get_by_path(const char *path, fmode_t mode,
    1301                 :            :                                         void *holder)
    1302                 :            : {
    1303                 :            :         struct block_device *bdev;
    1304                 :            :         int err;
    1305                 :            : 
    1306                 :          0 :         bdev = lookup_bdev(path);
    1307         [ #  # ]:          0 :         if (IS_ERR(bdev))
    1308                 :            :                 return bdev;
    1309                 :            : 
    1310                 :          0 :         err = blkdev_get(bdev, mode, holder);
    1311         [ #  # ]:          0 :         if (err)
    1312                 :          0 :                 return ERR_PTR(err);
    1313                 :            : 
    1314 [ #  # ][ #  # ]:          0 :         if ((mode & FMODE_WRITE) && bdev_read_only(bdev)) {
    1315                 :          0 :                 blkdev_put(bdev, mode);
    1316                 :          0 :                 return ERR_PTR(-EACCES);
    1317                 :            :         }
    1318                 :            : 
    1319                 :          0 :         return bdev;
    1320                 :            : }
    1321                 :            : EXPORT_SYMBOL(blkdev_get_by_path);
    1322                 :            : 
    1323                 :            : /**
    1324                 :            :  * blkdev_get_by_dev - open a block device by device number
    1325                 :            :  * @dev: device number of block device to open
    1326                 :            :  * @mode: FMODE_* mask
    1327                 :            :  * @holder: exclusive holder identifier
    1328                 :            :  *
    1329                 :            :  * Open the blockdevice described by device number @dev.  @mode and
    1330                 :            :  * @holder are identical to blkdev_get().
    1331                 :            :  *
    1332                 :            :  * Use it ONLY if you really do not have anything better - i.e. when
    1333                 :            :  * you are behind a truly sucky interface and all you are given is a
    1334                 :            :  * device number.  _Never_ to be used for internal purposes.  If you
    1335                 :            :  * ever need it - reconsider your API.
    1336                 :            :  *
    1337                 :            :  * On success, the returned block_device has reference count of one.
    1338                 :            :  *
    1339                 :            :  * CONTEXT:
    1340                 :            :  * Might sleep.
    1341                 :            :  *
    1342                 :            :  * RETURNS:
    1343                 :            :  * Pointer to block_device on success, ERR_PTR(-errno) on failure.
    1344                 :            :  */
    1345                 :          0 : struct block_device *blkdev_get_by_dev(dev_t dev, fmode_t mode, void *holder)
    1346                 :            : {
    1347                 :            :         struct block_device *bdev;
    1348                 :            :         int err;
    1349                 :            : 
    1350                 :          0 :         bdev = bdget(dev);
    1351         [ #  # ]:          0 :         if (!bdev)
    1352                 :            :                 return ERR_PTR(-ENOMEM);
    1353                 :            : 
    1354                 :          0 :         err = blkdev_get(bdev, mode, holder);
    1355         [ #  # ]:          0 :         if (err)
    1356                 :          0 :                 return ERR_PTR(err);
    1357                 :            : 
    1358                 :            :         return bdev;
    1359                 :            : }
    1360                 :            : EXPORT_SYMBOL(blkdev_get_by_dev);
    1361                 :            : 
    1362                 :          0 : static int blkdev_open(struct inode * inode, struct file * filp)
    1363                 :            : {
    1364                 :            :         struct block_device *bdev;
    1365                 :            : 
    1366                 :            :         /*
    1367                 :            :          * Preserve backwards compatibility and allow large file access
    1368                 :            :          * even if userspace doesn't ask for it explicitly. Some mkfs
    1369                 :            :          * binary needs it. We might want to drop this workaround
    1370                 :            :          * during an unstable branch.
    1371                 :            :          */
    1372                 :        276 :         filp->f_flags |= O_LARGEFILE;
    1373                 :            : 
    1374         [ -  + ]:        276 :         if (filp->f_flags & O_NDELAY)
    1375                 :          0 :                 filp->f_mode |= FMODE_NDELAY;
    1376         [ -  + ]:        276 :         if (filp->f_flags & O_EXCL)
    1377                 :          0 :                 filp->f_mode |= FMODE_EXCL;
    1378         [ -  + ]:        276 :         if ((filp->f_flags & O_ACCMODE) == 3)
    1379                 :          0 :                 filp->f_mode |= FMODE_WRITE_IOCTL;
    1380                 :            : 
    1381                 :        276 :         bdev = bd_acquire(inode);
    1382         [ +  - ]:        276 :         if (bdev == NULL)
    1383                 :            :                 return -ENOMEM;
    1384                 :            : 
    1385                 :        276 :         filp->f_mapping = bdev->bd_inode->i_mapping;
    1386                 :            : 
    1387                 :        276 :         return blkdev_get(bdev, filp->f_mode, filp);
    1388                 :            : }
    1389                 :            : 
    1390                 :        276 : static void __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part)
    1391                 :            : {
    1392                 :        276 :         struct gendisk *disk = bdev->bd_disk;
    1393                 :            :         struct block_device *victim = NULL;
    1394                 :            : 
    1395                 :        276 :         mutex_lock_nested(&bdev->bd_mutex, for_part);
    1396         [ -  + ]:        276 :         if (for_part)
    1397                 :          0 :                 bdev->bd_part_count--;
    1398                 :            : 
    1399         [ -  + ]:        276 :         if (!--bdev->bd_openers) {
    1400 [ #  # ][ #  # ]:          0 :                 WARN_ON_ONCE(bdev->bd_holders);
                 [ #  # ]
    1401                 :            :                 sync_blockdev(bdev);
    1402                 :          0 :                 kill_bdev(bdev);
    1403                 :            :                 /* ->release can cause the old bdi to disappear,
    1404                 :            :                  * so must switch it out first
    1405                 :            :                  */
    1406                 :          0 :                 bdev_inode_switch_bdi(bdev->bd_inode,
    1407                 :            :                                         &default_backing_dev_info);
    1408                 :            :         }
    1409         [ -  + ]:        276 :         if (bdev->bd_contains == bdev) {
    1410         [ #  # ]:          0 :                 if (disk->fops->release)
    1411                 :          0 :                         disk->fops->release(disk, mode);
    1412                 :            :         }
    1413         [ -  + ]:        276 :         if (!bdev->bd_openers) {
    1414                 :          0 :                 struct module *owner = disk->fops->owner;
    1415                 :            : 
    1416                 :          0 :                 disk_put_part(bdev->bd_part);
    1417                 :          0 :                 bdev->bd_part = NULL;
    1418                 :          0 :                 bdev->bd_disk = NULL;
    1419         [ #  # ]:          0 :                 if (bdev != bdev->bd_contains)
    1420                 :            :                         victim = bdev->bd_contains;
    1421                 :          0 :                 bdev->bd_contains = NULL;
    1422                 :            : 
    1423                 :          0 :                 put_disk(disk);
    1424                 :          0 :                 module_put(owner);
    1425                 :            :         }
    1426                 :        276 :         mutex_unlock(&bdev->bd_mutex);
    1427                 :            :         bdput(bdev);
    1428         [ -  + ]:        276 :         if (victim)
    1429                 :            :                 __blkdev_put(victim, mode, 1);
    1430                 :        276 : }
    1431                 :            : 
    1432                 :          0 : void blkdev_put(struct block_device *bdev, fmode_t mode)
    1433                 :            : {
    1434                 :        276 :         mutex_lock(&bdev->bd_mutex);
    1435                 :            : 
    1436         [ -  + ]:        276 :         if (mode & FMODE_EXCL) {
    1437                 :            :                 bool bdev_free;
    1438                 :            : 
    1439                 :            :                 /*
    1440                 :            :                  * Release a claim on the device.  The holder fields
    1441                 :            :                  * are protected with bdev_lock.  bd_mutex is to
    1442                 :            :                  * synchronize disk_holder unlinking.
    1443                 :            :                  */
    1444                 :            :                 spin_lock(&bdev_lock);
    1445                 :            : 
    1446 [ #  # ][ #  # ]:          0 :                 WARN_ON_ONCE(--bdev->bd_holders < 0);
                 [ -  + ]
    1447 [ #  # ][ #  # ]:        276 :                 WARN_ON_ONCE(--bdev->bd_contains->bd_holders < 0);
                 [ #  # ]
    1448                 :            : 
    1449                 :            :                 /* bd_contains might point to self, check in a separate step */
    1450         [ #  # ]:          0 :                 if ((bdev_free = !bdev->bd_holders))
    1451                 :          0 :                         bdev->bd_holder = NULL;
    1452         [ #  # ]:          0 :                 if (!bdev->bd_contains->bd_holders)
    1453                 :          0 :                         bdev->bd_contains->bd_holder = NULL;
    1454                 :            : 
    1455                 :            :                 spin_unlock(&bdev_lock);
    1456                 :            : 
    1457                 :            :                 /*
    1458                 :            :                  * If this was the last claim, remove holder link and
    1459                 :            :                  * unblock evpoll if it was a write holder.
    1460                 :            :                  */
    1461 [ #  # ][ #  # ]:          0 :                 if (bdev_free && bdev->bd_write_holder) {
    1462                 :          0 :                         disk_unblock_events(bdev->bd_disk);
    1463                 :          0 :                         bdev->bd_write_holder = false;
    1464                 :            :                 }
    1465                 :            :         }
    1466                 :            : 
    1467                 :            :         /*
    1468                 :            :          * Trigger event checking and tell drivers to flush MEDIA_CHANGE
    1469                 :            :          * event.  This is to ensure detection of media removal commanded
    1470                 :            :          * from userland - e.g. eject(1).
    1471                 :            :          */
    1472                 :        276 :         disk_flush_events(bdev->bd_disk, DISK_EVENT_MEDIA_CHANGE);
    1473                 :            : 
    1474                 :        276 :         mutex_unlock(&bdev->bd_mutex);
    1475                 :            : 
    1476                 :        276 :         __blkdev_put(bdev, mode, 0);
    1477                 :        276 : }
    1478                 :            : EXPORT_SYMBOL(blkdev_put);
    1479                 :            : 
    1480                 :          0 : static int blkdev_close(struct inode * inode, struct file * filp)
    1481                 :            : {
    1482                 :        276 :         struct block_device *bdev = I_BDEV(filp->f_mapping->host);
    1483                 :        276 :         blkdev_put(bdev, filp->f_mode);
    1484                 :        276 :         return 0;
    1485                 :            : }
    1486                 :            : 
    1487                 :          0 : static long block_ioctl(struct file *file, unsigned cmd, unsigned long arg)
    1488                 :            : {
    1489                 :          8 :         struct block_device *bdev = I_BDEV(file->f_mapping->host);
    1490                 :          8 :         fmode_t mode = file->f_mode;
    1491                 :            : 
    1492                 :            :         /*
    1493                 :            :          * O_NDELAY can be altered using fcntl(.., F_SETFL, ..), so we have
    1494                 :            :          * to updated it before every ioctl.
    1495                 :            :          */
    1496         [ -  + ]:          8 :         if (file->f_flags & O_NDELAY)
    1497                 :          0 :                 mode |= FMODE_NDELAY;
    1498                 :            :         else
    1499                 :          8 :                 mode &= ~FMODE_NDELAY;
    1500                 :            : 
    1501                 :          8 :         return blkdev_ioctl(bdev, mode, cmd, arg);
    1502                 :            : }
    1503                 :            : 
    1504                 :            : /*
    1505                 :            :  * Write data to the block device.  Only intended for the block device itself
    1506                 :            :  * and the raw driver which basically is a fake block device.
    1507                 :            :  *
    1508                 :            :  * Does not take i_mutex for the write and thus is not for general purpose
    1509                 :            :  * use.
    1510                 :            :  */
    1511                 :          0 : ssize_t blkdev_aio_write(struct kiocb *iocb, const struct iovec *iov,
    1512                 :            :                          unsigned long nr_segs, loff_t pos)
    1513                 :            : {
    1514                 :          0 :         struct file *file = iocb->ki_filp;
    1515                 :            :         struct blk_plug plug;
    1516                 :            :         ssize_t ret;
    1517                 :            : 
    1518         [ #  # ]:          0 :         BUG_ON(iocb->ki_pos != pos);
    1519                 :            : 
    1520                 :          0 :         blk_start_plug(&plug);
    1521                 :          0 :         ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos);
    1522         [ #  # ]:          0 :         if (ret > 0) {
    1523                 :            :                 ssize_t err;
    1524                 :            : 
    1525                 :          0 :                 err = generic_write_sync(file, pos, ret);
    1526         [ #  # ]:          0 :                 if (err < 0 && ret > 0)
    1527                 :            :                         ret = err;
    1528                 :            :         }
    1529                 :          0 :         blk_finish_plug(&plug);
    1530                 :          0 :         return ret;
    1531                 :            : }
    1532                 :            : EXPORT_SYMBOL_GPL(blkdev_aio_write);
    1533                 :            : 
    1534                 :          0 : static ssize_t blkdev_aio_read(struct kiocb *iocb, const struct iovec *iov,
    1535                 :            :                          unsigned long nr_segs, loff_t pos)
    1536                 :            : {
    1537                 :    1360364 :         struct file *file = iocb->ki_filp;
    1538                 :    1360364 :         struct inode *bd_inode = file->f_mapping->host;
    1539                 :            :         loff_t size = i_size_read(bd_inode);
    1540                 :            : 
    1541         [ +  - ]:    1360364 :         if (pos >= size)
    1542                 :            :                 return 0;
    1543                 :            : 
    1544                 :    1360364 :         size -= pos;
    1545         [ -  + ]:    1360364 :         if (size < iocb->ki_nbytes)
    1546                 :          0 :                 nr_segs = iov_shorten((struct iovec *)iov, nr_segs, size);
    1547                 :    1360364 :         return generic_file_aio_read(iocb, iov, nr_segs, pos);
    1548                 :            : }
    1549                 :            : 
    1550                 :            : /*
    1551                 :            :  * Try to release a page associated with block device when the system
    1552                 :            :  * is under memory pressure.
    1553                 :            :  */
    1554                 :          0 : static int blkdev_releasepage(struct page *page, gfp_t wait)
    1555                 :            : {
    1556                 :      76046 :         struct super_block *super = BDEV_I(page->mapping->host)->bdev.bd_super;
    1557                 :            : 
    1558 [ +  + ][ +  + ]:      76046 :         if (super && super->s_op->bdev_try_to_free_page)
    1559                 :      75954 :                 return super->s_op->bdev_try_to_free_page(super, page, wait);
    1560                 :            : 
    1561                 :         92 :         return try_to_free_buffers(page);
    1562                 :            : }
    1563                 :            : 
    1564                 :            : static const struct address_space_operations def_blk_aops = {
    1565                 :            :         .readpage       = blkdev_readpage,
    1566                 :            :         .writepage      = blkdev_writepage,
    1567                 :            :         .write_begin    = blkdev_write_begin,
    1568                 :            :         .write_end      = blkdev_write_end,
    1569                 :            :         .writepages     = generic_writepages,
    1570                 :            :         .releasepage    = blkdev_releasepage,
    1571                 :            :         .direct_IO      = blkdev_direct_IO,
    1572                 :            :         .is_dirty_writeback = buffer_check_dirty_writeback,
    1573                 :            : };
    1574                 :            : 
    1575                 :            : const struct file_operations def_blk_fops = {
    1576                 :            :         .open           = blkdev_open,
    1577                 :            :         .release        = blkdev_close,
    1578                 :            :         .llseek         = block_llseek,
    1579                 :            :         .read           = do_sync_read,
    1580                 :            :         .write          = do_sync_write,
    1581                 :            :         .aio_read       = blkdev_aio_read,
    1582                 :            :         .aio_write      = blkdev_aio_write,
    1583                 :            :         .mmap           = generic_file_mmap,
    1584                 :            :         .fsync          = blkdev_fsync,
    1585                 :            :         .unlocked_ioctl = block_ioctl,
    1586                 :            : #ifdef CONFIG_COMPAT
    1587                 :            :         .compat_ioctl   = compat_blkdev_ioctl,
    1588                 :            : #endif
    1589                 :            :         .splice_read    = generic_file_splice_read,
    1590                 :            :         .splice_write   = generic_file_splice_write,
    1591                 :            : };
    1592                 :            : 
    1593                 :          0 : int ioctl_by_bdev(struct block_device *bdev, unsigned cmd, unsigned long arg)
    1594                 :            : {
    1595                 :            :         int res;
    1596                 :          0 :         mm_segment_t old_fs = get_fs();
    1597                 :            :         set_fs(KERNEL_DS);
    1598                 :          0 :         res = blkdev_ioctl(bdev, 0, cmd, arg);
    1599                 :            :         set_fs(old_fs);
    1600                 :          0 :         return res;
    1601                 :            : }
    1602                 :            : 
    1603                 :            : EXPORT_SYMBOL(ioctl_by_bdev);
    1604                 :            : 
    1605                 :            : /**
    1606                 :            :  * lookup_bdev  - lookup a struct block_device by name
    1607                 :            :  * @pathname:   special file representing the block device
    1608                 :            :  *
    1609                 :            :  * Get a reference to the blockdevice at @pathname in the current
    1610                 :            :  * namespace if possible and return it.  Return ERR_PTR(error)
    1611                 :            :  * otherwise.
    1612                 :            :  */
    1613                 :          0 : struct block_device *lookup_bdev(const char *pathname)
    1614                 :            : {
    1615                 :            :         struct block_device *bdev;
    1616                 :            :         struct inode *inode;
    1617                 :            :         struct path path;
    1618                 :            :         int error;
    1619                 :            : 
    1620 [ #  # ][ #  # ]:          0 :         if (!pathname || !*pathname)
    1621                 :            :                 return ERR_PTR(-EINVAL);
    1622                 :            : 
    1623                 :          0 :         error = kern_path(pathname, LOOKUP_FOLLOW, &path);
    1624         [ #  # ]:          0 :         if (error)
    1625                 :          0 :                 return ERR_PTR(error);
    1626                 :            : 
    1627                 :          0 :         inode = path.dentry->d_inode;
    1628                 :            :         error = -ENOTBLK;
    1629         [ #  # ]:          0 :         if (!S_ISBLK(inode->i_mode))
    1630                 :            :                 goto fail;
    1631                 :            :         error = -EACCES;
    1632         [ #  # ]:          0 :         if (path.mnt->mnt_flags & MNT_NODEV)
    1633                 :            :                 goto fail;
    1634                 :            :         error = -ENOMEM;
    1635                 :          0 :         bdev = bd_acquire(inode);
    1636         [ #  # ]:          0 :         if (!bdev)
    1637                 :            :                 goto fail;
    1638                 :            : out:
    1639                 :          0 :         path_put(&path);
    1640                 :          0 :         return bdev;
    1641                 :            : fail:
    1642                 :            :         bdev = ERR_PTR(error);
    1643                 :          0 :         goto out;
    1644                 :            : }
    1645                 :            : EXPORT_SYMBOL(lookup_bdev);
    1646                 :            : 
    1647                 :          0 : int __invalidate_device(struct block_device *bdev, bool kill_dirty)
    1648                 :            : {
    1649                 :          0 :         struct super_block *sb = get_super(bdev);
    1650                 :            :         int res = 0;
    1651                 :            : 
    1652         [ #  # ]:          0 :         if (sb) {
    1653                 :            :                 /*
    1654                 :            :                  * no need to lock the super, get_super holds the
    1655                 :            :                  * read mutex so the filesystem cannot go away
    1656                 :            :                  * under us (->put_super runs with the write lock
    1657                 :            :                  * hold).
    1658                 :            :                  */
    1659                 :          0 :                 shrink_dcache_sb(sb);
    1660                 :          0 :                 res = invalidate_inodes(sb, kill_dirty);
    1661                 :          0 :                 drop_super(sb);
    1662                 :            :         }
    1663                 :          0 :         invalidate_bdev(bdev);
    1664                 :          0 :         return res;
    1665                 :            : }
    1666                 :            : EXPORT_SYMBOL(__invalidate_device);
    1667                 :            : 
    1668                 :          0 : void iterate_bdevs(void (*func)(struct block_device *, void *), void *arg)
    1669                 :            : {
    1670                 :            :         struct inode *inode, *old_inode = NULL;
    1671                 :            : 
    1672                 :            :         spin_lock(&inode_sb_list_lock);
    1673         [ +  + ]:     129976 :         list_for_each_entry(inode, &blockdev_superblock->s_inodes, i_sb_list) {
    1674                 :     118160 :                 struct address_space *mapping = inode->i_mapping;
    1675                 :            : 
    1676                 :            :                 spin_lock(&inode->i_lock);
    1677 [ +  - ][ +  + ]:     118160 :                 if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW) ||
    1678                 :     118160 :                     mapping->nrpages == 0) {
    1679                 :            :                         spin_unlock(&inode->i_lock);
    1680                 :     112248 :                         continue;
    1681                 :            :                 }
    1682                 :       5912 :                 __iget(inode);
    1683                 :            :                 spin_unlock(&inode->i_lock);
    1684                 :            :                 spin_unlock(&inode_sb_list_lock);
    1685                 :            :                 /*
    1686                 :            :                  * We hold a reference to 'inode' so it couldn't have been
    1687                 :            :                  * removed from s_inodes list while we dropped the
    1688                 :            :                  * inode_sb_list_lock.  We cannot iput the inode now as we can
    1689                 :            :                  * be holding the last reference and we cannot iput it under
    1690                 :            :                  * inode_sb_list_lock. So we keep the reference and iput it
    1691                 :            :                  * later.
    1692                 :            :                  */
    1693                 :       5912 :                 iput(old_inode);
    1694                 :            :                 old_inode = inode;
    1695                 :            : 
    1696                 :       5912 :                 func(I_BDEV(inode), arg);
    1697                 :            : 
    1698                 :            :                 spin_lock(&inode_sb_list_lock);
    1699                 :            :         }
    1700                 :            :         spin_unlock(&inode_sb_list_lock);
    1701                 :       5908 :         iput(old_inode);
    1702                 :       5906 : }

Generated by: LCOV version 1.9