Skip to content

Commit b0d5d10

Browse files
committed
Btrfs: use insert_inode_locked4 for inode creation
Btrfs was inserting inodes into the hash table before we had fully set the inode up on disk. This leaves us open to rare races that allow two different inodes in memory for the same [root, inode] pair. This patch fixes things by using insert_inode_locked4 to insert an I_NEW inode and unlock_new_inode when we're ready for the rest of the kernel to use the inode. It also makes sure to init the operations pointers on the inode before going into the error handling paths. Signed-off-by: Chris Mason <[email protected]> Reported-by: Al Viro <[email protected]>
1 parent 49dae1b commit b0d5d10

File tree

1 file changed

+109
-67
lines changed

1 file changed

+109
-67
lines changed

fs/btrfs/inode.c

Lines changed: 109 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -5634,6 +5634,17 @@ int btrfs_set_inode_index(struct inode *dir, u64 *index)
56345634
return ret;
56355635
}
56365636

5637+
static int btrfs_insert_inode_locked(struct inode *inode)
5638+
{
5639+
struct btrfs_iget_args args;
5640+
args.location = &BTRFS_I(inode)->location;
5641+
args.root = BTRFS_I(inode)->root;
5642+
5643+
return insert_inode_locked4(inode,
5644+
btrfs_inode_hash(inode->i_ino, BTRFS_I(inode)->root),
5645+
btrfs_find_actor, &args);
5646+
}
5647+
56375648
static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,
56385649
struct btrfs_root *root,
56395650
struct inode *dir,
@@ -5726,10 +5737,19 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,
57265737
sizes[1] = name_len + sizeof(*ref);
57275738
}
57285739

5740+
location = &BTRFS_I(inode)->location;
5741+
location->objectid = objectid;
5742+
location->offset = 0;
5743+
btrfs_set_key_type(location, BTRFS_INODE_ITEM_KEY);
5744+
5745+
ret = btrfs_insert_inode_locked(inode);
5746+
if (ret < 0)
5747+
goto fail;
5748+
57295749
path->leave_spinning = 1;
57305750
ret = btrfs_insert_empty_items(trans, root, path, key, sizes, nitems);
57315751
if (ret != 0)
5732-
goto fail;
5752+
goto fail_unlock;
57335753

57345754
inode_init_owner(inode, dir, mode);
57355755
inode_set_bytes(inode, 0);
@@ -5752,11 +5772,6 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,
57525772
btrfs_mark_buffer_dirty(path->nodes[0]);
57535773
btrfs_free_path(path);
57545774

5755-
location = &BTRFS_I(inode)->location;
5756-
location->objectid = objectid;
5757-
location->offset = 0;
5758-
btrfs_set_key_type(location, BTRFS_INODE_ITEM_KEY);
5759-
57605775
btrfs_inherit_iflags(inode, dir);
57615776

57625777
if (S_ISREG(mode)) {
@@ -5767,7 +5782,6 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,
57675782
BTRFS_INODE_NODATASUM;
57685783
}
57695784

5770-
btrfs_insert_inode_hash(inode);
57715785
inode_tree_add(inode);
57725786

57735787
trace_btrfs_inode_new(inode);
@@ -5782,6 +5796,9 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,
57825796
btrfs_ino(inode), root->root_key.objectid, ret);
57835797

57845798
return inode;
5799+
5800+
fail_unlock:
5801+
unlock_new_inode(inode);
57855802
fail:
57865803
if (dir && name)
57875804
BTRFS_I(dir)->index_cnt--;
@@ -5916,28 +5933,28 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry,
59165933
goto out_unlock;
59175934
}
59185935

5919-
err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name);
5920-
if (err) {
5921-
drop_inode = 1;
5922-
goto out_unlock;
5923-
}
5924-
59255936
/*
59265937
* If the active LSM wants to access the inode during
59275938
* d_instantiate it needs these. Smack checks to see
59285939
* if the filesystem supports xattrs by looking at the
59295940
* ops vector.
59305941
*/
5931-
59325942
inode->i_op = &btrfs_special_inode_operations;
5933-
err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index);
5943+
init_special_inode(inode, inode->i_mode, rdev);
5944+
5945+
err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name);
59345946
if (err)
5935-
drop_inode = 1;
5936-
else {
5937-
init_special_inode(inode, inode->i_mode, rdev);
5947+
goto out_unlock_inode;
5948+
5949+
err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index);
5950+
if (err) {
5951+
goto out_unlock_inode;
5952+
} else {
59385953
btrfs_update_inode(trans, root, inode);
5954+
unlock_new_inode(inode);
59395955
d_instantiate(dentry, inode);
59405956
}
5957+
59415958
out_unlock:
59425959
btrfs_end_transaction(trans, root);
59435960
btrfs_balance_delayed_items(root);
@@ -5947,6 +5964,12 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry,
59475964
iput(inode);
59485965
}
59495966
return err;
5967+
5968+
out_unlock_inode:
5969+
drop_inode = 1;
5970+
unlock_new_inode(inode);
5971+
goto out_unlock;
5972+
59505973
}
59515974

