Hi,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on v5.12-rc2]
[also build test WARNING on next-20210311]
[cannot apply to kdave/for-next]
[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/fdmanana-kernel-org/btrfs-bug-fi...
base: a38fd8748464831584a19438cbb3082b5a2dab15
config: x86_64-randconfig-m001-20210311 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp(a)intel.com>
smatch warnings:
fs/btrfs/tree-mod-log.c:286 btrfs_tree_mod_log_insert_move() warn: missing error code
'ret'
fs/btrfs/tree-mod-log.c:519 btrfs_tree_mod_log_eb_copy() warn: missing error code
'ret'
fs/btrfs/tree-mod-log.c:577 btrfs_tree_mod_log_free_eb() warn: missing error code
'ret'
vim +/ret +286 fs/btrfs/tree-mod-log.c
246
247 int btrfs_tree_mod_log_insert_move(struct extent_buffer *eb,
248 int dst_slot, int src_slot,
249 int nr_items)
250 {
251 struct tree_mod_elem *tm = NULL;
252 struct tree_mod_elem **tm_list = NULL;
253 int ret = 0;
254 int i;
255 int locked = 0;
256
257 if (!tree_mod_need_log(eb->fs_info, eb))
258 return 0;
259
260 tm_list = kcalloc(nr_items, sizeof(struct tree_mod_elem *), GFP_NOFS);
261 if (!tm_list)
262 return -ENOMEM;
263
264 tm = kzalloc(sizeof(*tm), GFP_NOFS);
265 if (!tm) {
266 ret = -ENOMEM;
267 goto free_tms;
268 }
269
270 tm->logical = eb->start;
271 tm->slot = src_slot;
272 tm->move.dst_slot = dst_slot;
273 tm->move.nr_items = nr_items;
274 tm->op = BTRFS_MOD_LOG_MOVE_KEYS;
275
276 for (i = 0; i + dst_slot < src_slot && i < nr_items; i++) {
277 tm_list[i] = alloc_tree_mod_elem(eb, i + dst_slot,
278 BTRFS_MOD_LOG_KEY_REMOVE_WHILE_MOVING, GFP_NOFS);
279 if (!tm_list[i]) {
280 ret = -ENOMEM;
281 goto free_tms;
282 }
283 }
284
285 if (tree_mod_dont_log(eb->fs_info, eb))
286 goto free_tms;
287 locked = 1;
288
289 /*
290 * When we override something during the move, we log these removals.
291 * This can only happen when we move towards the beginning of the
292 * buffer, i.e. dst_slot < src_slot.
293 */
294 for (i = 0; i + dst_slot < src_slot && i < nr_items; i++) {
295 ret = tree_mod_log_insert(eb->fs_info, tm_list[i]);
296 if (ret)
297 goto free_tms;
298 }
299
300 ret = tree_mod_log_insert(eb->fs_info, tm);
301 if (ret)
302 goto free_tms;
303 write_unlock(&eb->fs_info->tree_mod_log_lock);
304 kfree(tm_list);
305
306 return 0;
307 free_tms:
308 for (i = 0; i < nr_items; i++) {
309 if (tm_list[i] && !RB_EMPTY_NODE(&tm_list[i]->node))
310 rb_erase(&tm_list[i]->node, &eb->fs_info->tree_mod_log);
311 kfree(tm_list[i]);
312 }
313 if (locked)
314 write_unlock(&eb->fs_info->tree_mod_log_lock);
315 kfree(tm_list);
316 kfree(tm);
317
318 return ret;
319 }
320
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org