We can't go RW if it's an image file that hasn't been resized.

Signed-off-by: Kent Overstreet <kent.overstr...@linux.dev>
---
 fs/bcachefs/bcachefs_format.h | 3 ++-
 fs/bcachefs/errcode.h         | 1 +
 fs/bcachefs/journal.c         | 9 ++++++++-
 fs/bcachefs/super.c           | 5 +++++
 4 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/fs/bcachefs/bcachefs_format.h b/fs/bcachefs/bcachefs_format.h
index 7e2debc40045..aa57f4708232 100644
--- a/fs/bcachefs/bcachefs_format.h
+++ b/fs/bcachefs/bcachefs_format.h
@@ -919,7 +919,8 @@ static inline void 
SET_BCH_SB_BACKGROUND_COMPRESSION_TYPE(struct bch_sb *sb, __u
        x(extents_across_btree_nodes,   18)     \
        x(incompat_version_field,       19)     \
        x(casefolding,                  20)     \
-       x(no_alloc_info,                21)
+       x(no_alloc_info,                21)     \
+       x(small_image,                  22)
 
 #define BCH_SB_FEATURES_ALWAYS                         \
        (BIT_ULL(BCH_FEATURE_new_extent_overwrite)|     \
diff --git a/fs/bcachefs/errcode.h b/fs/bcachefs/errcode.h
index e54c8264e7e1..996cdf62dad9 100644
--- a/fs/bcachefs/errcode.h
+++ b/fs/bcachefs/errcode.h
@@ -222,6 +222,7 @@
        x(EROFS,                        erofs_norecovery)                       
\
        x(EROFS,                        erofs_nochanges)                        
\
        x(EROFS,                        erofs_no_alloc_info)                    
\
+       x(EROFS,                        erofs_filesystem_full)                  
\
        x(EROFS,                        insufficient_devices)                   
\
        x(0,                            operation_blocked)                      
\
        x(BCH_ERR_operation_blocked,    btree_cache_cannibalize_lock_blocked)   
\
diff --git a/fs/bcachefs/journal.c b/fs/bcachefs/journal.c
index 23f37dbfaba9..898f61250b5d 100644
--- a/fs/bcachefs/journal.c
+++ b/fs/bcachefs/journal.c
@@ -1278,9 +1278,16 @@ int bch2_set_nr_journal_buckets(struct bch_fs *c, struct 
bch_dev *ca,
 
 int bch2_dev_journal_alloc(struct bch_dev *ca, bool new_fs)
 {
+       struct bch_fs *c = ca->fs;
+
        if (!(ca->mi.data_allowed & BIT(BCH_DATA_journal)))
                return 0;
 
+       if (c->sb.features & BIT_ULL(BCH_FEATURE_small_image)) {
+               bch_err(c, "cannot allocate journal, filesystem is an unresized 
image file");
+               return -BCH_ERR_erofs_filesystem_full;
+       }
+
        unsigned nr;
        int ret;
 
@@ -1301,7 +1308,7 @@ int bch2_dev_journal_alloc(struct bch_dev *ca, bool 
new_fs)
                     min(1 << 13,
                         (1 << 24) / ca->mi.bucket_size));
 
-       ret = bch2_set_nr_journal_buckets_loop(ca->fs, ca, nr, new_fs);
+       ret = bch2_set_nr_journal_buckets_loop(c, ca, nr, new_fs);
 err:
        bch_err_fn(ca, ret);
        return ret;
diff --git a/fs/bcachefs/super.c b/fs/bcachefs/super.c
index 797601756af1..29c4204d2e50 100644
--- a/fs/bcachefs/super.c
+++ b/fs/bcachefs/super.c
@@ -472,6 +472,11 @@ static int __bch2_fs_read_write(struct bch_fs *c, bool 
early)
                return -BCH_ERR_erofs_unfixed_errors;
        }
 
+       if (c->sb.features & BIT_ULL(BCH_FEATURE_small_image)) {
+               bch_err(c, "cannot go rw, filesystem is an unresized image 
file");
+               return -BCH_ERR_erofs_filesystem_full;
+       }
+
        if (test_bit(BCH_FS_rw, &c->flags))
                return 0;
 
-- 
2.49.0


Reply via email to