Hi ethanwu, Thank you for the patch! Yet something to improve:
[auto build test ERROR on v4.17-rc2] [also build test ERROR 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 config: i386-randconfig-x014-201816 (attached as .config) compiler: gcc-7 (Debian 7.3.0-16) 7.3.0 reproduce: # save the attached .config to linux build tree make ARCH=i386 All errors (new ones prefixed by >>): 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 +/atomic_inc +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
.config.gz
Description: application/gzip