summaryrefslogtreecommitdiff
path: root/libbcachefs/fs.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbcachefs/fs.c')
-rw-r--r--libbcachefs/fs.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/libbcachefs/fs.c b/libbcachefs/fs.c
index dc6c651d..3b7f78e7 100644
--- a/libbcachefs/fs.c
+++ b/libbcachefs/fs.c
@@ -106,6 +106,8 @@ int __must_check __bch2_write_inode(struct bch_fs *c,
break;
}
+ BUG_ON(inode_u.bi_size != inode->ei_inode.bi_size);
+
if (set) {
ret = set(inode, &inode_u, p);
if (ret)
@@ -114,6 +116,10 @@ int __must_check __bch2_write_inode(struct bch_fs *c,
BUG_ON(i_nlink < nlink_bias(inode->v.i_mode));
+ BUG_ON(inode_u.bi_size != inode->ei_inode.bi_size &&
+ !(inode_u.bi_flags & BCH_INODE_I_SIZE_DIRTY) &&
+ inode_u.bi_size > i_size_read(&inode->v));
+
inode_u.bi_mode = inode->v.i_mode;
inode_u.bi_uid = i_uid_read(&inode->v);
inode_u.bi_gid = i_gid_read(&inode->v);
@@ -129,11 +135,17 @@ int __must_check __bch2_write_inode(struct bch_fs *c,
ret = bch2_btree_insert_at(c, NULL, NULL,
&inode->ei_journal_seq,
BTREE_INSERT_ATOMIC|
+ BTREE_INSERT_NOUNLOCK|
BTREE_INSERT_NOFAIL,
BTREE_INSERT_ENTRY(&iter, &inode_p.inode.k_i));
} while (ret == -EINTR);
if (!ret) {
+ /*
+ * the btree node lock protects inode->ei_inode, not
+ * ei_update_lock; this is important for inode updates via
+ * bchfs_write_index_update
+ */
inode->ei_inode = inode_u;
inode->ei_qid = bch_qid(&inode_u);
}
@@ -1107,7 +1119,7 @@ static int bch2_statfs(struct dentry *dentry, struct kstatfs *buf)
le64_to_cpup((void *) c->sb.user_uuid.b + sizeof(u64));
buf->f_fsid.val[0] = fsid & 0xFFFFFFFFUL;
buf->f_fsid.val[1] = (fsid >> 32) & 0xFFFFFFFFUL;
- buf->f_namelen = NAME_MAX;
+ buf->f_namelen = BCH_NAME_MAX;
return 0;
}