bcachefs: Add a comment for BTREE_INSERT_NOJOURNAL usage
authorKent Overstreet <kent.overstreet@linux.dev>
Sat, 4 Nov 2023 17:49:31 +0000 (13:49 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 5 Nov 2023 02:19:13 +0000 (22:19 -0400)
BTREE_INSERT_NOJOURNAL is primarily used for a performance optimization
related to inode updates and fsync - document it.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_iter.c
fs/bcachefs/btree_iter.h
fs/bcachefs/btree_types.h
fs/bcachefs/io_write.c

index af98545e0f352ba89f5a31dd6fc70b7ee213ee71..c2adf3fbb0b3abec5a3521d49663ec77ed32916f 100644 (file)
@@ -257,7 +257,7 @@ static void bch2_btree_iter_verify(struct btree_iter *iter)
 
        BUG_ON(!(iter->flags & __BTREE_ITER_ALL_SNAPSHOTS) &&
               (iter->flags & BTREE_ITER_ALL_SNAPSHOTS) &&
-              !btree_type_has_snapshots(iter->btree_id));
+              !btree_type_has_snapshot_field(iter->btree_id));
 
        if (iter->update_path)
                bch2_btree_path_verify(trans, iter->update_path);
index 967cde33d4332e1ccb7f324f7fb7e12f86d76cc3..85e7cb52f6b6c41b95c7dc3496a9340c9f2b38d0 100644 (file)
@@ -416,8 +416,7 @@ static inline unsigned __bch2_btree_iter_flags(struct btree_trans *trans,
                flags |= BTREE_ITER_IS_EXTENTS;
 
        if (!(flags & __BTREE_ITER_ALL_SNAPSHOTS) &&
-           !btree_type_has_snapshot_field(btree_id) &&
-           !btree_type_has_snapshots(btree_id))
+           !btree_type_has_snapshot_field(btree_id))
                flags &= ~BTREE_ITER_ALL_SNAPSHOTS;
 
        if (!(flags & BTREE_ITER_ALL_SNAPSHOTS) &&
index a685883e540590fe322b6d95abf268f3fc6928d9..3ab77300548417722df660815dfac7b7d454846e 100644 (file)
@@ -713,7 +713,7 @@ static inline bool btree_type_has_snapshots(enum btree_id id)
 static inline bool btree_type_has_snapshot_field(enum btree_id id)
 {
        const unsigned mask = 0
-#define x(name, nr, flags, ...)        |((!!((flags) & BTREE_ID_SNAPSHOT_FIELD)) << nr)
+#define x(name, nr, flags, ...)        |((!!((flags) & (BTREE_ID_SNAPSHOT_FIELD|BTREE_ID_SNAPSHOTS))) << nr)
        BCH_BTREE_IDS()
 #undef x
        ;
index 613f384366403816dd4a0ca5cf066e8b55b3d8f5..4eb0eda723ab77dce88c8763ac62261a6babb9b4 100644 (file)
@@ -202,6 +202,17 @@ static inline int bch2_extent_update_i_size_sectors(struct btree_trans *trans,
        struct btree_iter iter;
        struct bkey_i *k;
        struct bkey_i_inode_v3 *inode;
+       /*
+        * Crazy performance optimization:
+        * Every extent update needs to also update the inode: the inode trigger
+        * will set bi->journal_seq to the journal sequence number of this
+        * transaction - for fsync.
+        *
+        * But if that's the only reason we're updating the inode (we're not
+        * updating bi_size or bi_sectors), then we don't need the inode update
+        * to be journalled - if we crash, the bi_journal_seq update will be
+        * lost, but that's fine.
+        */
        unsigned inode_update_flags = BTREE_UPDATE_NOJOURNAL;
        int ret;