super.c (028ddcac477b691dd9205c92f991cc15259d033e) super.c (abcc0cbd49283fccd20420e86416b2475b00819c)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * bcache setup/teardown code, and some metadata io - read a superblock and
4 * figure out what to do with it.
5 *
6 * Copyright 2010, 2011 Kent Overstreet <kent.overstreet@gmail.com>
7 * Copyright 2012 Google, Inc.
8 */

--- 2434 unchanged lines hidden (view full) ---

2443}
2444
2445struct async_reg_args {
2446 struct delayed_work reg_work;
2447 char *path;
2448 struct cache_sb *sb;
2449 struct cache_sb_disk *sb_disk;
2450 struct block_device *bdev;
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * bcache setup/teardown code, and some metadata io - read a superblock and
4 * figure out what to do with it.
5 *
6 * Copyright 2010, 2011 Kent Overstreet <kent.overstreet@gmail.com>
7 * Copyright 2012 Google, Inc.
8 */

--- 2434 unchanged lines hidden (view full) ---

2443}
2444
2445struct async_reg_args {
2446 struct delayed_work reg_work;
2447 char *path;
2448 struct cache_sb *sb;
2449 struct cache_sb_disk *sb_disk;
2450 struct block_device *bdev;
2451 void *holder;
2451};
2452
2453static void register_bdev_worker(struct work_struct *work)
2454{
2455 int fail = false;
2456 struct async_reg_args *args =
2457 container_of(work, struct async_reg_args, reg_work.work);
2452};
2453
2454static void register_bdev_worker(struct work_struct *work)
2455{
2456 int fail = false;
2457 struct async_reg_args *args =
2458 container_of(work, struct async_reg_args, reg_work.work);
2458 struct cached_dev *dc;
2459
2459
2460 dc = kzalloc(sizeof(*dc), GFP_KERNEL);
2461 if (!dc) {
2462 fail = true;
2463 put_page(virt_to_page(args->sb_disk));
2464 blkdev_put(args->bdev, bcache_kobj);
2465 goto out;
2466 }
2467
2468 mutex_lock(&bch_register_lock);
2460 mutex_lock(&bch_register_lock);
2469 if (register_bdev(args->sb, args->sb_disk, args->bdev, dc) < 0)
2461 if (register_bdev(args->sb, args->sb_disk, args->bdev, args->holder)
2462 < 0)
2470 fail = true;
2471 mutex_unlock(&bch_register_lock);
2472
2463 fail = true;
2464 mutex_unlock(&bch_register_lock);
2465
2473out:
2474 if (fail)
2475 pr_info("error %s: fail to register backing device\n",
2476 args->path);
2477 kfree(args->sb);
2478 kfree(args->path);
2479 kfree(args);
2480 module_put(THIS_MODULE);
2481}
2482
2483static void register_cache_worker(struct work_struct *work)
2484{
2485 int fail = false;
2486 struct async_reg_args *args =
2487 container_of(work, struct async_reg_args, reg_work.work);
2466 if (fail)
2467 pr_info("error %s: fail to register backing device\n",
2468 args->path);
2469 kfree(args->sb);
2470 kfree(args->path);
2471 kfree(args);
2472 module_put(THIS_MODULE);
2473}
2474
2475static void register_cache_worker(struct work_struct *work)
2476{
2477 int fail = false;
2478 struct async_reg_args *args =
2479 container_of(work, struct async_reg_args, reg_work.work);
2488 struct cache *ca;
2489
2480
2490 ca = kzalloc(sizeof(*ca), GFP_KERNEL);
2491 if (!ca) {
2492 fail = true;
2493 put_page(virt_to_page(args->sb_disk));
2494 blkdev_put(args->bdev, bcache_kobj);
2495 goto out;
2496 }
2497
2498 /* blkdev_put() will be called in bch_cache_release() */
2481 /* blkdev_put() will be called in bch_cache_release() */
2499 if (register_cache(args->sb, args->sb_disk, args->bdev, ca) != 0)
2482 if (register_cache(args->sb, args->sb_disk, args->bdev, args->holder))
2500 fail = true;
2501
2483 fail = true;
2484
2502out:
2503 if (fail)
2504 pr_info("error %s: fail to register cache device\n",
2505 args->path);
2506 kfree(args->sb);
2507 kfree(args->path);
2508 kfree(args);
2509 module_put(THIS_MODULE);
2510}

--- 4 unchanged lines hidden (view full) ---

2515 INIT_DELAYED_WORK(&args->reg_work, register_bdev_worker);
2516 else
2517 INIT_DELAYED_WORK(&args->reg_work, register_cache_worker);
2518
2519 /* 10 jiffies is enough for a delay */
2520 queue_delayed_work(system_wq, &args->reg_work, 10);
2521}
2522
2485 if (fail)
2486 pr_info("error %s: fail to register cache device\n",
2487 args->path);
2488 kfree(args->sb);
2489 kfree(args->path);
2490 kfree(args);
2491 module_put(THIS_MODULE);
2492}

--- 4 unchanged lines hidden (view full) ---

