]> git.baikalelectronics.ru Git - kernel.git/commit
Btrfs: fix wrong handle at error path of create_snapshot() when the commit fails
authorMiao Xie <miaox@cn.fujitsu.com>
Mon, 4 Mar 2013 09:44:29 +0000 (09:44 +0000)
committerJosef Bacik <jbacik@fusionio.com>
Mon, 4 Mar 2013 21:33:22 +0000 (16:33 -0500)
commit204ff1e63ada770f5b38ec17fefc5e615b2916f5
tree58634fad399097dbde3d4969e498cb913a48aa96
parent212f61bdaeadb649ed3b554dd3740c2cc3993d45
Btrfs: fix wrong handle at error path of create_snapshot() when the commit fails

There are several bugs at error path of create_snapshot() when the
transaction commitment failed.
- access the freed transaction handler. At the end of the
  transaction commitment, the transaction handler was freed, so we
  should not access it after the transaction commitment.
- we were not aware of the error which happened during the snapshot
  creation if we submitted a async transaction commitment.
- pending snapshot access vs pending snapshot free. when something
  wrong happened after we submitted a async transaction commitment,
  the transaction committer would cleanup the pending snapshots and
  free them. But the snapshot creators were not aware of it, they
  would access the freed pending snapshots.

This patch fixes the above problems by:
- remove the dangerous code that accessed the freed handler
- assign ->error if the error happens during the snapshot creation
- the transaction committer doesn't free the pending snapshots,
  just assigns the error number and evicts them before we unblock
  the transaction.

Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Miao Xie <miaox@cn.fujitsu.com>
Signed-off-by: Josef Bacik <jbacik@fusionio.com>
fs/btrfs/disk-io.c
fs/btrfs/ioctl.c
fs/btrfs/transaction.c