59525975
static int btrfs_create(struct inode *dir, struct dentry *dentry,
@@ -5981,15 +6004,6 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry,
59816004
goto out_unlock;
59826005
}
59836006
drop_inode_on_err = 1;
5984-
5985-
err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name);
5986-
if (err)
5987-
goto out_unlock;
5988-
5989-
err = btrfs_update_inode(trans, root, inode);
5990-
if (err)
5991-
goto out_unlock;
5992-
59936007
/*
59946008
* If the active LSM wants to access the inode during
59956009
* d_instantiate it needs these. Smack checks to see
@@ -5998,14 +6012,23 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry,
59986012
*/
59996013
inode->i_fop = &btrfs_file_operations;
60006014
inode->i_op = &btrfs_file_inode_operations;
6015+
inode->i_mapping->a_ops = &btrfs_aops;
6016+
inode->i_mapping->backing_dev_info = &root->fs_info->bdi;
6017+
6018+
err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name);
6019+
if (err)
6020+
goto out_unlock_inode;
6021+
6022+
err = btrfs_update_inode(trans, root, inode);
6023+
if (err)
6024+
goto out_unlock_inode;
60016025

60026026
err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index);
60036027
if (err)
6004-
goto out_unlock;
6028+
goto out_unlock_inode;
60056029

6006-
inode->i_mapping->a_ops = &btrfs_aops;
6007-
inode->i_mapping->backing_dev_info = &root->fs_info->bdi;
60086030
BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops;
6031+
unlock_new_inode(inode);
60096032
d_instantiate(dentry, inode);
60106033

60116034
out_unlock:
@@ -6017,6 +6040,11 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry,
60176040
btrfs_balance_delayed_items(root);
60186041
btrfs_btree_balance_dirty(root);
60196042
return err;
6043+
6044+
out_unlock_inode:
6045+
unlock_new_inode(inode);
6046+
goto out_unlock;
6047+
60206048
}
60216049

60226050
static int btrfs_link(struct dentry *old_dentry, struct inode *dir,
@@ -6124,25 +6152,30 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
61246152
}
61256153

61266154
drop_on_err = 1;
6155+
/* these must be set before we unlock the inode */
6156+
inode->i_op = &btrfs_dir_inode_operations;
6157+
inode->i_fop = &btrfs_dir_file_operations;
61276158

61286159
err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name);
61296160
if (err)
6130-
goto out_fail;
6131-
6132-
inode->i_op = &btrfs_dir_inode_operations;
6133-
inode->i_fop = &btrfs_dir_file_operations;
6161+
goto out_fail_inode;
61346162

61356163
btrfs_i_size_write(inode, 0);
61366164
err = btrfs_update_inode(trans, root, inode);
61376165
if (err)
6138-
goto out_fail;
6166+
goto out_fail_inode;
61396167

61406168
err = btrfs_add_link(trans, dir, inode, dentry->d_name.name,
61416169
dentry->d_name.len, 0, index);
61426170
if (err)
6143-
goto out_fail;
6171+
goto out_fail_inode;
61446172

61456173
d_instantiate(dentry, inode);
6174+
/*
6175+
* mkdir is special. We're unlocking after we call d_instantiate
6176+
* to avoid a race with nfsd calling d_instantiate.
6177+
*/
6178+
unlock_new_inode(inode);
61466179
drop_on_err = 0;
61476180

61486181
out_fail:
@@ -6152,6 +6185,10 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
61526185
btrfs_balance_delayed_items(root);
61536186
btrfs_btree_balance_dirty(root);
61546187
return err;
6188+
6189+
out_fail_inode:
6190+
unlock_new_inode(inode);
6191+
goto out_fail;
61556192
}
61566193

61576194
/* helper for btfs_get_extent. Given an existing extent in the tree,
@@ -8107,6 +8144,7 @@ int btrfs_create_subvol_root(struct btrfs_trans_handle *trans,
81078144

81088145
set_nlink(inode, 1);
81098146
btrfs_i_size_write(inode, 0);
8147+
unlock_new_inode(inode);
81108148

81118149
err = btrfs_subvol_inherit_props(trans, new_root, parent_root);
81128150
if (err)
@@ -8757,12 +8795,6 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry,
87578795
goto out_unlock;
87588796
}
87598797

8760-
err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name);
8761-
if (err) {
8762-
drop_inode = 1;
8763-
goto out_unlock;
8764-
}
8765-
87668798
/*
87678799
* If the active LSM wants to access the inode during
87688800
* d_instantiate it needs these. Smack checks to see
@@ -8771,23 +8803,22 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry,
87718803
*/
87728804
inode->i_fop = &btrfs_file_operations;
87738805
inode->i_op = &btrfs_file_inode_operations;
8806+
inode->i_mapping->a_ops = &btrfs_aops;
8807+
inode->i_mapping->backing_dev_info = &root->fs_info->bdi;
8808+
BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops;
8809+
8810+
err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name);
8811+
if (err)
8812+
goto out_unlock_inode;
87748813