2497 INIT_DELAYED_WORK(&args->reg_work, register_bdev_worker);
2498 else
2499 INIT_DELAYED_WORK(&args->reg_work, register_cache_worker);
2500
2501 /* 10 jiffies is enough for a delay */
2502 queue_delayed_work(system_wq, &args->reg_work, 10);
2503}
2504
2505static void *alloc_holder_object(struct cache_sb *sb)
2506{
2507 if (SB_IS_BDEV(sb))
2508 return kzalloc(sizeof(struct cached_dev), GFP_KERNEL);
2509 return kzalloc(sizeof(struct cache), GFP_KERNEL);
2510}
2511
2523static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr,
2524 const char *buffer, size_t size)
2525{
2526 const char *err;
2527 char *path = NULL;
2528 struct cache_sb *sb;
2529 struct cache_sb_disk *sb_disk;
2530 struct block_device *bdev;
2512static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr,
2513 const char *buffer, size_t size)
2514{
2515 const char *err;
2516 char *path = NULL;
2517 struct cache_sb *sb;
2518 struct cache_sb_disk *sb_disk;
2519 struct block_device *bdev;
2520 void *holder;
2531 ssize_t ret;
2532 bool async_registration = false;
2533
2534#ifdef CONFIG_BCACHE_ASYNC_REGISTRATION
2535 async_registration = true;
2536#endif
2537
2538 ret = -EBUSY;

--- 41 unchanged lines hidden (view full) ---

2580 err = "failed to set blocksize";
2581 if (set_blocksize(bdev, 4096))
2582 goto out_blkdev_put;
2583
2584 err = read_super(sb, bdev, &sb_disk);
2585 if (err)
2586 goto out_blkdev_put;
2587
2521 ssize_t ret;
2522 bool async_registration = false;
2523
2524#ifdef CONFIG_BCACHE_ASYNC_REGISTRATION
2525 async_registration = true;
2526#endif
2527
2528 ret = -EBUSY;

--- 41 unchanged lines hidden (view full) ---

2570 err = "failed to set blocksize";
2571 if (set_blocksize(bdev, 4096))
2572 goto out_blkdev_put;
2573
2574 err = read_super(sb, bdev, &sb_disk);
2575 if (err)
2576 goto out_blkdev_put;
2577
2578 holder = alloc_holder_object(sb);
2579 if (!holder) {
2580 ret = -ENOMEM;
2581 err = "cannot allocate memory";
2582 goto out_put_sb_page;
2583 }
2584
2588 err = "failed to register device";
2589
2590 if (async_registration) {
2591 /* register in asynchronous way */
2592 struct async_reg_args *args =
2593 kzalloc(sizeof(struct async_reg_args), GFP_KERNEL);
2594
2595 if (!args) {
2596 ret = -ENOMEM;
2597 err = "cannot allocate memory";
2585 err = "failed to register device";
2586
2587 if (async_registration) {
2588 /* register in asynchronous way */
2589 struct async_reg_args *args =
2590 kzalloc(sizeof(struct async_reg_args), GFP_KERNEL);
2591
2592 if (!args) {
2593 ret = -ENOMEM;
2594 err = "cannot allocate memory";
2598 goto out_put_sb_page;
2595 goto out_free_holder;
2599 }
2600
2601 args->path = path;
2602 args->sb = sb;
2603 args->sb_disk = sb_disk;
2604 args->bdev = bdev;
2596 }
2597
2598 args->path = path;
2599 args->sb = sb;
2600 args->sb_disk = sb_disk;
2601 args->bdev = bdev;
2602 args->holder = holder;
2605 register_device_async(args);
2606 /* No wait and returns to user space */
2607 goto async_done;
2608 }
2609
2610 if (SB_IS_BDEV(sb)) {
2603 register_device_async(args);
2604 /* No wait and returns to user space */
2605 goto async_done;
2606 }
2607
2608 if (SB_IS_BDEV(sb)) {
2611 struct cached_dev *dc = kzalloc(sizeof(*dc), GFP_KERNEL);
2612
2613 if (!dc) {
2614 ret = -ENOMEM;
2615 err = "cannot allocate memory";
2616 goto out_put_sb_page;
2617 }
2618
2619 mutex_lock(&bch_register_lock);
2609 mutex_lock(&bch_register_lock);
2620 ret = register_bdev(sb, sb_disk, bdev, dc);
2610 ret = register_bdev(sb, sb_disk, bdev, holder);
2621 mutex_unlock(&bch_register_lock);
2622 /* blkdev_put() will be called in cached_dev_free() */
2623 if (ret < 0)
2624 goto out_free_sb;
2625 } else {
2611 mutex_unlock(&bch_register_lock);
2612 /* blkdev_put() will be called in cached_dev_free() */
2613 if (ret < 0)
2614 goto out_free_sb;
2615 } else {
2626 struct cache *ca = kzalloc(sizeof(*ca), GFP_KERNEL);
2627
2628 if (!ca) {
2629 ret = -ENOMEM;
2630 err = "cannot allocate memory";
2631 goto out_put_sb_page;
2632 }
2633
2634 /* blkdev_put() will be called in bch_cache_release() */
2616 /* blkdev_put() will be called in bch_cache_release() */
2635 ret = register_cache(sb, sb_disk, bdev, ca);
2617 ret = register_cache(sb, sb_disk, bdev, holder);
2636 if (ret)
2637 goto out_free_sb;
2638 }
2639
2640done:
2641 kfree(sb);
2642 kfree(path);
2643 module_put(THIS_MODULE);
2644async_done:
2645 return size;
2646
2618 if (ret)
2619 goto out_free_sb;
2620 }
2621
2622done:
2623 kfree(sb);
2624 kfree(path);
2625 module_put(THIS_MODULE);
2626async_done:
2627 return size;
2628
2629out_free_holder:
2630 kfree(holder);
2647out_put_sb_page:
2648 put_page(virt_to_page(sb_disk));
2649out_blkdev_put:
2650 blkdev_put(bdev, register_bcache);
2651out_free_sb:
2652 kfree(sb);
2653out_free_path:
2654 kfree(path);

--- 283 unchanged lines hidden ---
2631out_put_sb_page:
2632 put_page(virt_to_page(sb_disk));
2633out_blkdev_put:
2634 blkdev_put(bdev, register_bcache);
2635out_free_sb:
2636 kfree(sb);
2637out_free_path:
2638 kfree(path);

--- 283 unchanged lines hidden ---