Userspace utilities to manage btrfs filesystems
Go to file
Zhao Lei 73e211a7a8 btrfs-progs: Fix wrong address accessing by subthread in btrfs-convert
btrfs-convert sometimes show 'Assertion failed' in converting a nearly blank
file system, as:
  create btrfs filesystem:
          blocksize: 4096
          nodesize:  16384
          features:  extref, skinny-metadata (default)
  creating btrfs metadata.

  creating ext2fs image file.
  trans 7 running 5
  ctree.c:363: btrfs_cow_block: Assertion `1` failed.
  btrfs-convert(btrfs_cow_block+0x92)[0x40acaf]
  btrfs-convert(btrfs_search_slot+0x1cb)[0x40c50f]
  btrfs-convert(btrfs_csum_file_block+0x20f)[0x41d83a]
  btrfs-convert[0x43422d]
  btrfs-convert[0x4342cd]
  btrfs-convert[0x4345ca]
  btrfs-convert[0x434767]
  btrfs-convert[0x435770]
  btrfs-convert[0x439748]
  btrfs-convert(main+0x13f8)[0x43b09d]
  /lib64/libc.so.6(__libc_start_main+0xfd)[0x335e01ecdd]
  btrfs-convert[0x407649]

Reason is complex:
1: main thread allocated a block of memory,
   shared with sub thread
2: main thread killed sub thread, and free above memory
3: main thread malloc a new one(in same address),
   and use it
4: sub thread(which is not really quit), write into
   this address, and caused this bug.

By adding some debug lines into code, we can see following output:
  create btrfs filesystem:
          blocksize: 4096
          nodesize:  16384
          features:  extref, skinny-metadata (default)
  creating btrfs metadata.
  1:  ctx(0x7ffe1abde230)->info=0xc65b80
  2:  task_period_start: will create periodic.timer_fd
  3:  task_stop: info->periodic.timer_fd = NULL
  4:  task_stop: begin pthread_cancel info->id=-1746053376
  5:  task_stop: done pthread_cancel ret=0
  6:  task_stop: begin info->postfn
  7:  task_period_stop: periodic.timer_fd NULL
  8:  task_stop: done info->postfn
  9:  task_stop: done all
  10: creating ext2fs image file.
  trans 7 running 5
  11: task_period_start: create periodic.timer_fd done info->periodic.timer_fd(0xc65b80)=7
  12: btrfs_cow_block: root->fs_info->generation(0xc63568) = 5 trans->transid(0xc65b80)=7
  13: ctree.c:368: btrfs_cow_block: Assertion `1` failed.
  ./btrfs-convert(btrfs_cow_block+0xda)[0x40ad37]
  ./btrfs-convert(btrfs_search_slot+0x1cb)[0x40c5b4]
  ./btrfs-convert(btrfs_insert_empty_items+0xac)[0x40d9f6]
  ./btrfs-convert(btrfs_record_file_extent+0xc0)[0x4183fe]
  ./btrfs-convert[0x435796]
  ./btrfs-convert[0x439b0c]
  ./btrfs-convert(main+0x13f8)[0x43b45d]
  /lib64/libc.so.6(__libc_start_main+0xfd)[0x335e01ecdd]
  ./btrfs-convert[0x407689]
  Conclusion:
  a: subthread should exit before step 5, but it is still running
     in step 11
  b: task_stop() hadn't close periodic.timer_fd in step3,
     because periodic.timer_fd is not initialized yet.
  c. address of 0xc65b80 is overwrited by subthread in step 11,
     but this address is freed and re-malloc by main thread
     before step 10, and used for trans->transid.
  d: trans->transid which is overwrite by subthread caused error
     in step 13.

Fix:
  pthread_cancel() only send a cancellation request to the thread,
  thread will quit in next cancellation point by default.
  To make sub thread quit in time, this patch add pthread_join()
  after pthread_cancel() call.
  And to make pthread_join() works, pthread_detach() is removed.

