aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs')
-rw-r--r--fs/btrfs/ctree.h13
-rw-r--r--fs/btrfs/disk-io.c5
-rw-r--r--fs/btrfs/extent_io.c3
-rw-r--r--fs/btrfs/file.c3
-rw-r--r--fs/btrfs/inode.c15
-rw-r--r--fs/btrfs/ioctl.c10
-rw-r--r--fs/btrfs/ordered-data.c2
-rw-r--r--fs/btrfs/relocation.c2
-rw-r--r--fs/btrfs/send.c10
-rw-r--r--fs/btrfs/super.c49
-rw-r--r--fs/btrfs/transaction.c7
-rw-r--r--fs/btrfs/volumes.c4
12 files changed, 85 insertions, 38 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index c38734a07a65..0d195b507660 100644
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -3341,10 +3341,22 @@ ssize_t btrfs_listxattr(struct dentry *dentry, char *buffer, size_t size);
3341/* super.c */ 3341/* super.c */
3342int btrfs_parse_options(struct btrfs_root *root, char *options); 3342int btrfs_parse_options(struct btrfs_root *root, char *options);
3343int btrfs_sync_fs(struct super_block *sb, int wait); 3343int btrfs_sync_fs(struct super_block *sb, int wait);
3344
3345#ifdef CONFIG_PRINTK
3346__printf(2, 3)
3344void btrfs_printk(struct btrfs_fs_info *fs_info, const char *fmt, ...); 3347void btrfs_printk(struct btrfs_fs_info *fs_info, const char *fmt, ...);
3348#else
3349static inline __printf(2, 3)
3350void btrfs_printk(struct btrfs_fs_info *fs_info, const char *fmt, ...)
3351{
3352}
3353#endif
3354
3355__printf(5, 6)
3345void __btrfs_std_error(struct btrfs_fs_info *fs_info, const char *function, 3356void __btrfs_std_error(struct btrfs_fs_info *fs_info, const char *function,
3346 unsigned int line, int errno, const char *fmt, ...); 3357 unsigned int line, int errno, const char *fmt, ...);
3347 3358
3359
3348void __btrfs_abort_transaction(struct btrfs_trans_handle *trans, 3360void __btrfs_abort_transaction(struct btrfs_trans_handle *trans,
3349 struct btrfs_root *root, const char *function, 3361 struct btrfs_root *root, const char *function,
3350 unsigned int line, int errno); 3362 unsigned int line, int errno);
@@ -3385,6 +3397,7 @@ do { \
3385 (errno), fmt, ##args); \ 3397 (errno), fmt, ##args); \
3386} while (0) 3398} while (0)
3387 3399
3400__printf(5, 6)
3388void __btrfs_panic(struct btrfs_fs_info *fs_info, const char *function, 3401void __btrfs_panic(struct btrfs_fs_info *fs_info, const char *function,
3389 unsigned int line, int errno, const char *fmt, ...); 3402 unsigned int line, int errno, const char *fmt, ...);
3390 3403
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 29c69e60d3b0..22e98e04c2ea 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -1116,7 +1116,7 @@ void clean_tree_block(struct btrfs_trans_handle *trans, struct btrfs_root *root,
1116 spin_unlock(&root->fs_info->delalloc_lock); 1116 spin_unlock(&root->fs_info->delalloc_lock);
1117 btrfs_panic(root->fs_info, -EOVERFLOW, 1117 btrfs_panic(root->fs_info, -EOVERFLOW,
1118 "Can't clear %lu bytes from " 1118 "Can't clear %lu bytes from "
1119 " dirty_mdatadata_bytes (%lu)", 1119 " dirty_mdatadata_bytes (%llu)",
1120 buf->len, 1120 buf->len,
1121 root->fs_info->dirty_metadata_bytes); 1121 root->fs_info->dirty_metadata_bytes);
1122 } 1122 }
@@ -1616,8 +1616,6 @@ static int cleaner_kthread(void *arg)
1616 struct btrfs_root *root = arg; 1616 struct btrfs_root *root = arg;
1617 1617
1618 do { 1618 do {
1619 vfs_check_frozen(root->fs_info->sb, SB_FREEZE_WRITE);
1620
1621 if (!(root->fs_info->sb->s_flags & MS_RDONLY) && 1619 if (!(root->fs_info->sb->s_flags & MS_RDONLY) &&
1622 mutex_trylock(&root->fs_info->cleaner_mutex)) { 1620 mutex_trylock(&root->fs_info->cleaner_mutex)) {
1623 btrfs_run_delayed_iputs(root); 1621 btrfs_run_delayed_iputs(root);
@@ -1649,7 +1647,6 @@ static int transaction_kthread(void *arg)
1649 do { 1647 do {
1650 cannot_commit = false; 1648 cannot_commit = false;
1651 delay = HZ * 30; 1649 delay = HZ * 30;
1652 vfs_check_frozen(root->fs_info->sb, SB_FREEZE_WRITE);
1653 mutex_lock(&root->fs_info->transaction_kthread_mutex); 1650 mutex_lock(&root->fs_info->transaction_kthread_mutex);
1654 1651
1655 spin_lock(&root->fs_info->trans_lock); 1652 spin_lock(&root->fs_info->trans_lock);
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 49085f2336d2..4c878476bb91 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -929,7 +929,8 @@ int set_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, int bits,
929 929
930 930
931/** 931/**
932 * convert_extent - convert all bits in a given range from one bit to another 932 * convert_extent_bit - convert all bits in a given range from one bit to
933 * another
933 * @tree: the io tree to search 934 * @tree: the io tree to search
934 * @start: the start offset in bytes 935 * @start: the start offset in bytes
935 * @end: the end offset in bytes (inclusive) 936 * @end: the end offset in bytes (inclusive)
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 }
1471out: 1471out:
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 6ba80b902877..ec154f954646 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -324,7 +324,8 @@ static noinline int add_async_extent(struct async_cow *cow,
324 * If this code finds it can't get good compression, it puts an 324 * If this code finds it can't get good compression, it puts an
325 * entry onto the work queue to write the uncompressed bytes. This 325 * entry onto the work queue to write the uncompressed bytes. This
326 * makes sure that both compressed inodes and uncompressed inodes 326 * makes sure that both compressed inodes and uncompressed inodes
327 * are written in the same order that pdflush sent them down. 327 * are written in the same order that the flusher thread sent them
328 * down.
328 */ 329 */
329static noinline int compress_file_range(struct inode *inode, 330static noinline int compress_file_range(struct inode *inode,
330 struct page *locked_page, 331 struct page *locked_page,
@@ -4249,7 +4250,7 @@ static void btrfs_dentry_release(struct dentry *dentry)
4249} 4250}
4250 4251
4251static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry, 4252static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry,
4252 struct nameidata *nd) 4253 unsigned int flags)
4253{ 4254{
4254 struct dentry *ret; 4255 struct dentry *ret;
4255 4256
@@ -4903,7 +4904,7 @@ out_unlock:
4903} 4904}
4904 4905
4905static int btrfs_create(struct inode *dir, struct dentry *dentry, 4906static int btrfs_create(struct inode *dir, struct dentry *dentry,
4906 umode_t mode, struct nameidata *nd) 4907 umode_t mode, bool excl)
4907{ 4908{
4908 struct btrfs_trans_handle *trans; 4909 struct btrfs_trans_handle *trans;
4909 struct btrfs_root *root = BTRFS_I(dir)->root; 4910 struct btrfs_root *root = BTRFS_I(dir)->root;
@@ -6631,6 +6632,7 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
6631 u64 page_start; 6632 u64 page_start;
6632 u64 page_end; 6633 u64 page_end;
6633 6634
6635 sb_start_pagefault(inode->i_sb);
6634 ret = btrfs_delalloc_reserve_space(inode, PAGE_CACHE_SIZE); 6636 ret = btrfs_delalloc_reserve_space(inode, PAGE_CACHE_SIZE);
6635 if (!ret) { 6637 if (!ret) {
6636 ret = file_update_time(vma->vm_file); 6638 ret = file_update_time(vma->vm_file);
@@ -6720,12 +6722,15 @@ again:
6720 unlock_extent_cached(io_tree, page_start, page_end, &cached_state, GFP_NOFS); 6722 unlock_extent_cached(io_tree, page_start, page_end, &cached_state, GFP_NOFS);
6721 6723
6722out_unlock: 6724out_unlock:
6723 if (!ret) 6725 if (!ret) {
6726 sb_end_pagefault(inode->i_sb);
6724 return VM_FAULT_LOCKED; 6727 return VM_FAULT_LOCKED;
6728 }
6725 unlock_page(page); 6729 unlock_page(page);
6726out: 6730out:
6727 btrfs_delalloc_release_space(inode, PAGE_CACHE_SIZE); 6731 btrfs_delalloc_release_space(inode, PAGE_CACHE_SIZE);
6728out_noreserve: 6732out_noreserve:
6733 sb_end_pagefault(inode->i_sb);
6729 return ret; 6734 return ret;
6730} 6735}
6731 6736
@@ -6997,7 +7002,7 @@ void btrfs_destroy_inode(struct inode *inode)
6997 struct btrfs_ordered_extent *ordered; 7002 struct btrfs_ordered_extent *ordered;
6998 struct btrfs_root *root = BTRFS_I(inode)->root; 7003 struct btrfs_root *root = BTRFS_I(inode)->root;
6999 7004
7000 WARN_ON(!list_empty(&inode->i_dentry)); 7005 WARN_ON(!hlist_empty(&inode->i_dentry));
7001 WARN_ON(inode->i_data.nrpages); 7006 WARN_ON(inode->i_data.nrpages);
7002 WARN_ON(BTRFS_I(inode)->outstanding_extents); 7007 WARN_ON(BTRFS_I(inode)->outstanding_extents);
7003 WARN_ON(BTRFS_I(inode)->reserved_extents); 7008 WARN_ON(BTRFS_I(inode)->reserved_extents);
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index a1fbca0a1003..9df50fa8a078 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
diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c
index 643335a4fe3c..051c7fe551dd 100644
--- a/fs/btrfs/ordered-data.c
+++ b/fs/btrfs/ordered-data.c
@@ -596,7 +596,7 @@ void btrfs_start_ordered_extent(struct inode *inode,
596 /* 596 /*
597 * pages in the range can be dirty, clean or writeback. We 597 * pages in the range can be dirty, clean or writeback. We
598 * start IO on any dirty ones so the wait doesn't stall waiting 598 * start IO on any dirty ones so the wait doesn't stall waiting
599 * for pdflush to find them 599 * for the flusher thread to find them
600 */ 600 */
601 if (!test_bit(BTRFS_ORDERED_DIRECT, &entry->flags)) 601 if (!test_bit(BTRFS_ORDERED_DIRECT, &entry->flags))
602 filemap_fdatawrite_range(inode->i_mapping, start, end); 602 filemap_fdatawrite_range(inode->i_mapping, start, end);
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
index c5dbd9149679..4da08652004d 100644
--- a/fs/btrfs/relocation.c
+++ b/fs/btrfs/relocation.c
@@ -1241,7 +1241,7 @@ static int __must_check __add_reloc_root(struct btrfs_root *root)
1241 if (rb_node) { 1241 if (rb_node) {
1242 btrfs_panic(root->fs_info, -EEXIST, "Duplicate root found " 1242 btrfs_panic(root->fs_info, -EEXIST, "Duplicate root found "
1243 "for start=%llu while inserting into relocation " 1243 "for start=%llu while inserting into relocation "
1244 "tree\n"); 1244 "tree\n", node->bytenr);
1245 kfree(node); 1245 kfree(node);
1246 return -EEXIST; 1246 return -EEXIST;
1247 } 1247 }
diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c
index bf232c88a0bf..fb5ffe95f869 100644
--- a/fs/btrfs/send.c
+++ b/fs/btrfs/send.c
@@ -25,6 +25,7 @@
25#include <linux/posix_acl_xattr.h> 25#include <linux/posix_acl_xattr.h>
26#include <linux/radix-tree.h> 26#include <linux/radix-tree.h>
27#include <linux/crc32c.h> 27#include <linux/crc32c.h>
28#include <linux/vmalloc.h>
28 29
29#include "send.h" 30#include "send.h"
30#include "backref.h" 31#include "backref.h"
@@ -1993,7 +1994,7 @@ static int open_cur_inode_file(struct send_ctx *sctx)
1993{ 1994{
1994 int ret = 0; 1995 int ret = 0;
1995 struct btrfs_key key; 1996 struct btrfs_key key;
1996 struct vfsmount *mnt; 1997 struct path path;
1997 struct inode *inode; 1998 struct inode *inode;
1998 struct dentry *dentry; 1999 struct dentry *dentry;
1999 struct file *filp; 2000 struct file *filp;
@@ -2020,10 +2021,11 @@ static int open_cur_inode_file(struct send_ctx *sctx)
2020 goto out; 2021 goto out;
2021 } 2022 }
2022 2023
2023 mnt = mntget(sctx->mnt); 2024 path.mnt = sctx->mnt;
2024 filp = dentry_open(dentry, mnt, O_RDONLY | O_LARGEFILE, current_cred()); 2025 path.dentry = dentry;
2026 filp = dentry_open(&path, O_RDONLY | O_LARGEFILE, current_cred());
2027 dput(dentry);
2025 dentry = NULL; 2028 dentry = NULL;
2026 mnt = NULL;
2027 if (IS_ERR(filp)) { 2029 if (IS_ERR(filp)) {
2028 ret = PTR_ERR(filp); 2030 ret = PTR_ERR(filp);
2029 goto out; 2031 goto out;
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index 073c2368f459..83d6f9f9c220 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -100,10 +100,6 @@ static void __save_error_info(struct btrfs_fs_info *fs_info)
100 fs_info->fs_state = BTRFS_SUPER_FLAG_ERROR; 100 fs_info->fs_state = BTRFS_SUPER_FLAG_ERROR;
101} 101}
102 102
103/* NOTE:
104 * We move write_super stuff at umount in order to avoid deadlock
105 * for umount hold all lock.
106 */
107static void save_error_info(struct btrfs_fs_info *fs_info) 103static void save_error_info(struct btrfs_fs_info *fs_info)
108{ 104{
109 __save_error_info(fs_info); 105 __save_error_info(fs_info);
@@ -125,6 +121,7 @@ static void btrfs_handle_error(struct btrfs_fs_info *fs_info)
125 } 121 }
126} 122}
127 123
124#ifdef CONFIG_PRINTK
128/* 125/*
129 * __btrfs_std_error decodes expected errors from the caller and 126 * __btrfs_std_error decodes expected errors from the caller and
130 * invokes the approciate error response. 127 * invokes the approciate error response.
@@ -167,7 +164,7 @@ void __btrfs_std_error(struct btrfs_fs_info *fs_info, const char *function,
167 va_end(args); 164 va_end(args);
168} 165}
169 166
170const char *logtypes[] = { 167static const char * const logtypes[] = {
171 "emergency", 168 "emergency",
172 "alert", 169 "alert",
173 "critical", 170 "critical",
@@ -185,21 +182,49 @@ void btrfs_printk(struct btrfs_fs_info *fs_info, const char *fmt, ...)
185 struct va_format vaf; 182 struct va_format vaf;
186 va_list args; 183 va_list args;
187 const char *type = logtypes[4]; 184 const char *type = logtypes[4];
185 int kern_level;
188 186
189 va_start(args, fmt); 187 va_start(args, fmt);
190 188
191 if (fmt[0] == '<' && isdigit(fmt[1]) && fmt[2] == '>') { 189 kern_level = printk_get_level(fmt);
192 memcpy(lvl, fmt, 3); 190 if (kern_level) {
193 lvl[3] = '\0'; 191 size_t size = printk_skip_level(fmt) - fmt;
194 fmt += 3; 192 memcpy(lvl, fmt, size);
195 type = logtypes[fmt[1] - '0']; 193 lvl[size] = '\0';
194 fmt += size;
195 type = logtypes[kern_level - '0'];
196 } else 196 } else
197 *lvl = '\0'; 197 *lvl = '\0';
198 198
199 vaf.fmt = fmt; 199 vaf.fmt = fmt;
200 vaf.va = &args; 200 vaf.va = &args;
201
201 printk("%sBTRFS %s (device %s): %pV", lvl, type, sb->s_id, &vaf); 202 printk("%sBTRFS %s (device %s): %pV", lvl, type, sb->s_id, &vaf);
203
204 va_end(args);
205}
206
207#else
208
209void __btrfs_std_error(struct btrfs_fs_info *fs_info, const char *function,
210 unsigned int line, int errno, const char *fmt, ...)
211{
212 struct super_block *sb = fs_info->sb;
213
214 /*
215 * Special case: if the error is EROFS, and we're already
216 * under MS_RDONLY, then it is safe here.
217 */
218 if (errno == -EROFS && (sb->s_flags & MS_RDONLY))
219 return;
220
221 /* Don't go through full error handling during mount */
222 if (sb->s_flags & MS_BORN) {
223 save_error_info(fs_info);
224 btrfs_handle_error(fs_info);
225 }
202} 226}
227#endif
203 228
204/* 229/*
205 * We only mark the transaction aborted and then set the file system read-only. 230 * We only mark the transaction aborted and then set the file system read-only.
@@ -1081,7 +1106,8 @@ static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags,
1081 } 1106 }
1082 1107
1083 bdev = fs_devices->latest_bdev; 1108 bdev = fs_devices->latest_bdev;
1084 s = sget(fs_type, btrfs_test_super, btrfs_set_super, fs_info); 1109 s = sget(fs_type, btrfs_test_super, btrfs_set_super, flags | MS_NOSEC,
1110 fs_info);
1085 if (IS_ERR(s)) { 1111 if (IS_ERR(s)) {
1086 error = PTR_ERR(s); 1112 error = PTR_ERR(s);
1087 goto error_close_devices; 1113 goto error_close_devices;
@@ -1095,7 +1121,6 @@ static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags,
1095 } else { 1121 } else {
1096 char b[BDEVNAME_SIZE]; 1122 char b[BDEVNAME_SIZE];
1097 1123
1098 s->s_flags = flags | MS_NOSEC;
1099 strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id)); 1124 strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id));
1100 btrfs_sb(s)->bdev_holder = fs_type; 1125 btrfs_sb(s)->bdev_holder = fs_type;
1101 error = btrfs_fill_super(s, fs_devices, data, 1126 error = btrfs_fill_super(s, fs_devices, data,
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c
index 3ee8d58e97ad..27c26004e050 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;
@@ -1579,6 +1584,8 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans,
1579 put_transaction(cur_trans); 1584 put_transaction(cur_trans);
1580 put_transaction(cur_trans); 1585 put_transaction(cur_trans);
1581 1586
1587 sb_end_intwrite(root->fs_info->sb);
1588
1582 trace_btrfs_transaction_commit(root); 1589 trace_btrfs_transaction_commit(root);
1583 1590
1584 btrfs_scrub_continue(root); 1591 btrfs_scrub_continue(root);
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 3f4e70e171ed..88b969aeeb71 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -1745,10 +1745,6 @@ int btrfs_init_new_device(struct btrfs_root *root, char *device_path)
1745 1745
1746 device->fs_devices = root->fs_info->fs_devices; 1746 device->fs_devices = root->fs_info->fs_devices;
1747 1747
1748 /*
1749 * we don't want write_supers to jump in here with our device
1750 * half setup
1751 */
1752 mutex_lock(&root->fs_info->fs_devices->device_list_mutex); 1748 mutex_lock(&root->fs_info->fs_devices->device_list_mutex);
1753 list_add_rcu(&device->dev_list, &root->fs_info->fs_devices->devices); 1749 list_add_rcu(&device->dev_list, &root->fs_info->fs_devices->devices);
1754 list_add(&device->dev_alloc_list, 1750 list_add(&device->dev_alloc_list,