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); |