CC: [email protected] CC: Omar Sandoval <[email protected]> CC: [email protected] TO: Omar Sandoval <[email protected]> CC: Nikolay Borisov <[email protected]>
tree: https://github.com/osandov/linux.git btrfs-send-encoded head: b460af84b8ddd4fd78e02fec6272b70326b87861 commit: 7fc49b82d8d6e143a20b6a2243a520ec34e7cdd6 [12/14] btrfs: send: allocate send buffer with alloc_page() and vmap() for v2 :::::: branch date: 3 weeks ago :::::: commit date: 3 weeks ago config: x86_64-randconfig-m001-20211025 (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 <[email protected]> Reported-by: Dan Carpenter <[email protected]> smatch warnings: fs/btrfs/send.c:7539 btrfs_ioctl_send() error: we previously assumed 'sctx->send_buf_pages' could be null (see line 7312) vim +7539 fs/btrfs/send.c 62d54f3a7fa27e Filipe Manana 2019-04-22 7218 2351f431f72722 Josef Bacik 2017-09-27 7219 long btrfs_ioctl_send(struct file *mnt_file, struct btrfs_ioctl_send_args *arg) 31db9f7c23fbf7 Alexander Block 2012-07-25 7220 { 31db9f7c23fbf7 Alexander Block 2012-07-25 7221 int ret = 0; 0b246afa62b0cf Jeff Mahoney 2016-06-22 7222 struct btrfs_root *send_root = BTRFS_I(file_inode(mnt_file))->root; 0b246afa62b0cf Jeff Mahoney 2016-06-22 7223 struct btrfs_fs_info *fs_info = send_root->fs_info; 31db9f7c23fbf7 Alexander Block 2012-07-25 7224 struct btrfs_root *clone_root; 31db9f7c23fbf7 Alexander Block 2012-07-25 7225 struct send_ctx *sctx = NULL; 31db9f7c23fbf7 Alexander Block 2012-07-25 7226 u32 i; 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 7227 u32 send_buf_num_pages = 0; 31db9f7c23fbf7 Alexander Block 2012-07-25 7228 u64 *clone_sources_tmp = NULL; 2c68653787f91c David Sterba 2013-12-16 7229 int clone_sources_to_rollback = 0; bae12df966f0e1 Denis Efremov 2020-09-21 7230 size_t alloc_size; 896c14f97f700a Wang Shilong 2014-01-07 7231 int sort_clone_roots = 0; 31db9f7c23fbf7 Alexander Block 2012-07-25 7232 31db9f7c23fbf7 Alexander Block 2012-07-25 7233 if (!capable(CAP_SYS_ADMIN)) 31db9f7c23fbf7 Alexander Block 2012-07-25 7234 return -EPERM; 31db9f7c23fbf7 Alexander Block 2012-07-25 7235 2c68653787f91c David Sterba 2013-12-16 7236 /* 2c68653787f91c David Sterba 2013-12-16 7237 * The subvolume must remain read-only during send, protect against 521e0546c970c3 David Sterba 2014-04-15 7238 * making it RW. This also protects against deletion. 2c68653787f91c David Sterba 2013-12-16 7239 */ 2c68653787f91c David Sterba 2013-12-16 7240 spin_lock(&send_root->root_item_lock); 62d54f3a7fa27e Filipe Manana 2019-04-22 7241 if (btrfs_root_readonly(send_root) && send_root->dedupe_in_progress) { 62d54f3a7fa27e Filipe Manana 2019-04-22 7242 dedupe_in_progress_warn(send_root); 62d54f3a7fa27e Filipe Manana 2019-04-22 7243 spin_unlock(&send_root->root_item_lock); 62d54f3a7fa27e Filipe Manana 2019-04-22 7244 return -EAGAIN; 62d54f3a7fa27e Filipe Manana 2019-04-22 7245 } 2c68653787f91c David Sterba 2013-12-16 7246 send_root->send_in_progress++; 2c68653787f91c David Sterba 2013-12-16 7247 spin_unlock(&send_root->root_item_lock); 2c68653787f91c David Sterba 2013-12-16 7248 2c68653787f91c David Sterba 2013-12-16 7249 /* 2c68653787f91c David Sterba 2013-12-16 7250 * Userspace tools do the checks and warn the user if it's 2c68653787f91c David Sterba 2013-12-16 7251 * not RO. 2c68653787f91c David Sterba 2013-12-16 7252 */ 2c68653787f91c David Sterba 2013-12-16 7253 if (!btrfs_root_readonly(send_root)) { 2c68653787f91c David Sterba 2013-12-16 7254 ret = -EPERM; 2c68653787f91c David Sterba 2013-12-16 7255 goto out; 2c68653787f91c David Sterba 2013-12-16 7256 } 2c68653787f91c David Sterba 2013-12-16 7257 457ae7268b29c3 Dan Carpenter 2017-03-17 7258 /* 457ae7268b29c3 Dan Carpenter 2017-03-17 7259 * Check that we don't overflow at later allocations, we request 457ae7268b29c3 Dan Carpenter 2017-03-17 7260 * clone_sources_count + 1 items, and compare to unsigned long inside 457ae7268b29c3 Dan Carpenter 2017-03-17 7261 * access_ok. 457ae7268b29c3 Dan Carpenter 2017-03-17 7262 */ f5ecec3ce21f70 Dan Carpenter 2016-04-13 7263 if (arg->clone_sources_count > 457ae7268b29c3 Dan Carpenter 2017-03-17 7264 ULONG_MAX / sizeof(struct clone_root) - 1) { f5ecec3ce21f70 Dan Carpenter 2016-04-13 7265 ret = -EINVAL; f5ecec3ce21f70 Dan Carpenter 2016-04-13 7266 goto out; f5ecec3ce21f70 Dan Carpenter 2016-04-13 7267 } f5ecec3ce21f70 Dan Carpenter 2016-04-13 7268 c2c71324ecb471 Stefan Behrens 2013-04-10 7269 if (arg->flags & ~BTRFS_SEND_FLAG_MASK) { cb95e7bf7ba481 Mark Fasheh 2013-02-04 7270 ret = -EINVAL; cb95e7bf7ba481 Mark Fasheh 2013-02-04 7271 goto out; cb95e7bf7ba481 Mark Fasheh 2013-02-04 7272 } cb95e7bf7ba481 Mark Fasheh 2013-02-04 7273 e780b0d1c1523e David Sterba 2016-01-18 7274 sctx = kzalloc(sizeof(struct send_ctx), GFP_KERNEL); 31db9f7c23fbf7 Alexander Block 2012-07-25 7275 if (!sctx) { 31db9f7c23fbf7 Alexander Block 2012-07-25 7276 ret = -ENOMEM; 31db9f7c23fbf7 Alexander Block 2012-07-25 7277 goto out; 31db9f7c23fbf7 Alexander Block 2012-07-25 7278 } 31db9f7c23fbf7 Alexander Block 2012-07-25 7279 31db9f7c23fbf7 Alexander Block 2012-07-25 7280 INIT_LIST_HEAD(&sctx->new_refs); 31db9f7c23fbf7 Alexander Block 2012-07-25 7281 INIT_LIST_HEAD(&sctx->deleted_refs); e780b0d1c1523e David Sterba 2016-01-18 7282 INIT_RADIX_TREE(&sctx->name_cache, GFP_KERNEL); 31db9f7c23fbf7 Alexander Block 2012-07-25 7283 INIT_LIST_HEAD(&sctx->name_cache_list); 31db9f7c23fbf7 Alexander Block 2012-07-25 7284 cb95e7bf7ba481 Mark Fasheh 2013-02-04 7285 sctx->flags = arg->flags; cb95e7bf7ba481 Mark Fasheh 2013-02-04 7286 31db9f7c23fbf7 Alexander Block 2012-07-25 7287 sctx->send_filp = fget(arg->send_fd); ecc7ada77b5cd1 Tsutomu Itoh 2013-04-19 7288 if (!sctx->send_filp) { ecc7ada77b5cd1 Tsutomu Itoh 2013-04-19 7289 ret = -EBADF; 31db9f7c23fbf7 Alexander Block 2012-07-25 7290 goto out; 31db9f7c23fbf7 Alexander Block 2012-07-25 7291 } 31db9f7c23fbf7 Alexander Block 2012-07-25 7292 31db9f7c23fbf7 Alexander Block 2012-07-25 7293 sctx->send_root = send_root; 521e0546c970c3 David Sterba 2014-04-15 7294 /* 521e0546c970c3 David Sterba 2014-04-15 7295 * Unlikely but possible, if the subvolume is marked for deletion but 521e0546c970c3 David Sterba 2014-04-15 7296 * is slow to remove the directory entry, send can still be started 521e0546c970c3 David Sterba 2014-04-15 7297 */ 521e0546c970c3 David Sterba 2014-04-15 7298 if (btrfs_root_dead(sctx->send_root)) { 521e0546c970c3 David Sterba 2014-04-15 7299 ret = -EPERM; 521e0546c970c3 David Sterba 2014-04-15 7300 goto out; 521e0546c970c3 David Sterba 2014-04-15 7301 } 521e0546c970c3 David Sterba 2014-04-15 7302 31db9f7c23fbf7 Alexander Block 2012-07-25 7303 sctx->clone_roots_cnt = arg->clone_sources_count; 31db9f7c23fbf7 Alexander Block 2012-07-25 7304 4732c37b0f5233 Omar Sandoval 2020-05-13 7305 if (sctx->flags & BTRFS_SEND_FLAG_STREAM_V2) { 4732c37b0f5233 Omar Sandoval 2020-05-13 7306 sctx->send_max_size = ALIGN(SZ_16K + BTRFS_MAX_COMPRESSED, 4732c37b0f5233 Omar Sandoval 2020-05-13 7307 PAGE_SIZE); 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 7308 send_buf_num_pages = sctx->send_max_size >> PAGE_SHIFT; 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 7309 sctx->send_buf_pages = kcalloc(send_buf_num_pages, 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 7310 sizeof(*sctx->send_buf_pages), 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 7311 GFP_KERNEL); 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 7312 if (!sctx->send_buf_pages) { 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 7313 send_buf_num_pages = 0; 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 7314 ret = -ENOMEM; 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 7315 goto out; 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 7316 } 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 7317 for (i = 0; i < send_buf_num_pages; i++) { 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 7318 sctx->send_buf_pages[i] = alloc_page(GFP_KERNEL); 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 7319 if (!sctx->send_buf_pages[i]) { 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 7320 ret = -ENOMEM; 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 7321 goto out; 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 7322 } 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 7323 } 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 7324 sctx->send_buf = vmap(sctx->send_buf_pages, send_buf_num_pages, 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 7325 VM_MAP, PAGE_KERNEL); 4732c37b0f5233 Omar Sandoval 2020-05-13 7326 } else { 7dd79a590b49b8 Omar Sandoval 2020-05-12 7327 sctx->send_max_size = BTRFS_SEND_BUF_SIZE_V1; 752ade68cbd81d Michal Hocko 2017-05-08 7328 sctx->send_buf = kvmalloc(sctx->send_max_size, GFP_KERNEL); 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 7329 } 31db9f7c23fbf7 Alexander Block 2012-07-25 7330 if (!sctx->send_buf) { 31db9f7c23fbf7 Alexander Block 2012-07-25 7331 ret = -ENOMEM; 31db9f7c23fbf7 Alexander Block 2012-07-25 7332 goto out; 31db9f7c23fbf7 Alexander Block 2012-07-25 7333 } 31db9f7c23fbf7 Alexander Block 2012-07-25 7334 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7335 sctx->pending_dir_moves = RB_ROOT; 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7336 sctx->waiting_dir_moves = RB_ROOT; 9dc442143b9874 Filipe Manana 2014-02-19 7337 sctx->orphan_dirs = RB_ROOT; 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7338 bae12df966f0e1 Denis Efremov 2020-09-21 7339 sctx->clone_roots = kvcalloc(sizeof(*sctx->clone_roots), bae12df966f0e1 Denis Efremov 2020-09-21 7340 arg->clone_sources_count + 1, bae12df966f0e1 Denis Efremov 2020-09-21 7341 GFP_KERNEL); 31db9f7c23fbf7 Alexander Block 2012-07-25 7342 if (!sctx->clone_roots) { 31db9f7c23fbf7 Alexander Block 2012-07-25 7343 ret = -ENOMEM; 31db9f7c23fbf7 Alexander Block 2012-07-25 7344 goto out; 31db9f7c23fbf7 Alexander Block 2012-07-25 7345 } 31db9f7c23fbf7 Alexander Block 2012-07-25 7346 bae12df966f0e1 Denis Efremov 2020-09-21 7347 alloc_size = array_size(sizeof(*arg->clone_sources), bae12df966f0e1 Denis Efremov 2020-09-21 7348 arg->clone_sources_count); e55d1153dbf484 David Sterba 2016-04-11 7349 31db9f7c23fbf7 Alexander Block 2012-07-25 7350 if (arg->clone_sources_count) { 752ade68cbd81d Michal Hocko 2017-05-08 7351 clone_sources_tmp = kvmalloc(alloc_size, GFP_KERNEL); 31db9f7c23fbf7 Alexander Block 2012-07-25 7352 if (!clone_sources_tmp) { 31db9f7c23fbf7 Alexander Block 2012-07-25 7353 ret = -ENOMEM; 31db9f7c23fbf7 Alexander Block 2012-07-25 7354 goto out; 31db9f7c23fbf7 Alexander Block 2012-07-25 7355 } 31db9f7c23fbf7 Alexander Block 2012-07-25 7356 31db9f7c23fbf7 Alexander Block 2012-07-25 7357 ret = copy_from_user(clone_sources_tmp, arg->clone_sources, e55d1153dbf484 David Sterba 2016-04-11 7358 alloc_size); 31db9f7c23fbf7 Alexander Block 2012-07-25 7359 if (ret) { 31db9f7c23fbf7 Alexander Block 2012-07-25 7360 ret = -EFAULT; 31db9f7c23fbf7 Alexander Block 2012-07-25 7361 goto out; 31db9f7c23fbf7 Alexander Block 2012-07-25 7362 } 31db9f7c23fbf7 Alexander Block 2012-07-25 7363 31db9f7c23fbf7 Alexander Block 2012-07-25 7364 for (i = 0; i < arg->clone_sources_count; i++) { 56e9357a1e8167 David Sterba 2020-05-15 7365 clone_root = btrfs_get_fs_root(fs_info, 56e9357a1e8167 David Sterba 2020-05-15 7366 clone_sources_tmp[i], true); 31db9f7c23fbf7 Alexander Block 2012-07-25 7367 if (IS_ERR(clone_root)) { 31db9f7c23fbf7 Alexander Block 2012-07-25 7368 ret = PTR_ERR(clone_root); 31db9f7c23fbf7 Alexander Block 2012-07-25 7369 goto out; 31db9f7c23fbf7 Alexander Block 2012-07-25 7370 } 2c68653787f91c David Sterba 2013-12-16 7371 spin_lock(&clone_root->root_item_lock); 5cc2b17e80cf57 Filipe Manana 2015-03-02 7372 if (!btrfs_root_readonly(clone_root) || 5cc2b17e80cf57 Filipe Manana 2015-03-02 7373 btrfs_root_dead(clone_root)) { 2c68653787f91c David Sterba 2013-12-16 7374 spin_unlock(&clone_root->root_item_lock); 0024652895e347 Josef Bacik 2020-01-24 7375 btrfs_put_root(clone_root); 2c68653787f91c David Sterba 2013-12-16 7376 ret = -EPERM; 2c68653787f91c David Sterba 2013-12-16 7377 goto out; 2c68653787f91c David Sterba 2013-12-16 7378 } 62d54f3a7fa27e Filipe Manana 2019-04-22 7379 if (clone_root->dedupe_in_progress) { 62d54f3a7fa27e Filipe Manana 2019-04-22 7380 dedupe_in_progress_warn(clone_root); 62d54f3a7fa27e Filipe Manana 2019-04-22 7381 spin_unlock(&clone_root->root_item_lock); 0024652895e347 Josef Bacik 2020-01-24 7382 btrfs_put_root(clone_root); 62d54f3a7fa27e Filipe Manana 2019-04-22 7383 ret = -EAGAIN; 62d54f3a7fa27e Filipe Manana 2019-04-22 7384 goto out; 62d54f3a7fa27e Filipe Manana 2019-04-22 7385 } 2f1f465ae6da24 Filipe Manana 2015-03-02 7386 clone_root->send_in_progress++; 2c68653787f91c David Sterba 2013-12-16 7387 spin_unlock(&clone_root->root_item_lock); 18f687d5384493 Wang Shilong 2014-01-07 7388 31db9f7c23fbf7 Alexander Block 2012-07-25 7389 sctx->clone_roots[i].root = clone_root; 2f1f465ae6da24 Filipe Manana 2015-03-02 7390 clone_sources_to_rollback = i + 1; 31db9f7c23fbf7 Alexander Block 2012-07-25 7391 } 2f91306a378099 David Sterba 2016-04-11 7392 kvfree(clone_sources_tmp); 31db9f7c23fbf7 Alexander Block 2012-07-25 7393 clone_sources_tmp = NULL; 31db9f7c23fbf7 Alexander Block 2012-07-25 7394 } 31db9f7c23fbf7 Alexander Block 2012-07-25 7395 31db9f7c23fbf7 Alexander Block 2012-07-25 7396 if (arg->parent_root) { 56e9357a1e8167 David Sterba 2020-05-15 7397 sctx->parent_root = btrfs_get_fs_root(fs_info, arg->parent_root, 56e9357a1e8167 David Sterba 2020-05-15 7398 true); b1b195969fe6d9 Stefan Behrens 2013-05-13 7399 if (IS_ERR(sctx->parent_root)) { b1b195969fe6d9 Stefan Behrens 2013-05-13 7400 ret = PTR_ERR(sctx->parent_root); 31db9f7c23fbf7 Alexander Block 2012-07-25 7401 goto out; 31db9f7c23fbf7 Alexander Block 2012-07-25 7402 } 18f687d5384493 Wang Shilong 2014-01-07 7403 2c68653787f91c David Sterba 2013-12-16 7404 spin_lock(&sctx->parent_root->root_item_lock); 2c68653787f91c David Sterba 2013-12-16 7405 sctx->parent_root->send_in_progress++; 521e0546c970c3 David Sterba 2014-04-15 7406 if (!btrfs_root_readonly(sctx->parent_root) || 521e0546c970c3 David Sterba 2014-04-15 7407 btrfs_root_dead(sctx->parent_root)) { 2c68653787f91c David Sterba 2013-12-16 7408 spin_unlock(&sctx->parent_root->root_item_lock); 2c68653787f91c David Sterba 2013-12-16 7409 ret = -EPERM; 2c68653787f91c David Sterba 2013-12-16 7410 goto out; 2c68653787f91c David Sterba 2013-12-16 7411 } 62d54f3a7fa27e Filipe Manana 2019-04-22 7412 if (sctx->parent_root->dedupe_in_progress) { 62d54f3a7fa27e Filipe Manana 2019-04-22 7413 dedupe_in_progress_warn(sctx->parent_root); 62d54f3a7fa27e Filipe Manana 2019-04-22 7414 spin_unlock(&sctx->parent_root->root_item_lock); 62d54f3a7fa27e Filipe Manana 2019-04-22 7415 ret = -EAGAIN; 62d54f3a7fa27e Filipe Manana 2019-04-22 7416 goto out; 62d54f3a7fa27e Filipe Manana 2019-04-22 7417 } 2c68653787f91c David Sterba 2013-12-16 7418 spin_unlock(&sctx->parent_root->root_item_lock); 31db9f7c23fbf7 Alexander Block 2012-07-25 7419 } 31db9f7c23fbf7 Alexander Block 2012-07-25 7420 31db9f7c23fbf7 Alexander Block 2012-07-25 7421 /* 31db9f7c23fbf7 Alexander Block 2012-07-25 7422 * Clones from send_root are allowed, but only if the clone source 31db9f7c23fbf7 Alexander Block 2012-07-25 7423 * is behind the current send position. This is checked while searching 31db9f7c23fbf7 Alexander Block 2012-07-25 7424 * for possible clone sources. 31db9f7c23fbf7 Alexander Block 2012-07-25 7425 */ 6f9a3da5da9e7e Josef Bacik 2020-01-24 7426 sctx->clone_roots[sctx->clone_roots_cnt++].root = 0024652895e347 Josef Bacik 2020-01-24 7427 btrfs_grab_root(sctx->send_root); 31db9f7c23fbf7 Alexander Block 2012-07-25 7428 31db9f7c23fbf7 Alexander Block 2012-07-25 7429 /* We do a bsearch later */ 31db9f7c23fbf7 Alexander Block 2012-07-25 7430 sort(sctx->clone_roots, sctx->clone_roots_cnt, 31db9f7c23fbf7 Alexander Block 2012-07-25 7431 sizeof(*sctx->clone_roots), __clone_root_cmp_sort, 31db9f7c23fbf7 Alexander Block 2012-07-25 7432 NULL); 896c14f97f700a Wang Shilong 2014-01-07 7433 sort_clone_roots = 1; 31db9f7c23fbf7 Alexander Block 2012-07-25 7434 9f89d5de8631c7 Filipe Manana 2019-04-15 7435 ret = flush_delalloc_roots(sctx); 9f89d5de8631c7 Filipe Manana 2019-04-15 7436 if (ret) 9f89d5de8631c7 Filipe Manana 2019-04-15 7437 goto out; 9f89d5de8631c7 Filipe Manana 2019-04-15 7438 e5fa8f865b3324 Filipe Manana 2014-10-21 7439 ret = ensure_commit_roots_uptodate(sctx); e5fa8f865b3324 Filipe Manana 2014-10-21 7440 if (ret) e5fa8f865b3324 Filipe Manana 2014-10-21 7441 goto out; e5fa8f865b3324 Filipe Manana 2014-10-21 7442 1cea5cf0e66429 Filipe Manana 2021-06-21 7443 spin_lock(&fs_info->send_reloc_lock); 1cea5cf0e66429 Filipe Manana 2021-06-21 7444 if (test_bit(BTRFS_FS_RELOC_RUNNING, &fs_info->flags)) { 1cea5cf0e66429 Filipe Manana 2021-06-21 7445 spin_unlock(&fs_info->send_reloc_lock); 9e967495e0e0ae Filipe Manana 2019-04-22 7446 btrfs_warn_rl(fs_info, 1cea5cf0e66429 Filipe Manana 2021-06-21 7447 "cannot run send because a relocation operation is in progress"); 9e967495e0e0ae Filipe Manana 2019-04-22 7448 ret = -EAGAIN; 9e967495e0e0ae Filipe Manana 2019-04-22 7449 goto out; 9e967495e0e0ae Filipe Manana 2019-04-22 7450 } 9e967495e0e0ae Filipe Manana 2019-04-22 7451 fs_info->send_in_progress++; 1cea5cf0e66429 Filipe Manana 2021-06-21 7452 spin_unlock(&fs_info->send_reloc_lock); 9e967495e0e0ae Filipe Manana 2019-04-22 7453 31db9f7c23fbf7 Alexander Block 2012-07-25 7454 ret = send_subvol(sctx); 1cea5cf0e66429 Filipe Manana 2021-06-21 7455 spin_lock(&fs_info->send_reloc_lock); 9e967495e0e0ae Filipe Manana 2019-04-22 7456 fs_info->send_in_progress--; 1cea5cf0e66429 Filipe Manana 2021-06-21 7457 spin_unlock(&fs_info->send_reloc_lock); 31db9f7c23fbf7 Alexander Block 2012-07-25 7458 if (ret < 0) 31db9f7c23fbf7 Alexander Block 2012-07-25 7459 goto out; 31db9f7c23fbf7 Alexander Block 2012-07-25 7460 c2c71324ecb471 Stefan Behrens 2013-04-10 7461 if (!(sctx->flags & BTRFS_SEND_FLAG_OMIT_END_CMD)) { 31db9f7c23fbf7 Alexander Block 2012-07-25 7462 ret = begin_cmd(sctx, BTRFS_SEND_C_END); 31db9f7c23fbf7 Alexander Block 2012-07-25 7463 if (ret < 0) 31db9f7c23fbf7 Alexander Block 2012-07-25 7464 goto out; 31db9f7c23fbf7 Alexander Block 2012-07-25 7465 ret = send_cmd(sctx); 31db9f7c23fbf7 Alexander Block 2012-07-25 7466 if (ret < 0) 31db9f7c23fbf7 Alexander Block 2012-07-25 7467 goto out; c2c71324ecb471 Stefan Behrens 2013-04-10 7468 } 31db9f7c23fbf7 Alexander Block 2012-07-25 7469 31db9f7c23fbf7 Alexander Block 2012-07-25 7470 out: 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7471 WARN_ON(sctx && !ret && !RB_EMPTY_ROOT(&sctx->pending_dir_moves)); 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7472 while (sctx && !RB_EMPTY_ROOT(&sctx->pending_dir_moves)) { 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7473 struct rb_node *n; 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7474 struct pending_dir_move *pm; 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7475 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7476 n = rb_first(&sctx->pending_dir_moves); 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7477 pm = rb_entry(n, struct pending_dir_move, node); 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7478 while (!list_empty(&pm->list)) { 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7479 struct pending_dir_move *pm2; 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7480 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7481 pm2 = list_first_entry(&pm->list, 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7482 struct pending_dir_move, list); 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7483 free_pending_move(sctx, pm2); 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7484 } 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7485 free_pending_move(sctx, pm); 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7486 } 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7487 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7488 WARN_ON(sctx && !ret && !RB_EMPTY_ROOT(&sctx->waiting_dir_moves)); 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7489 while (sctx && !RB_EMPTY_ROOT(&sctx->waiting_dir_moves)) { 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7490 struct rb_node *n; 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7491 struct waiting_dir_move *dm; 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7492 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7493 n = rb_first(&sctx->waiting_dir_moves); 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7494 dm = rb_entry(n, struct waiting_dir_move, node); 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7495 rb_erase(&dm->node, &sctx->waiting_dir_moves); 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7496 kfree(dm); 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7497 } 9f03740a956d7a Filipe David Borba Manana 2014-01-22 7498 9dc442143b9874 Filipe Manana 2014-02-19 7499 WARN_ON(sctx && !ret && !RB_EMPTY_ROOT(&sctx->orphan_dirs)); 9dc442143b9874 Filipe Manana 2014-02-19 7500 while (sctx && !RB_EMPTY_ROOT(&sctx->orphan_dirs)) { 9dc442143b9874 Filipe Manana 2014-02-19 7501 struct rb_node *n; 9dc442143b9874 Filipe Manana 2014-02-19 7502 struct orphan_dir_info *odi; 9dc442143b9874 Filipe Manana 2014-02-19 7503 9dc442143b9874 Filipe Manana 2014-02-19 7504 n = rb_first(&sctx->orphan_dirs); 9dc442143b9874 Filipe Manana 2014-02-19 7505 odi = rb_entry(n, struct orphan_dir_info, node); 9dc442143b9874 Filipe Manana 2014-02-19 7506 free_orphan_dir_info(sctx, odi); 9dc442143b9874 Filipe Manana 2014-02-19 7507 } 9dc442143b9874 Filipe Manana 2014-02-19 7508 896c14f97f700a Wang Shilong 2014-01-07 7509 if (sort_clone_roots) { 6f9a3da5da9e7e Josef Bacik 2020-01-24 7510 for (i = 0; i < sctx->clone_roots_cnt; i++) { 896c14f97f700a Wang Shilong 2014-01-07 7511 btrfs_root_dec_send_in_progress( 896c14f97f700a Wang Shilong 2014-01-07 7512 sctx->clone_roots[i].root); 0024652895e347 Josef Bacik 2020-01-24 7513 btrfs_put_root(sctx->clone_roots[i].root); 6f9a3da5da9e7e Josef Bacik 2020-01-24 7514 } 896c14f97f700a Wang Shilong 2014-01-07 7515 } else { 6f9a3da5da9e7e Josef Bacik 2020-01-24 7516 for (i = 0; sctx && i < clone_sources_to_rollback; i++) { 896c14f97f700a Wang Shilong 2014-01-07 7517 btrfs_root_dec_send_in_progress( 896c14f97f700a Wang Shilong 2014-01-07 7518 sctx->clone_roots[i].root); 0024652895e347 Josef Bacik 2020-01-24 7519 btrfs_put_root(sctx->clone_roots[i].root); 6f9a3da5da9e7e Josef Bacik 2020-01-24 7520 } 896c14f97f700a Wang Shilong 2014-01-07 7521 896c14f97f700a Wang Shilong 2014-01-07 7522 btrfs_root_dec_send_in_progress(send_root); 896c14f97f700a Wang Shilong 2014-01-07 7523 } 6f9a3da5da9e7e Josef Bacik 2020-01-24 7524 if (sctx && !IS_ERR_OR_NULL(sctx->parent_root)) { 66ef7d65c3fc6e David Sterba 2013-12-17 7525 btrfs_root_dec_send_in_progress(sctx->parent_root); 0024652895e347 Josef Bacik 2020-01-24 7526 btrfs_put_root(sctx->parent_root); 6f9a3da5da9e7e Josef Bacik 2020-01-24 7527 } 2c68653787f91c David Sterba 2013-12-16 7528 2f91306a378099 David Sterba 2016-04-11 7529 kvfree(clone_sources_tmp); 31db9f7c23fbf7 Alexander Block 2012-07-25 7530 31db9f7c23fbf7 Alexander Block 2012-07-25 7531 if (sctx) { 31db9f7c23fbf7 Alexander Block 2012-07-25 7532 if (sctx->send_filp) 31db9f7c23fbf7 Alexander Block 2012-07-25 7533 fput(sctx->send_filp); 31db9f7c23fbf7 Alexander Block 2012-07-25 7534 c03d01f3404282 David Sterba 2016-04-11 7535 kvfree(sctx->clone_roots); 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 7536 if (sctx->flags & BTRFS_SEND_FLAG_STREAM_V2) { 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 7537 vunmap(sctx->send_buf); 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 7538 for (i = 0; i < send_buf_num_pages; i++) { 7fc49b82d8d6e1 Omar Sandoval 2020-05-01 @7539 if (sctx->send_buf_pages[i]) --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/[email protected]
.config.gz
Description: application/gzip
_______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
