mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
![]() Commit 597:466b27332893 (btrfs_start_transaction: wait for commits in progress) breaks the transaction start/stop ioctls by making btrfs_start_transaction conditionally wait for the next transaction to start. If an application artificially is holding a transaction open, things deadlock. This workaround maintains a count of open ioctl-initiated transactions in fs_info, and avoids wait_current_trans() if any are currently open (in start_transaction() and btrfs_throttle()). The start transaction ioctl uses a new btrfs_start_ioctl_transaction() that _does_ call wait_current_trans(), effectively pushing the join/wait decision to the outer ioctl-initiated transaction. This more or less neuters btrfs_throttle() when ioctl-initiated transactions are in use, but that seems like a pretty fundamental consequence of wrapping lots of write()'s in a transaction. Btrfs has no way to tell if the application considers a given operation as part of it's transaction. Obviously, if the transaction start/stop ioctls aren't being used, there is no effect on current behavior. Signed-off-by: Sage Weil <sage@newdream.net> --- ctree.h | 1 + ioctl.c | 12 +++++++++++- transaction.c | 18 +++++++++++++----- transaction.h | 2 ++ 4 files changed, 27 insertions(+), 6 deletions(-) Signed-off-by: Chris Mason <chris.mason@oracle.com> |
||
---|---|---|
.. | ||
acl.c | ||
async-thread.c | ||
async-thread.h | ||
bit-radix.c | ||
bit-radix.h | ||
btrfs_inode.h | ||
compat.h | ||
COPYING | ||
crc32c.h | ||
ctree.c | ||
ctree.h | ||
dir-item.c | ||
disk-io.c | ||
disk-io.h | ||
extent-tree.c | ||
extent_io.c | ||
extent_io.h | ||
extent_map.c | ||
extent_map.h | ||
file-item.c | ||
file.c | ||
hash.c | ||
hash.h | ||
inode-item.c | ||
inode-map.c | ||
inode.c | ||
INSTALL | ||
ioctl.c | ||
ioctl.h | ||
locking.c | ||
locking.h | ||
Makefile | ||
ordered-data.c | ||
ordered-data.h | ||
orphan.c | ||
print-tree.c | ||
print-tree.h | ||
ref-cache.c | ||
ref-cache.h | ||
root-tree.c | ||
struct-funcs.c | ||
super.c | ||
sysfs.c | ||
TODO | ||
transaction.c | ||
transaction.h | ||
tree-defrag.c | ||
version.sh | ||
volumes.c | ||
volumes.h | ||
xattr.c | ||
xattr.h |