87758814
err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index);
87768815
if (err)
8777-
drop_inode = 1;
8778-
else {
8779-
inode->i_mapping->a_ops = &btrfs_aops;
8780-
inode->i_mapping->backing_dev_info = &root->fs_info->bdi;
8781-
BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops;
8782-
}
8783-
if (drop_inode)
8784-
goto out_unlock;
8816+
goto out_unlock_inode;
87858817

87868818
path = btrfs_alloc_path();
87878819
if (!path) {
87888820
err = -ENOMEM;
8789-
drop_inode = 1;
8790-
goto out_unlock;
8821+
goto out_unlock_inode;
87918822
}
87928823
key.objectid = btrfs_ino(inode);
87938824
key.offset = 0;
@@ -8796,9 +8827,8 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry,
87968827
err = btrfs_insert_empty_item(trans, root, path, &key,
87978828
datasize);
87988829
if (err) {
8799-
drop_inode = 1;
88008830
btrfs_free_path(path);
8801-
goto out_unlock;
8831+
goto out_unlock_inode;
88028832
}
88038833
leaf = path->nodes[0];
88048834
ei = btrfs_item_ptr(leaf, path->slots[0],
@@ -8822,19 +8852,27 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry,
88228852
inode_set_bytes(inode, name_len);
88238853
btrfs_i_size_write(inode, name_len);
88248854
err = btrfs_update_inode(trans, root, inode);
8825-
if (err)
8855+
if (err) {
88268856
drop_inode = 1;
8857+
goto out_unlock_inode;
8858+
}
8859+
8860+
unlock_new_inode(inode);
8861+
d_instantiate(dentry, inode);
88278862

88288863
out_unlock:
8829-
if (!err)
8830-
d_instantiate(dentry, inode);
88318864
btrfs_end_transaction(trans, root);
88328865
if (drop_inode) {
88338866
inode_dec_link_count(inode);
88348867
iput(inode);
88358868
}
88368869
btrfs_btree_balance_dirty(root);
88378870
return err;
8871+
8872+
out_unlock_inode:
8873+
drop_inode = 1;
8874+
unlock_new_inode(inode);
8875+
goto out_unlock;
88388876
}
88398877

88408878
static int __btrfs_prealloc_file_range(struct inode *inode, int mode,
@@ -9018,24 +9056,23 @@ static int btrfs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode)
90189056
goto out;
90199057
}
90209058

9021-
ret = btrfs_init_inode_security(trans, inode, dir, NULL);
9022-
if (ret)
9023-
goto out;
9024-
9025-
ret = btrfs_update_inode(trans, root, inode);
9026-
if (ret)
9027-
goto out;
9028-
90299059
inode->i_fop = &btrfs_file_operations;
90309060
inode->i_op = &btrfs_file_inode_operations;
90319061

90329062
inode->i_mapping->a_ops = &btrfs_aops;
90339063
inode->i_mapping->backing_dev_info = &root->fs_info->bdi;
90349064
BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops;
90359065

9066+
ret = btrfs_init_inode_security(trans, inode, dir, NULL);
9067+
if (ret)
9068+
goto out_inode;
9069+
9070+
ret = btrfs_update_inode(trans, root, inode);
9071+
if (ret)
9072+
goto out_inode;
90369073
ret = btrfs_orphan_add(trans, inode);
90379074
if (ret)
9038-
goto out;
9075+
goto out_inode;
90399076

90409077
/*
90419078
* We set number of links to 0 in btrfs_new_inode(), and here we set
@@ -9045,6 +9082,7 @@ static int btrfs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode)
90459082
* d_tmpfile() -> inode_dec_link_count() -> drop_nlink()
90469083
*/
90479084
set_nlink(inode, 1);
9085+
unlock_new_inode(inode);
90489086
d_tmpfile(dentry, inode);
90499087
mark_inode_dirty(inode);
90509088

@@ -9054,8 +9092,12 @@ static int btrfs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode)
90549092
iput(inode);
90559093
btrfs_balance_delayed_items(root);
90569094
btrfs_btree_balance_dirty(root);
9057-
90589095
return ret;
9096+
9097+
out_inode:
9098+
unlock_new_inode(inode);
9099+
goto out;
9100+
90599101
}
90609102

90619103
static const struct inode_operations btrfs_dir_inode_operations = {

0 commit comments

Comments
 (0)