Signed-off-by: Zhao Lei <zhaolei@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2015-08-31 19:25:10 +02:00
Documentation btrfs-progs: inspect: add command min-dev-size 2015-08-31 19:25:08 +02:00
tests btrfs-progs: tests: Add -o loop to fsck-tests/012-leaf-corruption 2015-08-31 19:25:10 +02:00
.gitignore btrfs-progs: update .gitignore 2015-06-02 17:16:47 +02:00
autogen.sh btrfs-progs: build, make autogen.sh work on older systems 2015-01-28 19:03:23 +01:00
backref.c btrfs-progs: read_tree_block() and read_node_slot() cleanup. 2015-02-02 19:21:24 +01:00
backref.h btrfs-progs: unify header file inclusion protections 2015-01-21 17:49:26 +01:00
bcp
bitops.h btrfs-progs: compat: define DIV_ROUND_UP if not already defined 2015-06-05 23:29:59 +02:00
btrfs-calc-size.c Btrfs-progs: fix compile warnings 2015-04-14 15:11:24 +02:00
btrfs-completion btrfs-progs: inspect: add command min-dev-size 2015-08-31 19:25:08 +02:00
btrfs-convert.c btrfs-progs: convert: Avoid allocating metadata extent crossing stripe boundary 2015-08-31 19:25:10 +02:00
btrfs-corrupt-block.c btrfs-progs: let corrupt-block kill nbytes 2015-07-03 18:07:17 +02:00
btrfs-crc.c btrfs-progs: use check_argc_* to check arg number for all tools 2014-08-22 15:07:02 +02:00
btrfs-debug-tree.c btrfs-progs: accept --help as option in the standalone utilities 2015-06-11 00:23:30 +02:00
btrfs-debugfs btrfs-progs: Add simple python front end to the search ioctl 2014-12-04 17:03:49 +01:00
btrfs-find-root.c btrfs-progs: accept --help as option in the standalone utilities 2015-06-11 00:23:30 +02:00
btrfs-fragments.c btrfs-progs: drop feature defines from C files, in favour of CFLAGS defines 2015-01-27 14:45:59 +01:00
btrfs-image.c btrfs-progs: accept --help as option in the standalone utilities 2015-06-11 00:23:30 +02:00
btrfs-list.c btrfs-progs: add missing includes to header files 2015-06-10 02:52:21 +02:00
btrfs-list.h btrfs-progs: add missing includes to header files 2015-06-10 02:52:21 +02:00
btrfs-map-logical.c btrfs-progs: map-logical: Rework map-logical logics 2015-06-17 16:10:18 +02:00
btrfs-select-super.c btrfs-progs: autoconf: use standard PACKAGE_* macros 2015-01-28 18:00:58 +01:00
btrfs-show-super.c btrfs-progs: show-super: print human readable text for super flags 2015-05-14 15:41:07 +02:00
btrfs-zero-log.c btrfs-progs: cleanup and deprecate btrfs-zero-log 2015-06-05 18:02:08 +02:00
btrfs.c btrfs-progs: print compact help for btrfs 2015-06-09 14:27:54 +02:00
btrfsck.h btrfs-progs: add missing includes to header files 2015-06-10 02:52:21 +02:00
btrfstune.c btrfs-progs: btrfstune: print correct current uuid during rewrite 2015-06-18 19:49:44 +02:00
chunk-recover.c Btrfs-progs: skip opening all devices with restore 2015-02-09 14:53:15 -05:00
cmds-balance.c btrfs-progs: add command group info strings 2015-06-09 14:26:33 +02:00
cmds-check.c btrfs-progs: fsck: Check if a metadata tree block crossing stripe boundary 2015-08-31 19:25:10 +02:00
cmds-device.c btrfs-progs: unify naming of command handlers 2015-08-31 19:25:09 +02:00
cmds-fi-usage.c btrfs-progs: cleanup, rename *disk_usage* files to usage 2015-04-22 18:21:48 +02:00
cmds-fi-usage.h btrfs-progs: add missing includes to header files 2015-06-10 02:52:21 +02:00
cmds-filesystem.c btrfs-progs: Accurate errormsg for resize operation on no-enouth-free-space case 2015-08-31 19:25:09 +02:00
cmds-inspect.c btrfs-progs: unify naming of command handlers 2015-08-31 19:25:09 +02:00
cmds-property.c btrfs-progs: prop: use macro terminator for command list 2015-08-31 19:25:09 +02:00
cmds-qgroup.c btrfs-progs: add command group info strings 2015-06-09 14:26:33 +02:00
cmds-quota.c btrfs-progs: add command group info strings 2015-06-09 14:26:33 +02:00
cmds-receive.c btrfs-progs: receive: use static buffer for cur_subvol path 2015-06-16 17:15:03 +02:00
cmds-replace.c btrfs-progs: unify naming of command handlers 2015-08-31 19:25:09 +02:00
cmds-rescue.c btrfs-progs: unify naming of command handlers 2015-08-31 19:25:09 +02:00
cmds-restore.c btrfs-progs: restore: add more long option variants 2015-05-14 15:41:06 +02:00
cmds-scrub.c btrfs-progs: use PATH_MAX instead of BTRFS_PATH_NAME_MAX 2015-06-12 16:44:47 +02:00
cmds-send.c btrfs-progs: send: use static buffer for output file name 2015-06-15 14:09:10 +02:00
cmds-subvolume.c btrfs-progs: unify naming of command handlers 2015-08-31 19:25:09 +02:00
commands.h btrfs-progs: alias btrfs device delete to btrfs device remove 2015-06-26 16:33:39 +02:00
configure.ac btrfs-progs: configure: fix typo in summary 2015-06-22 01:13:48 +02:00
COPYING
crc32c.c
crc32c.h
ctree.c btrfs-progs: check for item end outside of leaf 2015-07-01 15:20:23 +02:00
ctree.h btrfs-progs: convert: Avoid allocating metadata extent crossing stripe boundary 2015-08-31 19:25:10 +02:00
dir-item.c Btrfs-progs: delete bogus dir indexes 2014-10-14 10:45:03 +02:00
dir-test.c
disk-io.c btrfs-progs: disk-io: Support commit transaction on chunk tree 2015-07-10 14:29:09 +02:00
disk-io.h btrfs-progs: export read_extent_data function 2015-06-17 16:08:35 +02:00
extent_io.c btrfs-progs: Move (set/clear_)extent_buffer_uptodate() to extent_io.h. 2015-02-27 17:44:11 +01:00
extent_io.h btrfs-progs: Move (set/clear_)extent_buffer_uptodate() to extent_io.h. 2015-02-27 17:44:11 +01:00
extent-cache.c btrfs-progs: Add last_cache_extent() for extent-cache. 2014-12-10 11:54:10 +01:00
extent-cache.h btrfs-progs: unify header file inclusion protections 2015-01-21 17:49:26 +01:00
extent-tree.c btrfs-progs: convert: Avoid allocating metadata extent crossing stripe boundary 2015-08-31 19:25:10 +02:00
file-item.c btrfs-progs: remove btrfs_release_path before btrfs_free_path 2014-09-14 19:06:12 +02:00
file.c btrfs-progs: Add btrfs_get_extent() and btrfs_punch_hole(). 2015-02-02 14:16:38 +01:00
find-root.c btrfs-progs: Add new find-root.[ch] infrastructure 2015-02-11 18:34:04 +01:00
find-root.h btrfs-progs: Add new find-root.[ch] infrastructure 2015-02-11 18:34:04 +01:00
free-space-cache.c btrfs-progs: check for matching free space in cache 2015-04-24 15:42:04 +02:00
free-space-cache.h btrfs-progs: add missing includes to header files 2015-06-10 02:52:21 +02:00
fsck.btrfs btrfs-progs: fsck.btrfs: Fix bashism and bad getopts processing 2015-05-21 16:53:44 +02:00
hash.h btrfs-progs: unify header file inclusion protections 2015-01-21 17:49:26 +01:00
hasher.c
help.c btrfs-progs: no extra newline between aliased commands in help text 2015-06-26 16:44:29 +02:00
inode-item.c btrfs-progs: fix overflow check in btrfs_insert_inode_ref 2014-12-30 15:48:55 +01:00
inode-map.c btrfs-progs: remove btrfs_release_path before btrfs_free_path 2014-09-14 19:06:12 +02:00
inode.c btrfs-progs: handle orphan creation error in btrfs_unlink 2015-01-06 18:46:03 +01:00
INSTALL btrfs-progs: INSTALL: fix typos 2015-06-22 01:39:27 +02:00
ioctl-test.c
ioctl.h btrfs-progs: add missing includes to header files 2015-06-10 02:52:21 +02:00
kerncompat.h btrfs-progs: unify header file inclusion protections 2015-01-21 17:49:26 +01:00
library-test.c btrfs-progs: build, add basic build test for library 2014-11-07 17:52:57 +01:00
list_sort.c
list_sort.h
list.h
Makefile.in btrfs-progs: Makefile: fix typo, dependencies for cmds-* files 2015-06-16 17:15:03 +02:00
mkfs.c btrfs-progs: mkfs: catch errors after transaction start 2015-08-31 19:25:09 +02:00
print-tree.c btrfs-progs: print-tree: print stripe len of a chunk 2015-08-31 19:25:09 +02:00
print-tree.h btrfs-progs: unify header file inclusion protections 2015-01-21 17:49:26 +01:00
props.c btrfs-progs: Introduce change_header_uuid function 2015-05-14 15:41:07 +02:00
props.h btrfs-progs: unify header file inclusion protections 2015-01-21 17:49:26 +01:00
qgroup-verify.c btrfs-progs: read_tree_block() and read_node_slot() cleanup. 2015-02-02 19:21:24 +01:00
qgroup-verify.h btrfs-progs: add missing includes to header files 2015-06-10 02:52:21 +02:00
qgroup.c btrfs-progs: qgroup: show 'none' when we did not limit it on this qgroup 2015-06-05 18:35:17 +02:00
qgroup.h btrfs-progs: add missing includes to header files 2015-06-10 02:52:21 +02:00
quick-test.c
radix-tree.c btrfs-progs: Remove a unused function root_gtp_mask(). 2014-12-19 15:04:56 +01:00
radix-tree.h
raid6.c
random-test.c
rbtree_augmented.h btrfs-progs: libbtrfs, make exported headers compatible with C++ 2014-11-03 23:50:50 +01:00
rbtree-utils.c Btrfs-progs: break out rbtree util functions 2014-10-14 10:39:39 +02:00
rbtree-utils.h btrfs-progs: libbtrfs, make exported headers compatible with C++ 2014-11-03 23:50:50 +01:00
rbtree.c Btrfs-progs: update rbtree libs 2014-10-14 10:39:40 +02:00
rbtree.h btrfs-progs: libbtrfs, make exported headers compatible with C++ 2014-11-03 23:50:50 +01:00
repair.c
repair.h btrfs-progs: add missing includes to header files 2015-06-10 02:52:21 +02:00
root-tree.c
send-stream.c btrfs-progs: fix compiler warning 2014-11-07 18:14:38 +01:00
send-stream.h btrfs-progs: add missing includes to header files 2015-06-10 02:52:21 +02:00
send-test.c btrfs-progs: drop feature defines from C files, in favour of CFLAGS defines 2015-01-27 14:45:59 +01:00
send-utils.c btrfs-progs: drop argument from attribute deprecated 2015-06-30 15:05:07 +02:00
send-utils.h btrfs-progs: drop argument from attribute deprecated 2015-06-30 15:05:07 +02:00
send.h btrfs-progs: unify header file inclusion protections 2015-01-21 17:49:26 +01:00
show-blocks
string-table.c btrfs-progs: Add helpers functions to handle the printing of data in tabular format 2014-12-04 16:48:09 +01:00
string-table.h btrfs-progs: unify header file inclusion protections 2015-01-21 17:49:26 +01:00
super-recover.c Btrfs-progs: skip opening all devices with restore 2015-02-09 14:53:15 -05:00
task-utils.c btrfs-progs: Fix wrong address accessing by subthread in btrfs-convert 2015-08-31 19:25:10 +02:00
task-utils.h btrfs-progs: unify header file inclusion protections 2015-01-21 17:49:26 +01:00
transaction.h btrfs-progs: add missing includes to header files 2015-06-10 02:52:21 +02:00
ulist.c btrfs-progs: import ulist 2014-08-22 14:39:33 +02:00
ulist.h btrfs-progs: unify header file inclusion protections 2015-01-21 17:49:26 +01:00
utils-lib.c btrfs-progs: drop feature defines from C files, in favour of CFLAGS defines 2015-01-27 14:45:59 +01:00
utils.c btrfs-progs: utils: missing newline in error messages when checking dup 2015-07-14 18:51:52 +02:00
utils.h btrfs-progs: drop unused parameter from make_btrfs 2015-07-01 17:54:43 +02:00
uuid-tree.c
version.h.in btrfs-progs: re-introduce BTRFS_BUILD_VERSION in version.h 2015-03-16 18:40:06 +01:00
version.sh Btrfs progs v4.1.2 2015-07-14 13:45:36 +02:00
volumes.c btrfs-progs: btrfstune: fix a bug which makes unfinished fsid change unrecoverable 2015-05-26 17:25:10 +02:00
volumes.h btrfs-progs: fsck: Check if a metadata tree block crossing stripe boundary 2015-08-31 19:25:10 +02:00