Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'cleanup-bd_claim' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/misc into for-2.6.38/core

+383 -725
+3 -2
block/ioctl.c
··· 295 295 return -EINVAL; 296 296 if (get_user(n, (int __user *) arg)) 297 297 return -EFAULT; 298 - if (!(mode & FMODE_EXCL) && bd_claim(bdev, &bdev) < 0) 298 + if (!(mode & FMODE_EXCL) && 299 + blkdev_get(bdev, mode | FMODE_EXCL, &bdev) < 0) 299 300 return -EBUSY; 300 301 ret = set_blocksize(bdev, n); 301 302 if (!(mode & FMODE_EXCL)) 302 - bd_release(bdev); 303 + blkdev_put(bdev, mode | FMODE_EXCL); 303 304 return ret; 304 305 case BLKPG: 305 306 ret = blkpg_ioctl(bdev, (struct blkpg_ioctl_arg __user *) arg);
-2
drivers/block/drbd/drbd_int.h
··· 911 911 struct drbd_backing_dev { 912 912 struct block_device *backing_bdev; 913 913 struct block_device *md_bdev; 914 - struct file *lo_file; 915 - struct file *md_file; 916 914 struct drbd_md md; 917 915 struct disk_conf dc; /* The user provided config... */ 918 916 sector_t known_size; /* last known size of that backing device */
+2 -5
drivers/block/drbd/drbd_main.c
··· 3372 3372 if (ldev == NULL) 3373 3373 return; 3374 3374 3375 - bd_release(ldev->backing_bdev); 3376 - bd_release(ldev->md_bdev); 3377 - 3378 - fput(ldev->lo_file); 3379 - fput(ldev->md_file); 3375 + blkdev_put(ldev->backing_bdev, FMODE_READ | FMODE_WRITE | FMODE_EXCL); 3376 + blkdev_put(ldev->md_bdev, FMODE_READ | FMODE_WRITE | FMODE_EXCL); 3380 3377 3381 3378 kfree(ldev); 3382 3379 }
+36 -67
drivers/block/drbd/drbd_nl.c
··· 855 855 sector_t max_possible_sectors; 856 856 sector_t min_md_device_sectors; 857 857 struct drbd_backing_dev *nbc = NULL; /* new_backing_conf */ 858 - struct inode *inode, *inode2; 858 + struct block_device *bdev; 859 859 struct lru_cache *resync_lru = NULL; 860 860 union drbd_state ns, os; 861 861 unsigned int max_seg_s; ··· 907 907 } 908 908 } 909 909 910 - nbc->lo_file = filp_open(nbc->dc.backing_dev, O_RDWR, 0); 911 - if (IS_ERR(nbc->lo_file)) { 910 + bdev = blkdev_get_by_path(nbc->dc.backing_dev, 911 + FMODE_READ | FMODE_WRITE | FMODE_EXCL, mdev); 912 + if (IS_ERR(bdev)) { 912 913 dev_err(DEV, "open(\"%s\") failed with %ld\n", nbc->dc.backing_dev, 913 - PTR_ERR(nbc->lo_file)); 914 - nbc->lo_file = NULL; 914 + PTR_ERR(bdev)); 915 915 retcode = ERR_OPEN_DISK; 916 916 goto fail; 917 917 } 918 + nbc->backing_bdev = bdev; 918 919 919 - inode = nbc->lo_file->f_dentry->d_inode; 920 - 921 - if (!S_ISBLK(inode->i_mode)) { 922 - retcode = ERR_DISK_NOT_BDEV; 923 - goto fail; 924 - } 925 - 926 - nbc->md_file = filp_open(nbc->dc.meta_dev, O_RDWR, 0); 927 - if (IS_ERR(nbc->md_file)) { 920 + /* 921 + * meta_dev_idx >= 0: external fixed size, possibly multiple 922 + * drbd sharing one meta device. TODO in that case, paranoia 923 + * check that [md_bdev, meta_dev_idx] is not yet used by some 924 + * other drbd minor! (if you use drbd.conf + drbdadm, that 925 + * should check it for you already; but if you don't, or 926 + * someone fooled it, we need to double check here) 927 + */ 928 + bdev = blkdev_get_by_path(nbc->dc.meta_dev, 929 + FMODE_READ | FMODE_WRITE | FMODE_EXCL, 930 + (nbc->dc.meta_dev_idx < 0) ? 931 + (void *)mdev : (void *)drbd_m_holder); 932 + if (IS_ERR(bdev)) { 928 933 dev_err(DEV, "open(\"%s\") failed with %ld\n", nbc->dc.meta_dev, 929 - PTR_ERR(nbc->md_file)); 930 - nbc->md_file = NULL; 934 + PTR_ERR(bdev)); 931 935 retcode = ERR_OPEN_MD_DISK; 932 936 goto fail; 933 937 } 938 + nbc->md_bdev = bdev; 934 939 935 - inode2 = nbc->md_file->f_dentry->d_inode; 936 - 937 - if (!S_ISBLK(inode2->i_mode)) { 938 - retcode = ERR_MD_NOT_BDEV; 939 - goto fail; 940 - } 941 - 942 - nbc->backing_bdev = inode->i_bdev; 943 - if (bd_claim(nbc->backing_bdev, mdev)) { 944 - printk(KERN_ERR "drbd: bd_claim(%p,%p); failed [%p;%p;%u]\n", 945 - nbc->backing_bdev, mdev, 946 - nbc->backing_bdev->bd_holder, 947 - nbc->backing_bdev->bd_contains->bd_holder, 948 - nbc->backing_bdev->bd_holders); 949 - retcode = ERR_BDCLAIM_DISK; 940 + if ((nbc->backing_bdev == nbc->md_bdev) != 941 + (nbc->dc.meta_dev_idx == DRBD_MD_INDEX_INTERNAL || 942 + nbc->dc.meta_dev_idx == DRBD_MD_INDEX_FLEX_INT)) { 943 + retcode = ERR_MD_IDX_INVALID; 950 944 goto fail; 951 945 } 952 946 ··· 949 955 offsetof(struct bm_extent, lce)); 950 956 if (!resync_lru) { 951 957 retcode = ERR_NOMEM; 952 - goto release_bdev_fail; 953 - } 954 - 955 - /* meta_dev_idx >= 0: external fixed size, 956 - * possibly multiple drbd sharing one meta device. 957 - * TODO in that case, paranoia check that [md_bdev, meta_dev_idx] is 958 - * not yet used by some other drbd minor! 959 - * (if you use drbd.conf + drbdadm, 960 - * that should check it for you already; but if you don't, or someone 961 - * fooled it, we need to double check here) */ 962 - nbc->md_bdev = inode2->i_bdev; 963 - if (bd_claim(nbc->md_bdev, (nbc->dc.meta_dev_idx < 0) ? (void *)mdev 964 - : (void *) drbd_m_holder)) { 965 - retcode = ERR_BDCLAIM_MD_DISK; 966 - goto release_bdev_fail; 967 - } 968 - 969 - if ((nbc->backing_bdev == nbc->md_bdev) != 970 - (nbc->dc.meta_dev_idx == DRBD_MD_INDEX_INTERNAL || 971 - nbc->dc.meta_dev_idx == DRBD_MD_INDEX_FLEX_INT)) { 972 - retcode = ERR_MD_IDX_INVALID; 973 - goto release_bdev2_fail; 958 + goto fail; 974 959 } 975 960 976 961 /* RT - for drbd_get_max_capacity() DRBD_MD_INDEX_FLEX_INT */ ··· 960 987 (unsigned long long) drbd_get_max_capacity(nbc), 961 988 (unsigned long long) nbc->dc.disk_size); 962 989 retcode = ERR_DISK_TO_SMALL; 963 - goto release_bdev2_fail; 990 + goto fail; 964 991 } 965 992 966 993 if (nbc->dc.meta_dev_idx < 0) { ··· 977 1004 dev_warn(DEV, "refusing attach: md-device too small, " 978 1005 "at least %llu sectors needed for this meta-disk type\n", 979 1006 (unsigned long long) min_md_device_sectors); 980 - goto release_bdev2_fail; 1007 + goto fail; 981 1008 } 982 1009 983 1010 /* Make sure the new disk is big enough ··· 985 1012 if (drbd_get_max_capacity(nbc) < 986 1013 drbd_get_capacity(mdev->this_bdev)) { 987 1014 retcode = ERR_DISK_TO_SMALL; 988 - goto release_bdev2_fail; 1015 + goto fail; 989 1016 } 990 1017 991 1018 nbc->known_size = drbd_get_capacity(nbc->backing_bdev); ··· 1008 1035 retcode = _drbd_request_state(mdev, NS(disk, D_ATTACHING), CS_VERBOSE); 1009 1036 drbd_resume_io(mdev); 1010 1037 if (retcode < SS_SUCCESS) 1011 - goto release_bdev2_fail; 1038 + goto fail; 1012 1039 1013 1040 if (!get_ldev_if_state(mdev, D_ATTACHING)) 1014 1041 goto force_diskless; ··· 1242 1269 force_diskless: 1243 1270 drbd_force_state(mdev, NS(disk, D_FAILED)); 1244 1271 drbd_md_sync(mdev); 1245 - release_bdev2_fail: 1246 - if (nbc) 1247 - bd_release(nbc->md_bdev); 1248 - release_bdev_fail: 1249 - if (nbc) 1250 - bd_release(nbc->backing_bdev); 1251 1272 fail: 1252 1273 if (nbc) { 1253 - if (nbc->lo_file) 1254 - fput(nbc->lo_file); 1255 - if (nbc->md_file) 1256 - fput(nbc->md_file); 1274 + if (nbc->backing_bdev) 1275 + blkdev_put(nbc->backing_bdev, 1276 + FMODE_READ | FMODE_WRITE | FMODE_EXCL); 1277 + if (nbc->md_bdev) 1278 + blkdev_put(nbc->md_bdev, 1279 + FMODE_READ | FMODE_WRITE | FMODE_EXCL); 1257 1280 kfree(nbc); 1258 1281 } 1259 1282 lc_destroy(resync_lru);
+8 -14
drivers/block/pktcdvd.c
··· 2296 2296 * so bdget() can't fail. 2297 2297 */ 2298 2298 bdget(pd->bdev->bd_dev); 2299 - if ((ret = blkdev_get(pd->bdev, FMODE_READ))) 2299 + if ((ret = blkdev_get(pd->bdev, FMODE_READ | FMODE_EXCL, pd))) 2300 2300 goto out; 2301 - 2302 - if ((ret = bd_claim(pd->bdev, pd))) 2303 - goto out_putdev; 2304 2301 2305 2302 if ((ret = pkt_get_last_written(pd, &lba))) { 2306 2303 printk(DRIVER_NAME": pkt_get_last_written failed\n"); 2307 - goto out_unclaim; 2304 + goto out_putdev; 2308 2305 } 2309 2306 2310 2307 set_capacity(pd->disk, lba << 2); ··· 2311 2314 q = bdev_get_queue(pd->bdev); 2312 2315 if (write) { 2313 2316 if ((ret = pkt_open_write(pd))) 2314 - goto out_unclaim; 2317 + goto out_putdev; 2315 2318 /* 2316 2319 * Some CDRW drives can not handle writes larger than one packet, 2317 2320 * even if the size is a multiple of the packet size. ··· 2326 2329 } 2327 2330 2328 2331 if ((ret = pkt_set_segment_merging(pd, q))) 2329 - goto out_unclaim; 2332 + goto out_putdev; 2330 2333 2331 2334 if (write) { 2332 2335 if (!pkt_grow_pktlist(pd, CONFIG_CDROM_PKTCDVD_BUFFERS)) { 2333 2336 printk(DRIVER_NAME": not enough memory for buffers\n"); 2334 2337 ret = -ENOMEM; 2335 - goto out_unclaim; 2338 + goto out_putdev; 2336 2339 } 2337 2340 printk(DRIVER_NAME": %lukB available on disc\n", lba << 1); 2338 2341 } 2339 2342 2340 2343 return 0; 2341 2344 2342 - out_unclaim: 2343 - bd_release(pd->bdev); 2344 2345 out_putdev: 2345 - blkdev_put(pd->bdev, FMODE_READ); 2346 + blkdev_put(pd->bdev, FMODE_READ | FMODE_EXCL); 2346 2347 out: 2347 2348 return ret; 2348 2349 } ··· 2357 2362 pkt_lock_door(pd, 0); 2358 2363 2359 2364 pkt_set_speed(pd, MAX_SPEED, MAX_SPEED); 2360 - bd_release(pd->bdev); 2361 - blkdev_put(pd->bdev, FMODE_READ); 2365 + blkdev_put(pd->bdev, FMODE_READ | FMODE_EXCL); 2362 2366 2363 2367 pkt_shrink_pktlist(pd); 2364 2368 } ··· 2727 2733 bdev = bdget(dev); 2728 2734 if (!bdev) 2729 2735 return -ENOMEM; 2730 - ret = blkdev_get(bdev, FMODE_READ | FMODE_NDELAY); 2736 + ret = blkdev_get(bdev, FMODE_READ | FMODE_NDELAY, NULL); 2731 2737 if (ret) 2732 2738 return ret; 2733 2739
+4 -10
drivers/char/raw.c
··· 65 65 if (!bdev) 66 66 goto out; 67 67 igrab(bdev->bd_inode); 68 - err = blkdev_get(bdev, filp->f_mode); 68 + err = blkdev_get(bdev, filp->f_mode | FMODE_EXCL, raw_open); 69 69 if (err) 70 70 goto out; 71 - err = bd_claim(bdev, raw_open); 72 - if (err) 73 - goto out1; 74 71 err = set_blocksize(bdev, bdev_logical_block_size(bdev)); 75 72 if (err) 76 - goto out2; 73 + goto out1; 77 74 filp->f_flags |= O_DIRECT; 78 75 filp->f_mapping = bdev->bd_inode->i_mapping; 79 76 if (++raw_devices[minor].inuse == 1) ··· 80 83 mutex_unlock(&raw_mutex); 81 84 return 0; 82 85 83 - out2: 84 - bd_release(bdev); 85 86 out1: 86 - blkdev_put(bdev, filp->f_mode); 87 + blkdev_put(bdev, filp->f_mode | FMODE_EXCL); 87 88 out: 88 89 mutex_unlock(&raw_mutex); 89 90 return err; ··· 105 110 } 106 111 mutex_unlock(&raw_mutex); 107 112 108 - bd_release(bdev); 109 - blkdev_put(bdev, filp->f_mode); 113 + blkdev_put(bdev, filp->f_mode | FMODE_EXCL); 110 114 return 0; 111 115 } 112 116
+11 -9
drivers/md/dm-table.c
··· 325 325 326 326 BUG_ON(d->dm_dev.bdev); 327 327 328 - bdev = open_by_devnum(dev, d->dm_dev.mode); 328 + bdev = blkdev_get_by_dev(dev, d->dm_dev.mode | FMODE_EXCL, _claim_ptr); 329 329 if (IS_ERR(bdev)) 330 330 return PTR_ERR(bdev); 331 - r = bd_claim_by_disk(bdev, _claim_ptr, dm_disk(md)); 332 - if (r) 333 - blkdev_put(bdev, d->dm_dev.mode); 334 - else 335 - d->dm_dev.bdev = bdev; 336 - return r; 331 + 332 + r = bd_link_disk_holder(bdev, dm_disk(md)); 333 + if (r) { 334 + blkdev_put(bdev, d->dm_dev.mode | FMODE_EXCL); 335 + return r; 336 + } 337 + 338 + d->dm_dev.bdev = bdev; 339 + return 0; 337 340 } 338 341 339 342 /* ··· 347 344 if (!d->dm_dev.bdev) 348 345 return; 349 346 350 - bd_release_from_disk(d->dm_dev.bdev, dm_disk(md)); 351 - blkdev_put(d->dm_dev.bdev, d->dm_dev.mode); 347 + blkdev_put(d->dm_dev.bdev, d->dm_dev.mode | FMODE_EXCL); 352 348 d->dm_dev.bdev = NULL; 353 349 } 354 350
+4 -12
drivers/md/md.c
··· 1880 1880 rdev->sysfs_state = sysfs_get_dirent_safe(rdev->kobj.sd, "state"); 1881 1881 1882 1882 list_add_rcu(&rdev->same_set, &mddev->disks); 1883 - bd_claim_by_disk(rdev->bdev, rdev->bdev->bd_holder, mddev->gendisk); 1883 + bd_link_disk_holder(rdev->bdev, mddev->gendisk); 1884 1884 1885 1885 /* May as well allow recovery to be retried once */ 1886 1886 mddev->recovery_disabled = 0; ··· 1907 1907 MD_BUG(); 1908 1908 return; 1909 1909 } 1910 - bd_release_from_disk(rdev->bdev, rdev->mddev->gendisk); 1911 1910 list_del_rcu(&rdev->same_set); 1912 1911 printk(KERN_INFO "md: unbind<%s>\n", bdevname(rdev->bdev,b)); 1913 1912 rdev->mddev = NULL; ··· 1934 1935 struct block_device *bdev; 1935 1936 char b[BDEVNAME_SIZE]; 1936 1937 1937 - bdev = open_by_devnum(dev, FMODE_READ|FMODE_WRITE); 1938 + bdev = blkdev_get_by_dev(dev, FMODE_READ|FMODE_WRITE|FMODE_EXCL, 1939 + shared ? (mdk_rdev_t *)lock_rdev : rdev); 1938 1940 if (IS_ERR(bdev)) { 1939 1941 printk(KERN_ERR "md: could not open %s.\n", 1940 1942 __bdevname(dev, b)); 1941 1943 return PTR_ERR(bdev); 1942 - } 1943 - err = bd_claim(bdev, shared ? (mdk_rdev_t *)lock_rdev : rdev); 1944 - if (err) { 1945 - printk(KERN_ERR "md: could not bd_claim %s.\n", 1946 - bdevname(bdev, b)); 1947 - blkdev_put(bdev, FMODE_READ|FMODE_WRITE); 1948 - return err; 1949 1944 } 1950 1945 if (!shared) 1951 1946 set_bit(AllReserved, &rdev->flags); ··· 1953 1960 rdev->bdev = NULL; 1954 1961 if (!bdev) 1955 1962 MD_BUG(); 1956 - bd_release(bdev); 1957 - blkdev_put(bdev, FMODE_READ|FMODE_WRITE); 1963 + blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL); 1958 1964 } 1959 1965 1960 1966 void md_autodetect_dev(dev_t dev);
+5 -5
drivers/mtd/devices/block2mtd.c
··· 224 224 if (dev->blkdev) { 225 225 invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping, 226 226 0, -1); 227 - close_bdev_exclusive(dev->blkdev, FMODE_READ|FMODE_WRITE); 227 + blkdev_put(dev->blkdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL); 228 228 } 229 229 230 230 kfree(dev); ··· 234 234 /* FIXME: ensure that mtd->size % erase_size == 0 */ 235 235 static struct block2mtd_dev *add_device(char *devname, int erase_size) 236 236 { 237 + const fmode_t mode = FMODE_READ | FMODE_WRITE | FMODE_EXCL; 237 238 struct block_device *bdev; 238 239 struct block2mtd_dev *dev; 239 240 char *name; ··· 247 246 return NULL; 248 247 249 248 /* Get a handle on the device */ 250 - bdev = open_bdev_exclusive(devname, FMODE_READ|FMODE_WRITE, NULL); 249 + bdev = blkdev_get_by_path(devname, mode, dev); 251 250 #ifndef MODULE 252 251 if (IS_ERR(bdev)) { 253 252 ··· 255 254 to resolve the device name by other means. */ 256 255 257 256 dev_t devt = name_to_dev_t(devname); 258 - if (devt) { 259 - bdev = open_by_devnum(devt, FMODE_WRITE | FMODE_READ); 260 - } 257 + if (devt) 258 + bdev = blkdev_get_by_dev(devt, mode, dev); 261 259 } 262 260 #endif 263 261
+1 -1
drivers/s390/block/dasd_genhd.c
··· 103 103 struct block_device *bdev; 104 104 105 105 bdev = bdget_disk(block->gdp, 0); 106 - if (!bdev || blkdev_get(bdev, FMODE_READ) < 0) 106 + if (!bdev || blkdev_get(bdev, FMODE_READ, NULL) < 0) 107 107 return -ENODEV; 108 108 /* 109 109 * See fs/partition/check.c:register_disk,rescan_partitions
+2 -5
drivers/usb/gadget/storage_common.c
··· 543 543 ro = curlun->initially_ro; 544 544 if (!ro) { 545 545 filp = filp_open(filename, O_RDWR | O_LARGEFILE, 0); 546 - if (-EROFS == PTR_ERR(filp)) 546 + if (PTR_ERR(filp) == -EROFS || PTR_ERR(filp) == -EACCES) 547 547 ro = 1; 548 548 } 549 549 if (ro) ··· 558 558 559 559 if (filp->f_path.dentry) 560 560 inode = filp->f_path.dentry->d_inode; 561 - if (inode && S_ISBLK(inode->i_mode)) { 562 - if (bdev_read_only(inode->i_bdev)) 563 - ro = 1; 564 - } else if (!inode || !S_ISREG(inode->i_mode)) { 561 + if (!inode || (!S_ISREG(inode->i_mode) && !S_ISBLK(inode->i_mode))) { 565 562 LINFO(curlun, "invalid file type: %s\n", filename); 566 563 goto out; 567 564 }
+227 -493
fs/block_dev.c
··· 426 426 mutex_init(&bdev->bd_mutex); 427 427 INIT_LIST_HEAD(&bdev->bd_inodes); 428 428 INIT_LIST_HEAD(&bdev->bd_list); 429 - #ifdef CONFIG_SYSFS 430 - INIT_LIST_HEAD(&bdev->bd_holder_list); 431 - #endif 432 429 inode_init_once(&ei->vfs_inode); 433 430 /* Initialize mutex for freeze. */ 434 431 mutex_init(&bdev->bd_fsfreeze_mutex); ··· 660 663 else if (bdev->bd_contains == bdev) 661 664 return true; /* is a whole device which isn't held */ 662 665 663 - else if (whole->bd_holder == bd_claim) 666 + else if (whole->bd_holder == bd_may_claim) 664 667 return true; /* is a partition of a device that is being partitioned */ 665 668 else if (whole->bd_holder != NULL) 666 669 return false; /* is a partition of a held device */ ··· 772 775 } 773 776 } 774 777 775 - /* releases bdev_lock */ 776 - static void __bd_abort_claiming(struct block_device *whole, void *holder) 777 - { 778 - BUG_ON(whole->bd_claiming != holder); 779 - whole->bd_claiming = NULL; 780 - wake_up_bit(&whole->bd_claiming, 0); 781 - 782 - spin_unlock(&bdev_lock); 783 - bdput(whole); 784 - } 785 - 786 - /** 787 - * bd_abort_claiming - abort claiming a block device 788 - * @whole: whole block device returned by bd_start_claiming() 789 - * @holder: holder trying to claim @bdev 790 - * 791 - * Abort a claiming block started by bd_start_claiming(). Note that 792 - * @whole is not the block device to be claimed but the whole device 793 - * returned by bd_start_claiming(). 794 - * 795 - * CONTEXT: 796 - * Grabs and releases bdev_lock. 797 - */ 798 - static void bd_abort_claiming(struct block_device *whole, void *holder) 799 - { 800 - spin_lock(&bdev_lock); 801 - __bd_abort_claiming(whole, holder); /* releases bdev_lock */ 802 - } 803 - 804 - /* increment holders when we have a legitimate claim. requires bdev_lock */ 805 - static void __bd_claim(struct block_device *bdev, struct block_device *whole, 806 - void *holder) 807 - { 808 - /* note that for a whole device bd_holders 809 - * will be incremented twice, and bd_holder will 810 - * be set to bd_claim before being set to holder 811 - */ 812 - whole->bd_holders++; 813 - whole->bd_holder = bd_claim; 814 - bdev->bd_holders++; 815 - bdev->bd_holder = holder; 816 - } 817 - 818 - /** 819 - * bd_finish_claiming - finish claiming a block device 820 - * @bdev: block device of interest (passed to bd_start_claiming()) 821 - * @whole: whole block device returned by bd_start_claiming() 822 - * @holder: holder trying to claim @bdev 823 - * 824 - * Finish a claiming block started by bd_start_claiming(). 825 - * 826 - * CONTEXT: 827 - * Grabs and releases bdev_lock. 828 - */ 829 - static void bd_finish_claiming(struct block_device *bdev, 830 - struct block_device *whole, void *holder) 831 - { 832 - spin_lock(&bdev_lock); 833 - BUG_ON(!bd_may_claim(bdev, whole, holder)); 834 - __bd_claim(bdev, whole, holder); 835 - __bd_abort_claiming(whole, holder); /* not actually an abort */ 836 - } 837 - 838 - /** 839 - * bd_claim - claim a block device 840 - * @bdev: block device to claim 841 - * @holder: holder trying to claim @bdev 842 - * 843 - * Try to claim @bdev which must have been opened successfully. 844 - * 845 - * CONTEXT: 846 - * Might sleep. 847 - * 848 - * RETURNS: 849 - * 0 if successful, -EBUSY if @bdev is already claimed. 850 - */ 851 - int bd_claim(struct block_device *bdev, void *holder) 852 - { 853 - struct block_device *whole = bdev->bd_contains; 854 - int res; 855 - 856 - might_sleep(); 857 - 858 - spin_lock(&bdev_lock); 859 - res = bd_prepare_to_claim(bdev, whole, holder); 860 - if (res == 0) 861 - __bd_claim(bdev, whole, holder); 862 - spin_unlock(&bdev_lock); 863 - 864 - return res; 865 - } 866 - EXPORT_SYMBOL(bd_claim); 867 - 868 - void bd_release(struct block_device *bdev) 869 - { 870 - spin_lock(&bdev_lock); 871 - if (!--bdev->bd_contains->bd_holders) 872 - bdev->bd_contains->bd_holder = NULL; 873 - if (!--bdev->bd_holders) 874 - bdev->bd_holder = NULL; 875 - spin_unlock(&bdev_lock); 876 - } 877 - 878 - EXPORT_SYMBOL(bd_release); 879 - 880 778 #ifdef CONFIG_SYSFS 881 - /* 882 - * Functions for bd_claim_by_kobject / bd_release_from_kobject 883 - * 884 - * If a kobject is passed to bd_claim_by_kobject() 885 - * and the kobject has a parent directory, 886 - * following symlinks are created: 887 - * o from the kobject to the claimed bdev 888 - * o from "holders" directory of the bdev to the parent of the kobject 889 - * bd_release_from_kobject() removes these symlinks. 890 - * 891 - * Example: 892 - * If /dev/dm-0 maps to /dev/sda, kobject corresponding to 893 - * /sys/block/dm-0/slaves is passed to bd_claim_by_kobject(), then: 894 - * /sys/block/dm-0/slaves/sda --> /sys/block/sda 895 - * /sys/block/sda/holders/dm-0 --> /sys/block/dm-0 896 - */ 897 - 898 779 static int add_symlink(struct kobject *from, struct kobject *to) 899 780 { 900 - if (!from || !to) 901 - return 0; 902 781 return sysfs_create_link(from, to, kobject_name(to)); 903 782 } 904 783 905 784 static void del_symlink(struct kobject *from, struct kobject *to) 906 785 { 907 - if (!from || !to) 908 - return; 909 786 sysfs_remove_link(from, kobject_name(to)); 910 787 } 911 788 912 - /* 913 - * 'struct bd_holder' contains pointers to kobjects symlinked by 914 - * bd_claim_by_kobject. 915 - * It's connected to bd_holder_list which is protected by bdev->bd_sem. 916 - */ 917 - struct bd_holder { 918 - struct list_head list; /* chain of holders of the bdev */ 919 - int count; /* references from the holder */ 920 - struct kobject *sdir; /* holder object, e.g. "/block/dm-0/slaves" */ 921 - struct kobject *hdev; /* e.g. "/block/dm-0" */ 922 - struct kobject *hdir; /* e.g. "/block/sda/holders" */ 923 - struct kobject *sdev; /* e.g. "/block/sda" */ 924 - }; 925 - 926 - /* 927 - * Get references of related kobjects at once. 928 - * Returns 1 on success. 0 on failure. 929 - * 930 - * Should call bd_holder_release_dirs() after successful use. 931 - */ 932 - static int bd_holder_grab_dirs(struct block_device *bdev, 933 - struct bd_holder *bo) 934 - { 935 - if (!bdev || !bo) 936 - return 0; 937 - 938 - bo->sdir = kobject_get(bo->sdir); 939 - if (!bo->sdir) 940 - return 0; 941 - 942 - bo->hdev = kobject_get(bo->sdir->parent); 943 - if (!bo->hdev) 944 - goto fail_put_sdir; 945 - 946 - bo->sdev = kobject_get(&part_to_dev(bdev->bd_part)->kobj); 947 - if (!bo->sdev) 948 - goto fail_put_hdev; 949 - 950 - bo->hdir = kobject_get(bdev->bd_part->holder_dir); 951 - if (!bo->hdir) 952 - goto fail_put_sdev; 953 - 954 - return 1; 955 - 956 - fail_put_sdev: 957 - kobject_put(bo->sdev); 958 - fail_put_hdev: 959 - kobject_put(bo->hdev); 960 - fail_put_sdir: 961 - kobject_put(bo->sdir); 962 - 963 - return 0; 964 - } 965 - 966 - /* Put references of related kobjects at once. */ 967 - static void bd_holder_release_dirs(struct bd_holder *bo) 968 - { 969 - kobject_put(bo->hdir); 970 - kobject_put(bo->sdev); 971 - kobject_put(bo->hdev); 972 - kobject_put(bo->sdir); 973 - } 974 - 975 - static struct bd_holder *alloc_bd_holder(struct kobject *kobj) 976 - { 977 - struct bd_holder *bo; 978 - 979 - bo = kzalloc(sizeof(*bo), GFP_KERNEL); 980 - if (!bo) 981 - return NULL; 982 - 983 - bo->count = 1; 984 - bo->sdir = kobj; 985 - 986 - return bo; 987 - } 988 - 989 - static void free_bd_holder(struct bd_holder *bo) 990 - { 991 - kfree(bo); 992 - } 993 - 994 789 /** 995 - * find_bd_holder - find matching struct bd_holder from the block device 790 + * bd_link_disk_holder - create symlinks between holding disk and slave bdev 791 + * @bdev: the claimed slave bdev 792 + * @disk: the holding disk 996 793 * 997 - * @bdev: struct block device to be searched 998 - * @bo: target struct bd_holder 794 + * This functions creates the following sysfs symlinks. 999 795 * 1000 - * Returns matching entry with @bo in @bdev->bd_holder_list. 1001 - * If found, increment the reference count and return the pointer. 1002 - * If not found, returns NULL. 796 + * - from "slaves" directory of the holder @disk to the claimed @bdev 797 + * - from "holders" directory of the @bdev to the holder @disk 798 + * 799 + * For example, if /dev/dm-0 maps to /dev/sda and disk for dm-0 is 800 + * passed to bd_link_disk_holder(), then: 801 + * 802 + * /sys/block/dm-0/slaves/sda --> /sys/block/sda 803 + * /sys/block/sda/holders/dm-0 --> /sys/block/dm-0 804 + * 805 + * The caller must have claimed @bdev before calling this function and 806 + * ensure that both @bdev and @disk are valid during the creation and 807 + * lifetime of these symlinks. 808 + * 809 + * CONTEXT: 810 + * Might sleep. 811 + * 812 + * RETURNS: 813 + * 0 on success, -errno on failure. 1003 814 */ 1004 - static struct bd_holder *find_bd_holder(struct block_device *bdev, 1005 - struct bd_holder *bo) 815 + int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk) 1006 816 { 1007 - struct bd_holder *tmp; 1008 - 1009 - list_for_each_entry(tmp, &bdev->bd_holder_list, list) 1010 - if (tmp->sdir == bo->sdir) { 1011 - tmp->count++; 1012 - return tmp; 1013 - } 1014 - 1015 - return NULL; 1016 - } 1017 - 1018 - /** 1019 - * add_bd_holder - create sysfs symlinks for bd_claim() relationship 1020 - * 1021 - * @bdev: block device to be bd_claimed 1022 - * @bo: preallocated and initialized by alloc_bd_holder() 1023 - * 1024 - * Add @bo to @bdev->bd_holder_list, create symlinks. 1025 - * 1026 - * Returns 0 if symlinks are created. 1027 - * Returns -ve if something fails. 1028 - */ 1029 - static int add_bd_holder(struct block_device *bdev, struct bd_holder *bo) 1030 - { 1031 - int err; 1032 - 1033 - if (!bo) 1034 - return -EINVAL; 1035 - 1036 - if (!bd_holder_grab_dirs(bdev, bo)) 1037 - return -EBUSY; 1038 - 1039 - err = add_symlink(bo->sdir, bo->sdev); 1040 - if (err) 1041 - return err; 1042 - 1043 - err = add_symlink(bo->hdir, bo->hdev); 1044 - if (err) { 1045 - del_symlink(bo->sdir, bo->sdev); 1046 - return err; 1047 - } 1048 - 1049 - list_add_tail(&bo->list, &bdev->bd_holder_list); 1050 - return 0; 1051 - } 1052 - 1053 - /** 1054 - * del_bd_holder - delete sysfs symlinks for bd_claim() relationship 1055 - * 1056 - * @bdev: block device to be bd_claimed 1057 - * @kobj: holder's kobject 1058 - * 1059 - * If there is matching entry with @kobj in @bdev->bd_holder_list 1060 - * and no other bd_claim() from the same kobject, 1061 - * remove the struct bd_holder from the list, delete symlinks for it. 1062 - * 1063 - * Returns a pointer to the struct bd_holder when it's removed from the list 1064 - * and ready to be freed. 1065 - * Returns NULL if matching claim isn't found or there is other bd_claim() 1066 - * by the same kobject. 1067 - */ 1068 - static struct bd_holder *del_bd_holder(struct block_device *bdev, 1069 - struct kobject *kobj) 1070 - { 1071 - struct bd_holder *bo; 1072 - 1073 - list_for_each_entry(bo, &bdev->bd_holder_list, list) { 1074 - if (bo->sdir == kobj) { 1075 - bo->count--; 1076 - BUG_ON(bo->count < 0); 1077 - if (!bo->count) { 1078 - list_del(&bo->list); 1079 - del_symlink(bo->sdir, bo->sdev); 1080 - del_symlink(bo->hdir, bo->hdev); 1081 - bd_holder_release_dirs(bo); 1082 - return bo; 1083 - } 1084 - break; 1085 - } 1086 - } 1087 - 1088 - return NULL; 1089 - } 1090 - 1091 - /** 1092 - * bd_claim_by_kobject - bd_claim() with additional kobject signature 1093 - * 1094 - * @bdev: block device to be claimed 1095 - * @holder: holder's signature 1096 - * @kobj: holder's kobject 1097 - * 1098 - * Do bd_claim() and if it succeeds, create sysfs symlinks between 1099 - * the bdev and the holder's kobject. 1100 - * Use bd_release_from_kobject() when relesing the claimed bdev. 1101 - * 1102 - * Returns 0 on success. (same as bd_claim()) 1103 - * Returns errno on failure. 1104 - */ 1105 - static int bd_claim_by_kobject(struct block_device *bdev, void *holder, 1106 - struct kobject *kobj) 1107 - { 1108 - int err; 1109 - struct bd_holder *bo, *found; 1110 - 1111 - if (!kobj) 1112 - return -EINVAL; 1113 - 1114 - bo = alloc_bd_holder(kobj); 1115 - if (!bo) 1116 - return -ENOMEM; 817 + int ret = 0; 1117 818 1118 819 mutex_lock(&bdev->bd_mutex); 1119 820 1120 - err = bd_claim(bdev, holder); 1121 - if (err) 1122 - goto fail; 821 + WARN_ON_ONCE(!bdev->bd_holder || bdev->bd_holder_disk); 1123 822 1124 - found = find_bd_holder(bdev, bo); 1125 - if (found) 1126 - goto fail; 823 + /* FIXME: remove the following once add_disk() handles errors */ 824 + if (WARN_ON(!disk->slave_dir || !bdev->bd_part->holder_dir)) 825 + goto out_unlock; 1127 826 1128 - err = add_bd_holder(bdev, bo); 1129 - if (err) 1130 - bd_release(bdev); 1131 - else 1132 - bo = NULL; 1133 - fail: 827 + ret = add_symlink(disk->slave_dir, &part_to_dev(bdev->bd_part)->kobj); 828 + if (ret) 829 + goto out_unlock; 830 + 831 + ret = add_symlink(bdev->bd_part->holder_dir, &disk_to_dev(disk)->kobj); 832 + if (ret) { 833 + del_symlink(disk->slave_dir, &part_to_dev(bdev->bd_part)->kobj); 834 + goto out_unlock; 835 + } 836 + 837 + bdev->bd_holder_disk = disk; 838 + out_unlock: 1134 839 mutex_unlock(&bdev->bd_mutex); 1135 - free_bd_holder(bo); 1136 - return err; 840 + return ret; 1137 841 } 842 + EXPORT_SYMBOL_GPL(bd_link_disk_holder); 1138 843 1139 - /** 1140 - * bd_release_from_kobject - bd_release() with additional kobject signature 1141 - * 1142 - * @bdev: block device to be released 1143 - * @kobj: holder's kobject 1144 - * 1145 - * Do bd_release() and remove sysfs symlinks created by bd_claim_by_kobject(). 1146 - */ 1147 - static void bd_release_from_kobject(struct block_device *bdev, 1148 - struct kobject *kobj) 844 + static void bd_unlink_disk_holder(struct block_device *bdev) 1149 845 { 1150 - if (!kobj) 846 + struct gendisk *disk = bdev->bd_holder_disk; 847 + 848 + bdev->bd_holder_disk = NULL; 849 + if (!disk) 1151 850 return; 1152 851 1153 - mutex_lock(&bdev->bd_mutex); 1154 - bd_release(bdev); 1155 - free_bd_holder(del_bd_holder(bdev, kobj)); 1156 - mutex_unlock(&bdev->bd_mutex); 852 + del_symlink(disk->slave_dir, &part_to_dev(bdev->bd_part)->kobj); 853 + del_symlink(bdev->bd_part->holder_dir, &disk_to_dev(disk)->kobj); 1157 854 } 1158 - 1159 - /** 1160 - * bd_claim_by_disk - wrapper function for bd_claim_by_kobject() 1161 - * 1162 - * @bdev: block device to be claimed 1163 - * @holder: holder's signature 1164 - * @disk: holder's gendisk 1165 - * 1166 - * Call bd_claim_by_kobject() with getting @disk->slave_dir. 1167 - */ 1168 - int bd_claim_by_disk(struct block_device *bdev, void *holder, 1169 - struct gendisk *disk) 1170 - { 1171 - return bd_claim_by_kobject(bdev, holder, kobject_get(disk->slave_dir)); 1172 - } 1173 - EXPORT_SYMBOL_GPL(bd_claim_by_disk); 1174 - 1175 - /** 1176 - * bd_release_from_disk - wrapper function for bd_release_from_kobject() 1177 - * 1178 - * @bdev: block device to be claimed 1179 - * @disk: holder's gendisk 1180 - * 1181 - * Call bd_release_from_kobject() and put @disk->slave_dir. 1182 - */ 1183 - void bd_release_from_disk(struct block_device *bdev, struct gendisk *disk) 1184 - { 1185 - bd_release_from_kobject(bdev, disk->slave_dir); 1186 - kobject_put(disk->slave_dir); 1187 - } 1188 - EXPORT_SYMBOL_GPL(bd_release_from_disk); 855 + #else 856 + static inline void bd_unlink_disk_holder(struct block_device *bdev) 857 + { } 1189 858 #endif 1190 - 1191 - /* 1192 - * Tries to open block device by device number. Use it ONLY if you 1193 - * really do not have anything better - i.e. when you are behind a 1194 - * truly sucky interface and all you are given is a device number. _Never_ 1195 - * to be used for internal purposes. If you ever need it - reconsider 1196 - * your API. 1197 - */ 1198 - struct block_device *open_by_devnum(dev_t dev, fmode_t mode) 1199 - { 1200 - struct block_device *bdev = bdget(dev); 1201 - int err = -ENOMEM; 1202 - if (bdev) 1203 - err = blkdev_get(bdev, mode); 1204 - return err ? ERR_PTR(err) : bdev; 1205 - } 1206 - 1207 - EXPORT_SYMBOL(open_by_devnum); 1208 859 1209 860 /** 1210 861 * flush_disk - invalidates all buffer-cache entries on a disk ··· 1114 1469 return ret; 1115 1470 } 1116 1471 1117 - int blkdev_get(struct block_device *bdev, fmode_t mode) 1472 + /** 1473 + * blkdev_get - open a block device 1474 + * @bdev: block_device to open 1475 + * @mode: FMODE_* mask 1476 + * @holder: exclusive holder identifier 1477 + * 1478 + * Open @bdev with @mode. If @mode includes %FMODE_EXCL, @bdev is 1479 + * open with exclusive access. Specifying %FMODE_EXCL with %NULL 1480 + * @holder is invalid. Exclusive opens may nest for the same @holder. 1481 + * 1482 + * On success, the reference count of @bdev is unchanged. On failure, 1483 + * @bdev is put. 1484 + * 1485 + * CONTEXT: 1486 + * Might sleep. 1487 + * 1488 + * RETURNS: 1489 + * 0 on success, -errno on failure. 1490 + */ 1491 + int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder) 1118 1492 { 1119 - return __blkdev_get(bdev, mode, 0); 1493 + struct block_device *whole = NULL; 1494 + int res; 1495 + 1496 + WARN_ON_ONCE((mode & FMODE_EXCL) && !holder); 1497 + 1498 + if ((mode & FMODE_EXCL) && holder) { 1499 + whole = bd_start_claiming(bdev, holder); 1500 + if (IS_ERR(whole)) { 1501 + bdput(bdev); 1502 + return PTR_ERR(whole); 1503 + } 1504 + } 1505 + 1506 + res = __blkdev_get(bdev, mode, 0); 1507 + 1508 + /* __blkdev_get() may alter read only status, check it afterwards */ 1509 + if (!res && (mode & FMODE_WRITE) && bdev_read_only(bdev)) { 1510 + __blkdev_put(bdev, mode, 0); 1511 + res = -EACCES; 1512 + } 1513 + 1514 + if (whole) { 1515 + /* finish claiming */ 1516 + spin_lock(&bdev_lock); 1517 + 1518 + if (res == 0) { 1519 + BUG_ON(!bd_may_claim(bdev, whole, holder)); 1520 + /* 1521 + * Note that for a whole device bd_holders 1522 + * will be incremented twice, and bd_holder 1523 + * will be set to bd_may_claim before being 1524 + * set to holder 1525 + */ 1526 + whole->bd_holders++; 1527 + whole->bd_holder = bd_may_claim; 1528 + bdev->bd_holders++; 1529 + bdev->bd_holder = holder; 1530 + } 1531 + 1532 + /* tell others that we're done */ 1533 + BUG_ON(whole->bd_claiming != holder); 1534 + whole->bd_claiming = NULL; 1535 + wake_up_bit(&whole->bd_claiming, 0); 1536 + 1537 + spin_unlock(&bdev_lock); 1538 + bdput(whole); 1539 + } 1540 + 1541 + return res; 1120 1542 } 1121 1543 EXPORT_SYMBOL(blkdev_get); 1122 1544 1545 + /** 1546 + * blkdev_get_by_path - open a block device by name 1547 + * @path: path to the block device to open 1548 + * @mode: FMODE_* mask 1549 + * @holder: exclusive holder identifier 1550 + * 1551 + * Open the blockdevice described by the device file at @path. @mode 1552 + * and @holder are identical to blkdev_get(). 1553 + * 1554 + * On success, the returned block_device has reference count of one. 1555 + * 1556 + * CONTEXT: 1557 + * Might sleep. 1558 + * 1559 + * RETURNS: 1560 + * Pointer to block_device on success, ERR_PTR(-errno) on failure. 1561 + */ 1562 + struct block_device *blkdev_get_by_path(const char *path, fmode_t mode, 1563 + void *holder) 1564 + { 1565 + struct block_device *bdev; 1566 + int err; 1567 + 1568 + bdev = lookup_bdev(path); 1569 + if (IS_ERR(bdev)) 1570 + return bdev; 1571 + 1572 + err = blkdev_get(bdev, mode, holder); 1573 + if (err) 1574 + return ERR_PTR(err); 1575 + 1576 + return bdev; 1577 + } 1578 + EXPORT_SYMBOL(blkdev_get_by_path); 1579 + 1580 + /** 1581 + * blkdev_get_by_dev - open a block device by device number 1582 + * @dev: device number of block device to open 1583 + * @mode: FMODE_* mask 1584 + * @holder: exclusive holder identifier 1585 + * 1586 + * Open the blockdevice described by device number @dev. @mode and 1587 + * @holder are identical to blkdev_get(). 1588 + * 1589 + * Use it ONLY if you really do not have anything better - i.e. when 1590 + * you are behind a truly sucky interface and all you are given is a 1591 + * device number. _Never_ to be used for internal purposes. If you 1592 + * ever need it - reconsider your API. 1593 + * 1594 + * On success, the returned block_device has reference count of one. 1595 + * 1596 + * CONTEXT: 1597 + * Might sleep. 1598 + * 1599 + * RETURNS: 1600 + * Pointer to block_device on success, ERR_PTR(-errno) on failure. 1601 + */ 1602 + struct block_device *blkdev_get_by_dev(dev_t dev, fmode_t mode, void *holder) 1603 + { 1604 + struct block_device *bdev; 1605 + int err; 1606 + 1607 + bdev = bdget(dev); 1608 + if (!bdev) 1609 + return ERR_PTR(-ENOMEM); 1610 + 1611 + err = blkdev_get(bdev, mode, holder); 1612 + if (err) 1613 + return ERR_PTR(err); 1614 + 1615 + return bdev; 1616 + } 1617 + EXPORT_SYMBOL(blkdev_get_by_dev); 1618 + 1123 1619 static int blkdev_open(struct inode * inode, struct file * filp) 1124 1620 { 1125 - struct block_device *whole = NULL; 1126 1621 struct block_device *bdev; 1127 - int res; 1128 1622 1129 1623 /* 1130 1624 * Preserve backwards compatibility and allow large file access ··· 1284 1500 if (bdev == NULL) 1285 1501 return -ENOMEM; 1286 1502 1287 - if (filp->f_mode & FMODE_EXCL) { 1288 - whole = bd_start_claiming(bdev, filp); 1289 - if (IS_ERR(whole)) { 1290 - bdput(bdev); 1291 - return PTR_ERR(whole); 1292 - } 1293 - } 1294 - 1295 1503 filp->f_mapping = bdev->bd_inode->i_mapping; 1296 1504 1297 - res = blkdev_get(bdev, filp->f_mode); 1298 - 1299 - if (whole) { 1300 - if (res == 0) 1301 - bd_finish_claiming(bdev, whole, filp); 1302 - else 1303 - bd_abort_claiming(whole, filp); 1304 - } 1305 - 1306 - return res; 1505 + return blkdev_get(bdev, filp->f_mode, filp); 1307 1506 } 1308 1507 1309 1508 static int __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part) ··· 1300 1533 bdev->bd_part_count--; 1301 1534 1302 1535 if (!--bdev->bd_openers) { 1536 + WARN_ON_ONCE(bdev->bd_holders); 1303 1537 sync_blockdev(bdev); 1304 1538 kill_bdev(bdev); 1305 1539 } ··· 1331 1563 1332 1564 int blkdev_put(struct block_device *bdev, fmode_t mode) 1333 1565 { 1566 + if (mode & FMODE_EXCL) { 1567 + bool bdev_free; 1568 + 1569 + /* 1570 + * Release a claim on the device. The holder fields 1571 + * are protected with bdev_lock. bd_mutex is to 1572 + * synchronize disk_holder unlinking. 1573 + */ 1574 + mutex_lock(&bdev->bd_mutex); 1575 + spin_lock(&bdev_lock); 1576 + 1577 + WARN_ON_ONCE(--bdev->bd_holders < 0); 1578 + WARN_ON_ONCE(--bdev->bd_contains->bd_holders < 0); 1579 + 1580 + /* bd_contains might point to self, check in a separate step */ 1581 + if ((bdev_free = !bdev->bd_holders)) 1582 + bdev->bd_holder = NULL; 1583 + if (!bdev->bd_contains->bd_holders) 1584 + bdev->bd_contains->bd_holder = NULL; 1585 + 1586 + spin_unlock(&bdev_lock); 1587 + 1588 + /* if this was the last claim, holder link should go too */ 1589 + if (bdev_free) 1590 + bd_unlink_disk_holder(bdev); 1591 + 1592 + mutex_unlock(&bdev->bd_mutex); 1593 + } 1334 1594 return __blkdev_put(bdev, mode, 0); 1335 1595 } 1336 1596 EXPORT_SYMBOL(blkdev_put); ··· 1366 1570 static int blkdev_close(struct inode * inode, struct file * filp) 1367 1571 { 1368 1572 struct block_device *bdev = I_BDEV(filp->f_mapping->host); 1369 - if (bdev->bd_holder == filp) 1370 - bd_release(bdev); 1573 + 1371 1574 return blkdev_put(bdev, filp->f_mode); 1372 1575 } 1373 1576 ··· 1510 1715 goto out; 1511 1716 } 1512 1717 EXPORT_SYMBOL(lookup_bdev); 1513 - 1514 - /** 1515 - * open_bdev_exclusive - open a block device by name and set it up for use 1516 - * 1517 - * @path: special file representing the block device 1518 - * @mode: FMODE_... combination to pass be used 1519 - * @holder: owner for exclusion 1520 - * 1521 - * Open the blockdevice described by the special file at @path, claim it 1522 - * for the @holder. 1523 - */ 1524 - struct block_device *open_bdev_exclusive(const char *path, fmode_t mode, void *holder) 1525 - { 1526 - struct block_device *bdev, *whole; 1527 - int error; 1528 - 1529 - bdev = lookup_bdev(path); 1530 - if (IS_ERR(bdev)) 1531 - return bdev; 1532 - 1533 - whole = bd_start_claiming(bdev, holder); 1534 - if (IS_ERR(whole)) { 1535 - bdput(bdev); 1536 - return whole; 1537 - } 1538 - 1539 - error = blkdev_get(bdev, mode); 1540 - if (error) 1541 - goto out_abort_claiming; 1542 - 1543 - error = -EACCES; 1544 - if ((mode & FMODE_WRITE) && bdev_read_only(bdev)) 1545 - goto out_blkdev_put; 1546 - 1547 - bd_finish_claiming(bdev, whole, holder); 1548 - return bdev; 1549 - 1550 - out_blkdev_put: 1551 - blkdev_put(bdev, mode); 1552 - out_abort_claiming: 1553 - bd_abort_claiming(whole, holder); 1554 - return ERR_PTR(error); 1555 - } 1556 - 1557 - EXPORT_SYMBOL(open_bdev_exclusive); 1558 - 1559 - /** 1560 - * close_bdev_exclusive - close a blockdevice opened by open_bdev_exclusive() 1561 - * 1562 - * @bdev: blockdevice to close 1563 - * @mode: mode, must match that used to open. 1564 - * 1565 - * This is the counterpart to open_bdev_exclusive(). 1566 - */ 1567 - void close_bdev_exclusive(struct block_device *bdev, fmode_t mode) 1568 - { 1569 - bd_release(bdev); 1570 - blkdev_put(bdev, mode); 1571 - } 1572 - 1573 - EXPORT_SYMBOL(close_bdev_exclusive); 1574 1718 1575 1719 int __invalidate_device(struct block_device *bdev) 1576 1720 {
+16 -12
fs/btrfs/volumes.c
··· 489 489 continue; 490 490 491 491 if (device->bdev) { 492 - close_bdev_exclusive(device->bdev, device->mode); 492 + blkdev_put(device->bdev, device->mode); 493 493 device->bdev = NULL; 494 494 fs_devices->open_devices--; 495 495 } ··· 523 523 524 524 list_for_each_entry(device, &fs_devices->devices, dev_list) { 525 525 if (device->bdev) { 526 - close_bdev_exclusive(device->bdev, device->mode); 526 + blkdev_put(device->bdev, device->mode); 527 527 fs_devices->open_devices--; 528 528 } 529 529 if (device->writeable) { ··· 580 580 int seeding = 1; 581 581 int ret = 0; 582 582 583 + flags |= FMODE_EXCL; 584 + 583 585 list_for_each_entry(device, head, dev_list) { 584 586 if (device->bdev) 585 587 continue; 586 588 if (!device->name) 587 589 continue; 588 590 589 - bdev = open_bdev_exclusive(device->name, flags, holder); 591 + bdev = blkdev_get_by_path(device->name, flags, holder); 590 592 if (IS_ERR(bdev)) { 591 593 printk(KERN_INFO "open %s failed\n", device->name); 592 594 goto error; ··· 640 638 error_brelse: 641 639 brelse(bh); 642 640 error_close: 643 - close_bdev_exclusive(bdev, FMODE_READ); 641 + blkdev_put(bdev, flags); 644 642 error: 645 643 continue; 646 644 } ··· 686 684 687 685 mutex_lock(&uuid_mutex); 688 686 689 - bdev = open_bdev_exclusive(path, flags, holder); 687 + flags |= FMODE_EXCL; 688 + bdev = blkdev_get_by_path(path, flags, holder); 690 689 691 690 if (IS_ERR(bdev)) { 692 691 ret = PTR_ERR(bdev); ··· 719 716 720 717 brelse(bh); 721 718 error_close: 722 - close_bdev_exclusive(bdev, flags); 719 + blkdev_put(bdev, flags); 723 720 error: 724 721 mutex_unlock(&uuid_mutex); 725 722 return ret; ··· 1182 1179 goto out; 1183 1180 } 1184 1181 } else { 1185 - bdev = open_bdev_exclusive(device_path, FMODE_READ, 1186 - root->fs_info->bdev_holder); 1182 + bdev = blkdev_get_by_path(device_path, FMODE_READ | FMODE_EXCL, 1183 + root->fs_info->bdev_holder); 1187 1184 if (IS_ERR(bdev)) { 1188 1185 ret = PTR_ERR(bdev); 1189 1186 goto out; ··· 1247 1244 root->fs_info->fs_devices->latest_bdev = next_device->bdev; 1248 1245 1249 1246 if (device->bdev) { 1250 - close_bdev_exclusive(device->bdev, device->mode); 1247 + blkdev_put(device->bdev, device->mode); 1251 1248 device->bdev = NULL; 1252 1249 device->fs_devices->open_devices--; 1253 1250 } ··· 1290 1287 brelse(bh); 1291 1288 error_close: 1292 1289 if (bdev) 1293 - close_bdev_exclusive(bdev, FMODE_READ); 1290 + blkdev_put(bdev, FMODE_READ | FMODE_EXCL); 1294 1291 out: 1295 1292 mutex_unlock(&root->fs_info->volume_mutex); 1296 1293 mutex_unlock(&uuid_mutex); ··· 1442 1439 if ((sb->s_flags & MS_RDONLY) && !root->fs_info->fs_devices->seeding) 1443 1440 return -EINVAL; 1444 1441 1445 - bdev = open_bdev_exclusive(device_path, 0, root->fs_info->bdev_holder); 1442 + bdev = blkdev_get_by_path(device_path, FMODE_EXCL, 1443 + root->fs_info->bdev_holder); 1446 1444 if (IS_ERR(bdev)) 1447 1445 return PTR_ERR(bdev); 1448 1446 ··· 1569 1565 mutex_unlock(&root->fs_info->volume_mutex); 1570 1566 return ret; 1571 1567 error: 1572 - close_bdev_exclusive(bdev, 0); 1568 + blkdev_put(bdev, FMODE_EXCL); 1573 1569 if (seeding_dev) { 1574 1570 mutex_unlock(&uuid_mutex); 1575 1571 up_write(&sb->s_umount);
+1 -1
fs/btrfs/volumes.h
··· 49 49 50 50 struct block_device *bdev; 51 51 52 - /* the mode sent to open_bdev_exclusive */ 52 + /* the mode sent to blkdev_get */ 53 53 fmode_t mode; 54 54 55 55 char *name;
+2 -10
fs/ext3/super.c
··· 347 347 struct block_device *bdev; 348 348 char b[BDEVNAME_SIZE]; 349 349 350 - bdev = open_by_devnum(dev, FMODE_READ|FMODE_WRITE); 350 + bdev = blkdev_get_by_dev(dev, FMODE_READ|FMODE_WRITE|FMODE_EXCL, sb); 351 351 if (IS_ERR(bdev)) 352 352 goto fail; 353 353 return bdev; ··· 364 364 */ 365 365 static int ext3_blkdev_put(struct block_device *bdev) 366 366 { 367 - bd_release(bdev); 368 - return blkdev_put(bdev, FMODE_READ|FMODE_WRITE); 367 + return blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL); 369 368 } 370 369 371 370 static int ext3_blkdev_remove(struct ext3_sb_info *sbi) ··· 2134 2135 bdev = ext3_blkdev_get(j_dev, sb); 2135 2136 if (bdev == NULL) 2136 2137 return NULL; 2137 - 2138 - if (bd_claim(bdev, sb)) { 2139 - ext3_msg(sb, KERN_ERR, 2140 - "error: failed to claim external journal device"); 2141 - blkdev_put(bdev, FMODE_READ|FMODE_WRITE); 2142 - return NULL; 2143 - } 2144 2138 2145 2139 blocksize = sb->s_blocksize; 2146 2140 hblock = bdev_logical_block_size(bdev);
+2 -10
fs/ext4/super.c
··· 647 647 struct block_device *bdev; 648 648 char b[BDEVNAME_SIZE]; 649 649 650 - bdev = open_by_devnum(dev, FMODE_READ|FMODE_WRITE); 650 + bdev = blkdev_get_by_dev(dev, FMODE_READ|FMODE_WRITE|FMODE_EXCL, sb); 651 651 if (IS_ERR(bdev)) 652 652 goto fail; 653 653 return bdev; ··· 663 663 */ 664 664 static int ext4_blkdev_put(struct block_device *bdev) 665 665 { 666 - bd_release(bdev); 667 - return blkdev_put(bdev, FMODE_READ|FMODE_WRITE); 666 + return blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL); 668 667 } 669 668 670 669 static int ext4_blkdev_remove(struct ext4_sb_info *sbi) ··· 3756 3757 bdev = ext4_blkdev_get(j_dev, sb); 3757 3758 if (bdev == NULL) 3758 3759 return NULL; 3759 - 3760 - if (bd_claim(bdev, sb)) { 3761 - ext4_msg(sb, KERN_ERR, 3762 - "failed to claim external journal device"); 3763 - blkdev_put(bdev, FMODE_READ|FMODE_WRITE); 3764 - return NULL; 3765 - } 3766 3760 3767 3761 blocksize = sb->s_blocksize; 3768 3762 hblock = bdev_logical_block_size(bdev);
+4 -4
fs/gfs2/ops_fstype.c
··· 1268 1268 { 1269 1269 struct block_device *bdev; 1270 1270 struct super_block *s; 1271 - fmode_t mode = FMODE_READ; 1271 + fmode_t mode = FMODE_READ | FMODE_EXCL; 1272 1272 int error; 1273 1273 struct gfs2_args args; 1274 1274 struct gfs2_sbd *sdp; ··· 1276 1276 if (!(flags & MS_RDONLY)) 1277 1277 mode |= FMODE_WRITE; 1278 1278 1279 - bdev = open_bdev_exclusive(dev_name, mode, fs_type); 1279 + bdev = blkdev_get_by_path(dev_name, mode, fs_type); 1280 1280 if (IS_ERR(bdev)) 1281 1281 return ERR_CAST(bdev); 1282 1282 ··· 1298 1298 goto error_bdev; 1299 1299 1300 1300 if (s->s_root) 1301 - close_bdev_exclusive(bdev, mode); 1301 + blkdev_put(bdev, mode); 1302 1302 1303 1303 memset(&args, 0, sizeof(args)); 1304 1304 args.ar_quota = GFS2_QUOTA_DEFAULT; ··· 1342 1342 deactivate_locked_super(s); 1343 1343 return ERR_PTR(error); 1344 1344 error_bdev: 1345 - close_bdev_exclusive(bdev, mode); 1345 + blkdev_put(bdev, mode); 1346 1346 return ERR_PTR(error); 1347 1347 } 1348 1348
+5 -12
fs/jfs/jfs_logmgr.c
··· 1120 1120 * file systems to log may have n-to-1 relationship; 1121 1121 */ 1122 1122 1123 - bdev = open_by_devnum(sbi->logdev, FMODE_READ|FMODE_WRITE); 1123 + bdev = blkdev_get_by_dev(sbi->logdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL, 1124 + log); 1124 1125 if (IS_ERR(bdev)) { 1125 1126 rc = -PTR_ERR(bdev); 1126 1127 goto free; 1127 - } 1128 - 1129 - if ((rc = bd_claim(bdev, log))) { 1130 - goto close; 1131 1128 } 1132 1129 1133 1130 log->bdev = bdev; ··· 1134 1137 * initialize log: 1135 1138 */ 1136 1139 if ((rc = lmLogInit(log))) 1137 - goto unclaim; 1140 + goto close; 1138 1141 1139 1142 list_add(&log->journal_list, &jfs_external_logs); 1140 1143 ··· 1160 1163 list_del(&log->journal_list); 1161 1164 lbmLogShutdown(log); 1162 1165 1163 - unclaim: 1164 - bd_release(bdev); 1165 - 1166 1166 close: /* close external log device */ 1167 - blkdev_put(bdev, FMODE_READ|FMODE_WRITE); 1167 + blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL); 1168 1168 1169 1169 free: /* free log descriptor */ 1170 1170 mutex_unlock(&jfs_log_mutex); ··· 1506 1512 bdev = log->bdev; 1507 1513 rc = lmLogShutdown(log); 1508 1514 1509 - bd_release(bdev); 1510 - blkdev_put(bdev, FMODE_READ|FMODE_WRITE); 1515 + blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL); 1511 1516 1512 1517 kfree(log); 1513 1518
+4 -3
fs/logfs/dev_bdev.c
··· 300 300 301 301 static void bdev_put_device(struct logfs_super *s) 302 302 { 303 - close_bdev_exclusive(s->s_bdev, FMODE_READ|FMODE_WRITE); 303 + blkdev_put(s->s_bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL); 304 304 } 305 305 306 306 static int bdev_can_write_buf(struct super_block *sb, u64 ofs) ··· 325 325 { 326 326 struct block_device *bdev; 327 327 328 - bdev = open_bdev_exclusive(devname, FMODE_READ|FMODE_WRITE, type); 328 + bdev = blkdev_get_by_path(devname, FMODE_READ|FMODE_WRITE|FMODE_EXCL, 329 + type); 329 330 if (IS_ERR(bdev)) 330 331 return PTR_ERR(bdev); 331 332 332 333 if (MAJOR(bdev->bd_dev) == MTD_BLOCK_MAJOR) { 333 334 int mtdnr = MINOR(bdev->bd_dev); 334 - close_bdev_exclusive(bdev, FMODE_READ|FMODE_WRITE); 335 + blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL); 335 336 return logfs_get_sb_mtd(p, mtdnr); 336 337 } 337 338
+4 -4
fs/nilfs2/super.c
··· 1147 1147 { 1148 1148 struct nilfs_super_data sd; 1149 1149 struct super_block *s; 1150 - fmode_t mode = FMODE_READ; 1150 + fmode_t mode = FMODE_READ | FMODE_EXCL; 1151 1151 struct dentry *root_dentry; 1152 1152 int err, s_new = false; 1153 1153 1154 1154 if (!(flags & MS_RDONLY)) 1155 1155 mode |= FMODE_WRITE; 1156 1156 1157 - sd.bdev = open_bdev_exclusive(dev_name, mode, fs_type); 1157 + sd.bdev = blkdev_get_by_path(dev_name, mode, fs_type); 1158 1158 if (IS_ERR(sd.bdev)) 1159 1159 return ERR_CAST(sd.bdev); 1160 1160 ··· 1233 1233 } 1234 1234 1235 1235 if (!s_new) 1236 - close_bdev_exclusive(sd.bdev, mode); 1236 + blkdev_put(sd.bdev, mode); 1237 1237 1238 1238 return root_dentry; 1239 1239 ··· 1242 1242 1243 1243 failed: 1244 1244 if (!s_new) 1245 - close_bdev_exclusive(sd.bdev, mode); 1245 + blkdev_put(sd.bdev, mode); 1246 1246 return ERR_PTR(err); 1247 1247 } 1248 1248
+1 -1
fs/ocfs2/cluster/heartbeat.c
··· 1674 1674 goto out; 1675 1675 1676 1676 reg->hr_bdev = I_BDEV(filp->f_mapping->host); 1677 - ret = blkdev_get(reg->hr_bdev, FMODE_WRITE | FMODE_READ); 1677 + ret = blkdev_get(reg->hr_bdev, FMODE_WRITE | FMODE_READ, NULL); 1678 1678 if (ret) { 1679 1679 reg->hr_bdev = NULL; 1680 1680 goto out;
+1 -1
fs/partitions/check.c
··· 558 558 goto exit; 559 559 560 560 bdev->bd_invalidated = 1; 561 - err = blkdev_get(bdev, FMODE_READ); 561 + err = blkdev_get(bdev, FMODE_READ, NULL); 562 562 if (err < 0) 563 563 goto exit; 564 564 blkdev_put(bdev, FMODE_READ);
+7 -14
fs/reiserfs/journal.c
··· 2552 2552 result = 0; 2553 2553 2554 2554 if (journal->j_dev_bd != NULL) { 2555 - if (journal->j_dev_bd->bd_dev != super->s_dev) 2556 - bd_release(journal->j_dev_bd); 2557 2555 result = blkdev_put(journal->j_dev_bd, journal->j_dev_mode); 2558 2556 journal->j_dev_bd = NULL; 2559 2557 } ··· 2569 2571 { 2570 2572 int result; 2571 2573 dev_t jdev; 2572 - fmode_t blkdev_mode = FMODE_READ | FMODE_WRITE; 2574 + fmode_t blkdev_mode = FMODE_READ | FMODE_WRITE | FMODE_EXCL; 2573 2575 char b[BDEVNAME_SIZE]; 2574 2576 2575 2577 result = 0; ··· 2583 2585 2584 2586 /* there is no "jdev" option and journal is on separate device */ 2585 2587 if ((!jdev_name || !jdev_name[0])) { 2586 - journal->j_dev_bd = open_by_devnum(jdev, blkdev_mode); 2588 + if (jdev == super->s_dev) 2589 + blkdev_mode &= ~FMODE_EXCL; 2590 + journal->j_dev_bd = blkdev_get_by_dev(jdev, blkdev_mode, 2591 + journal); 2587 2592 journal->j_dev_mode = blkdev_mode; 2588 2593 if (IS_ERR(journal->j_dev_bd)) { 2589 2594 result = PTR_ERR(journal->j_dev_bd); ··· 2595 2594 "cannot init journal device '%s': %i", 2596 2595 __bdevname(jdev, b), result); 2597 2596 return result; 2598 - } else if (jdev != super->s_dev) { 2599 - result = bd_claim(journal->j_dev_bd, journal); 2600 - if (result) { 2601 - blkdev_put(journal->j_dev_bd, blkdev_mode); 2602 - return result; 2603 - } 2604 - 2597 + } else if (jdev != super->s_dev) 2605 2598 set_blocksize(journal->j_dev_bd, super->s_blocksize); 2606 - } 2607 2599 2608 2600 return 0; 2609 2601 } 2610 2602 2611 2603 journal->j_dev_mode = blkdev_mode; 2612 - journal->j_dev_bd = open_bdev_exclusive(jdev_name, 2613 - blkdev_mode, journal); 2604 + journal->j_dev_bd = blkdev_get_by_path(jdev_name, blkdev_mode, journal); 2614 2605 if (IS_ERR(journal->j_dev_bd)) { 2615 2606 result = PTR_ERR(journal->j_dev_bd); 2616 2607 journal->j_dev_bd = NULL;
+10 -9
fs/super.c
··· 766 766 { 767 767 struct block_device *bdev; 768 768 struct super_block *s; 769 - fmode_t mode = FMODE_READ; 769 + fmode_t mode = FMODE_READ | FMODE_EXCL; 770 770 int error = 0; 771 771 772 772 if (!(flags & MS_RDONLY)) 773 773 mode |= FMODE_WRITE; 774 774 775 - bdev = open_bdev_exclusive(dev_name, mode, fs_type); 775 + bdev = blkdev_get_by_path(dev_name, mode, fs_type); 776 776 if (IS_ERR(bdev)) 777 777 return ERR_CAST(bdev); 778 778 ··· 801 801 802 802 /* 803 803 * s_umount nests inside bd_mutex during 804 - * __invalidate_device(). close_bdev_exclusive() 805 - * acquires bd_mutex and can't be called under 806 - * s_umount. Drop s_umount temporarily. This is safe 807 - * as we're holding an active reference. 804 + * __invalidate_device(). blkdev_put() acquires 805 + * bd_mutex and can't be called under s_umount. Drop 806 + * s_umount temporarily. This is safe as we're 807 + * holding an active reference. 808 808 */ 809 809 up_write(&s->s_umount); 810 - close_bdev_exclusive(bdev, mode); 810 + blkdev_put(bdev, mode); 811 811 down_write(&s->s_umount); 812 812 } else { 813 813 char b[BDEVNAME_SIZE]; ··· 831 831 error_s: 832 832 error = PTR_ERR(s); 833 833 error_bdev: 834 - close_bdev_exclusive(bdev, mode); 834 + blkdev_put(bdev, mode); 835 835 error: 836 836 return ERR_PTR(error); 837 837 } ··· 862 862 bdev->bd_super = NULL; 863 863 generic_shutdown_super(sb); 864 864 sync_blockdev(bdev); 865 - close_bdev_exclusive(bdev, mode); 865 + WARN_ON_ONCE(!(mode & FMODE_EXCL)); 866 + blkdev_put(bdev, mode | FMODE_EXCL); 866 867 } 867 868 868 869 EXPORT_SYMBOL(kill_block_super);
+3 -2
fs/xfs/linux-2.6/xfs_super.c
··· 606 606 { 607 607 int error = 0; 608 608 609 - *bdevp = open_bdev_exclusive(name, FMODE_READ|FMODE_WRITE, mp); 609 + *bdevp = blkdev_get_by_path(name, FMODE_READ|FMODE_WRITE|FMODE_EXCL, 610 + mp); 610 611 if (IS_ERR(*bdevp)) { 611 612 error = PTR_ERR(*bdevp); 612 613 printk("XFS: Invalid device [%s], error=%d\n", name, error); ··· 621 620 struct block_device *bdev) 622 621 { 623 622 if (bdev) 624 - close_bdev_exclusive(bdev, FMODE_READ|FMODE_WRITE); 623 + blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL); 625 624 } 626 625 627 626 /*
+13 -12
include/linux/fs.h
··· 663 663 void * bd_holder; 664 664 int bd_holders; 665 665 #ifdef CONFIG_SYSFS 666 - struct list_head bd_holder_list; 666 + struct gendisk * bd_holder_disk; /* for sysfs slave linkng */ 667 667 #endif 668 668 struct block_device * bd_contains; 669 669 unsigned bd_block_size; ··· 2006 2006 extern void bd_set_size(struct block_device *, loff_t size); 2007 2007 extern void bd_forget(struct inode *inode); 2008 2008 extern void bdput(struct block_device *); 2009 - extern struct block_device *open_by_devnum(dev_t, fmode_t); 2010 2009 extern void invalidate_bdev(struct block_device *); 2011 2010 extern int sync_blockdev(struct block_device *bdev); 2012 2011 extern struct super_block *freeze_bdev(struct block_device *); ··· 2036 2037 extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long); 2037 2038 extern int blkdev_ioctl(struct block_device *, fmode_t, unsigned, unsigned long); 2038 2039 extern long compat_blkdev_ioctl(struct file *, unsigned, unsigned long); 2039 - extern int blkdev_get(struct block_device *, fmode_t); 2040 - extern int blkdev_put(struct block_device *, fmode_t); 2041 - extern int bd_claim(struct block_device *, void *); 2042 - extern void bd_release(struct block_device *); 2040 + extern int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder); 2041 + extern struct block_device *blkdev_get_by_path(const char *path, fmode_t mode, 2042 + void *holder); 2043 + extern struct block_device *blkdev_get_by_dev(dev_t dev, fmode_t mode, 2044 + void *holder); 2045 + extern int blkdev_put(struct block_device *bdev, fmode_t mode); 2043 2046 #ifdef CONFIG_SYSFS 2044 - extern int bd_claim_by_disk(struct block_device *, void *, struct gendisk *); 2045 - extern void bd_release_from_disk(struct block_device *, struct gendisk *); 2047 + extern int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk); 2046 2048 #else 2047 - #define bd_claim_by_disk(bdev, holder, disk) bd_claim(bdev, holder) 2048 - #define bd_release_from_disk(bdev, disk) bd_release(bdev) 2049 + static inline int bd_link_disk_holder(struct block_device *bdev, 2050 + struct gendisk *disk) 2051 + { 2052 + return 0; 2053 + } 2049 2054 #endif 2050 2055 #endif 2051 2056 ··· 2085 2082 extern const char *__bdevname(dev_t, char *buffer); 2086 2083 extern const char *bdevname(struct block_device *bdev, char *buffer); 2087 2084 extern struct block_device *lookup_bdev(const char *); 2088 - extern struct block_device *open_bdev_exclusive(const char *, fmode_t, void *); 2089 - extern void close_bdev_exclusive(struct block_device *, fmode_t); 2090 2085 extern void blkdev_show(struct seq_file *,off_t); 2091 2086 2092 2087 #else
+3 -2
kernel/power/swap.c
··· 223 223 return res; 224 224 225 225 root_swap = res; 226 - res = blkdev_get(hib_resume_bdev, FMODE_WRITE); 226 + res = blkdev_get(hib_resume_bdev, FMODE_WRITE, NULL); 227 227 if (res) 228 228 return res; 229 229 ··· 907 907 { 908 908 int error; 909 909 910 - hib_resume_bdev = open_by_devnum(swsusp_resume_device, FMODE_READ); 910 + hib_resume_bdev = blkdev_get_by_dev(swsusp_resume_device, 911 + FMODE_READ, NULL); 911 912 if (!IS_ERR(hib_resume_bdev)) { 912 913 set_blocksize(hib_resume_bdev, PAGE_SIZE); 913 914 clear_page(swsusp_header);
+4 -3
mm/swapfile.c
··· 1677 1677 if (S_ISBLK(inode->i_mode)) { 1678 1678 struct block_device *bdev = I_BDEV(inode); 1679 1679 set_blocksize(bdev, p->old_block_size); 1680 - bd_release(bdev); 1680 + blkdev_put(bdev, FMODE_READ | FMODE_WRITE | FMODE_EXCL); 1681 1681 } else { 1682 1682 mutex_lock(&inode->i_mutex); 1683 1683 inode->i_flags &= ~S_SWAPFILE; ··· 1939 1939 error = -EINVAL; 1940 1940 if (S_ISBLK(inode->i_mode)) { 1941 1941 bdev = I_BDEV(inode); 1942 - error = bd_claim(bdev, sys_swapon); 1942 + error = blkdev_get(bdev, FMODE_READ | FMODE_WRITE | FMODE_EXCL, 1943 + sys_swapon); 1943 1944 if (error < 0) { 1944 1945 bdev = NULL; 1945 1946 error = -EINVAL; ··· 2137 2136 bad_swap: 2138 2137 if (bdev) { 2139 2138 set_blocksize(bdev, p->old_block_size); 2140 - bd_release(bdev); 2139 + blkdev_put(bdev, FMODE_READ | FMODE_WRITE | FMODE_EXCL); 2141 2140 } 2142 2141 destroy_swap_extents(p); 2143 2142 swap_cgroup_swapoff(type);