diff options
Diffstat (limited to 'fs/btrfs')
| -rw-r--r-- | fs/btrfs/disk-io.c | 3 | ||||
| -rw-r--r-- | fs/btrfs/file.c | 3 | ||||
| -rw-r--r-- | fs/btrfs/inode.c | 6 | ||||
| -rw-r--r-- | fs/btrfs/ioctl.c | 15 | ||||
| -rw-r--r-- | fs/btrfs/transaction.c | 7 |
5 files changed, 24 insertions, 10 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index fadeba6a5db9..62e0cafd6e25 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
| @@ -1614,8 +1614,6 @@ static int cleaner_kthread(void *arg) | |||
| 1614 | struct btrfs_root *root = arg; | 1614 | struct btrfs_root *root = arg; |
| 1615 | 1615 | ||
| 1616 | do { | 1616 | do { |
| 1617 | vfs_check_frozen(root->fs_info->sb, SB_FREEZE_WRITE); | ||
| 1618 | |||
| 1619 | if (!(root->fs_info->sb->s_flags & MS_RDONLY) && | 1617 | if (!(root->fs_info->sb->s_flags & MS_RDONLY) && |
| 1620 | mutex_trylock(&root->fs_info->cleaner_mutex)) { | 1618 | mutex_trylock(&root->fs_info->cleaner_mutex)) { |
| 1621 | btrfs_run_delayed_iputs(root); | 1619 | btrfs_run_delayed_iputs(root); |
| @@ -1647,7 +1645,6 @@ static int transaction_kthread(void *arg) | |||
| 1647 | do { | 1645 | do { |
| 1648 | cannot_commit = false; | 1646 | cannot_commit = false; |
| 1649 | delay = HZ * 30; | 1647 | delay = HZ * 30; |
| 1650 | vfs_check_frozen(root->fs_info->sb, SB_FREEZE_WRITE); | ||
| 1651 | mutex_lock(&root->fs_info->transaction_kthread_mutex); | 1648 | mutex_lock(&root->fs_info->transaction_kthread_mutex); |
| 1652 | 1649 | ||
| 1653 | spin_lock(&root->fs_info->trans_lock); | 1650 | spin_lock(&root->fs_info->trans_lock); |
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 9aa01ec2138d..5caf285c6e4d 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
| @@ -1379,7 +1379,7 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb, | |||
| 1379 | ssize_t err = 0; | 1379 | ssize_t err = 0; |
| 1380 | size_t count, ocount; | 1380 | size_t count, ocount; |
| 1381 | 1381 | ||
| 1382 | vfs_check_frozen(inode->i_sb, SB_FREEZE_WRITE); | 1382 | sb_start_write(inode->i_sb); |
| 1383 | 1383 | ||
| 1384 | mutex_lock(&inode->i_mutex); | 1384 | mutex_lock(&inode->i_mutex); |
| 1385 | 1385 | ||
| @@ -1469,6 +1469,7 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb, | |||
| 1469 | num_written = err; | 1469 | num_written = err; |
| 1470 | } | 1470 | } |
| 1471 | out: | 1471 | out: |
| 1472 | sb_end_write(inode->i_sb); | ||
| 1472 | current->backing_dev_info = NULL; | 1473 | current->backing_dev_info = NULL; |
| 1473 | return num_written ? num_written : err; | 1474 | return num_written ? num_written : err; |
| 1474 | } | 1475 | } |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 48bdfd2591c2..83baec24946d 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -6629,6 +6629,7 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
| 6629 | u64 page_start; | 6629 | u64 page_start; |
| 6630 | u64 page_end; | 6630 | u64 page_end; |
| 6631 | 6631 | ||
| 6632 | sb_start_pagefault(inode->i_sb); | ||
| 6632 | ret = btrfs_delalloc_reserve_space(inode, PAGE_CACHE_SIZE); | 6633 | ret = btrfs_delalloc_reserve_space(inode, PAGE_CACHE_SIZE); |
| 6633 | if (!ret) { | 6634 | if (!ret) { |
| 6634 | ret = file_update_time(vma->vm_file); | 6635 | ret = file_update_time(vma->vm_file); |
| @@ -6718,12 +6719,15 @@ again: | |||
| 6718 | unlock_extent_cached(io_tree, page_start, page_end, &cached_state, GFP_NOFS); | 6719 | unlock_extent_cached(io_tree, page_start, page_end, &cached_state, GFP_NOFS); |
| 6719 | 6720 | ||
| 6720 | out_unlock: | 6721 | out_unlock: |
| 6721 | if (!ret) | 6722 | if (!ret) { |
| 6723 | sb_end_pagefault(inode->i_sb); | ||
| 6722 | return VM_FAULT_LOCKED; | 6724 | return VM_FAULT_LOCKED; |
| 6725 | } | ||
| 6723 | unlock_page(page); | 6726 | unlock_page(page); |
| 6724 | out: | 6727 | out: |
| 6725 | btrfs_delalloc_release_space(inode, PAGE_CACHE_SIZE); | 6728 | btrfs_delalloc_release_space(inode, PAGE_CACHE_SIZE); |
| 6726 | out_noreserve: | 6729 | out_noreserve: |
| 6730 | sb_end_pagefault(inode->i_sb); | ||
| 6727 | return ret; | 6731 | return ret; |
| 6728 | } | 6732 | } |
| 6729 | 6733 | ||
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 43f0012016e3..bc2f6ffff3cf 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
| @@ -195,6 +195,10 @@ static int btrfs_ioctl_setflags(struct file *file, void __user *arg) | |||
| 195 | if (!inode_owner_or_capable(inode)) | 195 | if (!inode_owner_or_capable(inode)) |
| 196 | return -EACCES; | 196 | return -EACCES; |
| 197 | 197 | ||
| 198 | ret = mnt_want_write_file(file); | ||
| 199 | if (ret) | ||
| 200 | return ret; | ||
| 201 | |||
| 198 | mutex_lock(&inode->i_mutex); | 202 | mutex_lock(&inode->i_mutex); |
| 199 | 203 | ||
| 200 | ip_oldflags = ip->flags; | 204 | ip_oldflags = ip->flags; |
| @@ -209,10 +213,6 @@ static int btrfs_ioctl_setflags(struct file *file, void __user *arg) | |||
| 209 | } | 213 | } |
| 210 | } | 214 | } |
| 211 | 215 | ||
| 212 | ret = mnt_want_write_file(file); | ||
| 213 | if (ret) | ||
| 214 | goto out_unlock; | ||
| 215 | |||
| 216 | if (flags & FS_SYNC_FL) | 216 | if (flags & FS_SYNC_FL) |
| 217 | ip->flags |= BTRFS_INODE_SYNC; | 217 | ip->flags |= BTRFS_INODE_SYNC; |
| 218 | else | 218 | else |
| @@ -275,9 +275,9 @@ static int btrfs_ioctl_setflags(struct file *file, void __user *arg) | |||
| 275 | inode->i_flags = i_oldflags; | 275 | inode->i_flags = i_oldflags; |
| 276 | } | 276 | } |
| 277 | 277 | ||
| 278 | mnt_drop_write_file(file); | ||
| 279 | out_unlock: | 278 | out_unlock: |
| 280 | mutex_unlock(&inode->i_mutex); | 279 | mutex_unlock(&inode->i_mutex); |
| 280 | mnt_drop_write_file(file); | ||
| 281 | return ret; | 281 | return ret; |
| 282 | } | 282 | } |
| 283 | 283 | ||
| @@ -664,6 +664,10 @@ static noinline int btrfs_mksubvol(struct path *parent, | |||
| 664 | struct dentry *dentry; | 664 | struct dentry *dentry; |
| 665 | int error; | 665 | int error; |
| 666 | 666 | ||
| 667 | error = mnt_want_write(parent->mnt); | ||
| 668 | if (error) | ||
| 669 | return error; | ||
| 670 | |||
| 667 | mutex_lock_nested(&dir->i_mutex, I_MUTEX_PARENT); | 671 | mutex_lock_nested(&dir->i_mutex, I_MUTEX_PARENT); |
| 668 | 672 | ||
| 669 | dentry = lookup_one_len(name, parent->dentry, namelen); | 673 | dentry = lookup_one_len(name, parent->dentry, namelen); |
| @@ -699,6 +703,7 @@ out_dput: | |||
| 699 | dput(dentry); | 703 | dput(dentry); |
| 700 | out_unlock: | 704 | out_unlock: |
| 701 | mutex_unlock(&dir->i_mutex); | 705 | mutex_unlock(&dir->i_mutex); |
| 706 | mnt_drop_write(parent->mnt); | ||
| 702 | return error; | 707 | return error; |
| 703 | } | 708 | } |
| 704 | 709 | ||
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 7ac7cdcc294e..17be3dedacba 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c | |||
| @@ -335,6 +335,8 @@ again: | |||
| 335 | if (!h) | 335 | if (!h) |
| 336 | return ERR_PTR(-ENOMEM); | 336 | return ERR_PTR(-ENOMEM); |
| 337 | 337 | ||
| 338 | sb_start_intwrite(root->fs_info->sb); | ||
| 339 | |||
| 338 | if (may_wait_transaction(root, type)) | 340 | if (may_wait_transaction(root, type)) |
| 339 | wait_current_trans(root); | 341 | wait_current_trans(root); |
| 340 | 342 | ||
| @@ -345,6 +347,7 @@ again: | |||
| 345 | } while (ret == -EBUSY); | 347 | } while (ret == -EBUSY); |
| 346 | 348 | ||
| 347 | if (ret < 0) { | 349 | if (ret < 0) { |
| 350 | sb_end_intwrite(root->fs_info->sb); | ||
| 348 | kmem_cache_free(btrfs_trans_handle_cachep, h); | 351 | kmem_cache_free(btrfs_trans_handle_cachep, h); |
| 349 | return ERR_PTR(ret); | 352 | return ERR_PTR(ret); |
| 350 | } | 353 | } |
| @@ -548,6 +551,8 @@ static int __btrfs_end_transaction(struct btrfs_trans_handle *trans, | |||
| 548 | btrfs_trans_release_metadata(trans, root); | 551 | btrfs_trans_release_metadata(trans, root); |
| 549 | trans->block_rsv = NULL; | 552 | trans->block_rsv = NULL; |
| 550 | 553 | ||
| 554 | sb_end_intwrite(root->fs_info->sb); | ||
| 555 | |||
| 551 | if (lock && !atomic_read(&root->fs_info->open_ioctl_trans) && | 556 | if (lock && !atomic_read(&root->fs_info->open_ioctl_trans) && |
| 552 | should_end_transaction(trans, root)) { | 557 | should_end_transaction(trans, root)) { |
| 553 | trans->transaction->blocked = 1; | 558 | trans->transaction->blocked = 1; |
| @@ -1578,6 +1583,8 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans, | |||
| 1578 | put_transaction(cur_trans); | 1583 | put_transaction(cur_trans); |
| 1579 | put_transaction(cur_trans); | 1584 | put_transaction(cur_trans); |
| 1580 | 1585 | ||
| 1586 | sb_end_intwrite(root->fs_info->sb); | ||
| 1587 | |||
| 1581 | trace_btrfs_transaction_commit(root); | 1588 | trace_btrfs_transaction_commit(root); |
| 1582 | 1589 | ||
| 1583 | btrfs_scrub_continue(root); | 1590 | btrfs_scrub_continue(root); |
