Hi Sergei, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on block/for-next] [also build test WARNING on hch-configfs/for-next v5.12-rc6] [cannot apply to dm/for-next next-20210409] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Sergei-Shtepa/block-device-interposer/20210409-194943 base: https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next config: i386-randconfig-m021-20210409 (attached as .config) compiler: gcc-9 (Debian 9.3.0-22) 9.3.0 reproduce (this is a W=1 build): # https://github.com/0day-ci/linux/commit/df79fb333cb0a1263a1f03f54de425507e3c2238 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Sergei-Shtepa/block-device-interposer/20210409-194943 git checkout df79fb333cb0a1263a1f03f54de425507e3c2238 # save the attached .config to linux build tree make W=1 ARCH=i386 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot All warnings (new ones prefixed by >>): >> drivers/md/dm.c:2682:5: warning: no previous prototype for '__dm_attach_interposer' [-Wmissing-prototypes] 2682 | int __dm_attach_interposer(struct mapped_device *md) | ^~~~~~~~~~~~~~~~~~~~~~ >> drivers/md/dm.c:2724:5: warning: no previous prototype for '__dm_detach_interposer' [-Wmissing-prototypes] 2724 | int __dm_detach_interposer(struct mapped_device *md) | ^~~~~~~~~~~~~~~~~~~~~~ vim +/__dm_attach_interposer +2682 drivers/md/dm.c 2681 > 2682 int __dm_attach_interposer(struct mapped_device *md) 2683 { 2684 int r; 2685 struct dm_table *map; 2686 struct block_device *original_bdev = NULL; 2687 2688 if (dm_interposer_attached(md)) 2689 return 0; 2690 2691 map = rcu_dereference_protected(md->map, 2692 lockdep_is_held(&md->suspend_lock)); 2693 if (!map) { 2694 DMERR("%s: interposers table is not initialized", 2695 dm_device_name(md)); 2696 return -EINVAL; 2697 } 2698 2699 original_bdev = get_interposed_bdev(map); 2700 if (!original_bdev) { 2701 DMERR("%s: interposer cannot get interposed device from table", 2702 dm_device_name(md)); 2703 return -EINVAL; 2704 } 2705 2706 bdev_interposer_lock(original_bdev); 2707 2708 r = bdev_interposer_attach(original_bdev, dm_disk(md)->part0); 2709 if (r) 2710 DMERR("%s: failed to attach interposer", 2711 dm_device_name(md)); 2712 else 2713 set_bit(DMF_INTERPOSER_ATTACHED, &md->flags); 2714 2715 bdev_interposer_unlock(original_bdev); 2716 2717 unlock_bdev_fs(md, original_bdev); 2718 2719 bdput(original_bdev); 2720 2721 return r; 2722 } 2723 > 2724 int __dm_detach_interposer(struct mapped_device *md) 2725 { 2726 struct dm_table *map = NULL; 2727 struct block_device *original_bdev; 2728 2729 if (!dm_interposer_attached(md)) 2730 return 0; 2731 /* 2732 * If mapped device is suspended, but should be detached 2733 * we just detach without freeze fs on interposed device. 2734 */ 2735 map = rcu_dereference_protected(md->map, 2736 lockdep_is_held(&md->suspend_lock)); 2737 if (!map) { 2738 /* 2739 * If table is not initialized then interposed device 2740 * cannot be attached 2741 */ 2742 DMERR("%s: table is not initialized for device", 2743 dm_device_name(md)); 2744 return -EINVAL; 2745 } 2746 2747 original_bdev = get_interposed_bdev(map); 2748 if (!original_bdev) { 2749 DMERR("%s: interposer cannot get interposed device from table", 2750 dm_device_name(md)); 2751 return -EINVAL; 2752 } 2753 2754 bdev_interposer_lock(original_bdev); 2755 2756 bdev_interposer_detach(original_bdev); 2757 clear_bit(DMF_INTERPOSER_ATTACHED, &md->flags); 2758 2759 bdev_interposer_unlock(original_bdev); 2760 2761 bdput(original_bdev); 2762 return 0; 2763 } 2764 /* 2765 * We need to be able to change a mapping table under a mounted 2766 * filesystem. For example we might want to move some data in 2767 * the background. Before the table can be swapped with 2768 * dm_bind_table, dm_suspend must be called to flush any in 2769 * flight bios and ensure that any further io gets deferred. 2770 */ 2771 /* 2772 * Suspend mechanism in request-based dm. 2773 * 2774 * 1. Flush all I/Os by lock_fs() if needed. 2775 * 2. Stop dispatching any I/O by stopping the request_queue. 2776 * 3. Wait for all in-flight I/Os to be completed or requeued. 2777 * 2778 * To abort suspend, start the request_queue. 2779 */ 2780 int dm_suspend(struct mapped_device *md, unsigned suspend_flags) 2781 { 2782 struct dm_table *map = NULL; 2783 int r = 0; 2784 2785 retry: 2786 mutex_lock_nested(&md->suspend_lock, SINGLE_DEPTH_NESTING); 2787 2788 if (dm_suspended_md(md)) { 2789 if (suspend_flags & DM_SUSPEND_DETACH_IP_FLAG) 2790 r = __dm_detach_interposer(md); 2791 else 2792 r = -EINVAL; 2793 2794 goto out_unlock; 2795 } 2796 2797 if (dm_suspended_internally_md(md)) { 2798 /* already internally suspended, wait for internal resume */ 2799 mutex_unlock(&md->suspend_lock); 2800 r = wait_on_bit(&md->flags, DMF_SUSPENDED_INTERNALLY, TASK_INTERRUPTIBLE); 2801 if (r) 2802 return r; 2803 goto retry; 2804 } 2805 2806 map = rcu_dereference_protected(md->map, lockdep_is_held(&md->suspend_lock)); 2807 2808 r = __dm_suspend(md, map, suspend_flags, TASK_INTERRUPTIBLE, DMF_SUSPENDED); 2809 if (r) 2810 goto out_unlock; 2811 2812 set_bit(DMF_POST_SUSPENDING, &md->flags); 2813 dm_table_postsuspend_targets(map); 2814 clear_bit(DMF_POST_SUSPENDING, &md->flags); 2815 2816 out_unlock: 2817 mutex_unlock(&md->suspend_lock); 2818 return r; 2819 } 2820 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org