Hi ethanwu,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on v4.17-rc2]
[also build test WARNING on next-20180426]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improve the system]

url:    
https://github.com/0day-ci/linux/commits/ethanwu/btrfs-Take-trans-lock-before-access-running-trans-in-check_delayed_ref/20180428-223414
reproduce:
        # apt-get install sparse
        make ARCH=x86_64 allmodconfig
        make C=1 CF=-D__CHECK_ENDIAN__


sparse warnings: (new ones prefixed by >>)

   fs/btrfs/extent-tree.c:278:39: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:278:39: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:401:16: sparse: expression using sizeof(void)
>> fs/btrfs/extent-tree.c:3148:29: sparse: incorrect type in argument 1 
>> (different base types) @@    expected struct atomic_t [usertype] *v @@    
>> got ct atomic_t [usertype] *v @@
   fs/btrfs/extent-tree.c:3148:29:    expected struct atomic_t [usertype] *v
   fs/btrfs/extent-tree.c:3148:29:    got struct refcount_struct *<noident>
   fs/btrfs/extent-tree.c:4502:26: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:4850:31: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:4850:31: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:5043:22: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:5060:22: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:5060:22: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:5043:22: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:5060:22: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:5060:22: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:5043:22: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:5060:22: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:5060:22: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:5043:22: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:5060:22: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:5060:22: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:5612:48: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:5612:48: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:5861:21: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:5866:27: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:5872:37: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:5872:37: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:6308:29: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:6308:29: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:6737:23: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:6737:23: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:6740:31: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:6740:31: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:6782:42: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:6782:42: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:7551:24: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:7551:24: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:7552:24: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:7552:24: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:7716:43: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:7716:43: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:8064:37: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:8064:37: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:8067:37: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:8067:37: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:8586:35: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:8589:35: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:8589:35: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:11035:25: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:11035:25: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:11036:23: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:11036:23: sparse: expression using sizeof(void)
   fs/btrfs/extent-tree.c:2558:20: sparse: context imbalance in 
'cleanup_extent_op' - unexpected unlock
   fs/btrfs/extent-tree.c:2590:28: sparse: context imbalance in 
'cleanup_ref_head' - unexpected unlock
   fs/btrfs/extent-tree.c:2702:26: sparse: context imbalance in 
'__btrfs_run_delayed_refs' - different lock contexts for basic block
   fs/btrfs/extent-tree.c:7418:39: sparse: context imbalance in 
'btrfs_lock_cluster' - wrong count at exit
   fs/btrfs/extent-tree.c:7695:44: sparse: context imbalance in 
'find_free_extent' - unexpected unlock
   fs/btrfs/extent-tree.c:9830:9: sparse: context imbalance in 
'btrfs_put_block_group_cache' - wrong count at exit
   fs/btrfs/extent-tree.c: In function 'check_delayed_ref':
   fs/btrfs/extent-tree.c:3148:14: error: passing argument 1 of 'atomic_inc' 
from incompatible pointer type [-Werror=incompatible-pointer-types]
      atomic_inc(&cur_trans->use_count);
                 ^
   In file included from arch/x86/include/asm/atomic.h:283:0,
                    from include/linux/atomic.h:5,
                    from include/linux/rcupdate.h:38,
                    from include/linux/rculist.h:11,
                    from include/linux/pid.h:5,
                    from include/linux/sched.h:14,
                    from fs/btrfs/extent-tree.c:6:
   include/asm-generic/atomic-instrumented.h:100:29: note: expected 'atomic_t * 
{aka struct <anonymous> *}' but argument is of type 'refcount_t * {aka struct 
refcount_struct *}'
    static __always_inline void atomic_inc(atomic_t *v)
                                ^~~~~~~~~~
   cc1: some warnings being treated as errors

vim +3148 fs/btrfs/extent-tree.c

  3132  
  3133  static noinline int check_delayed_ref(struct btrfs_root *root,
  3134                                        struct btrfs_path *path,
  3135                                        u64 objectid, u64 offset, u64 
bytenr)
  3136  {
  3137          struct btrfs_delayed_ref_head *head;
  3138          struct btrfs_delayed_ref_node *ref;
  3139          struct btrfs_delayed_data_ref *data_ref;
  3140          struct btrfs_delayed_ref_root *delayed_refs;
  3141          struct btrfs_transaction *cur_trans;
  3142          struct rb_node *node;
  3143          int ret = 0;
  3144  
  3145          spin_lock(&root->fs_info->trans_lock);
  3146          cur_trans = root->fs_info->running_transaction;
  3147          if (cur_trans)
> 3148                  atomic_inc(&cur_trans->use_count);
  3149          spin_unlock(&root->fs_info->trans_lock);
  3150          if (!cur_trans)
  3151                  return 0;
  3152  
  3153          delayed_refs = &cur_trans->delayed_refs;
  3154          spin_lock(&delayed_refs->lock);
  3155          head = btrfs_find_delayed_ref_head(delayed_refs, bytenr);
  3156          if (!head) {
  3157                  spin_unlock(&delayed_refs->lock);
  3158                  btrfs_put_transaction(cur_trans);
  3159                  return 0;
  3160          }
  3161  
  3162          if (!mutex_trylock(&head->mutex)) {
  3163                  refcount_inc(&head->refs);
  3164                  spin_unlock(&delayed_refs->lock);
  3165  
  3166                  btrfs_release_path(path);
  3167  
  3168                  /*
  3169                   * Mutex was contended, block until it's released and 
let
  3170                   * caller try again
  3171                   */
  3172                  mutex_lock(&head->mutex);
  3173                  mutex_unlock(&head->mutex);
  3174                  btrfs_put_delayed_ref_head(head);
  3175                  btrfs_put_transaction(cur_trans);
  3176                  return -EAGAIN;
  3177          }
  3178          spin_unlock(&delayed_refs->lock);
  3179  
  3180          spin_lock(&head->lock);
  3181          /*
  3182           * XXX: We should replace this with a proper search function in 
the
  3183           * future.
  3184           */
  3185          for (node = rb_first(&head->ref_tree); node; node = 
rb_next(node)) {
  3186                  ref = rb_entry(node, struct btrfs_delayed_ref_node, 
ref_node);
  3187                  /* If it's a shared ref we know a cross reference 
exists */
  3188                  if (ref->type != BTRFS_EXTENT_DATA_REF_KEY) {
  3189                          ret = 1;
  3190                          break;
  3191                  }
  3192  
  3193                  data_ref = btrfs_delayed_node_to_data_ref(ref);
  3194  
  3195                  /*
  3196                   * If our ref doesn't match the one we're currently 
looking at
  3197                   * then we have a cross reference.
  3198                   */
  3199                  if (data_ref->root != root->root_key.objectid ||
  3200                      data_ref->objectid != objectid ||
  3201                      data_ref->offset != offset) {
  3202                          ret = 1;
  3203                          break;
  3204                  }
  3205          }
  3206          spin_unlock(&head->lock);
  3207          mutex_unlock(&head->mutex);
  3208          btrfs_put_transaction(cur_trans);
  3209          return ret;
  3210  }
  3211  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to