u64 __percpu            *counters;
 
        unsigned                copy_gc_enabled:1;
-       bool                    promote_whole_extents;
 
        struct bch2_time_stats  times[BCH_TIME_STAT_NR];
 
 
 LE64_BITMASK(BCH_SB_HAS_TOPOLOGY_ERRORS,struct bch_sb, flags[0], 61, 62);
 
 LE64_BITMASK(BCH_SB_BIG_ENDIAN,                struct bch_sb, flags[0], 62, 63);
+LE64_BITMASK(BCH_SB_PROMOTE_WHOLE_EXTENTS,
+                                       struct bch_sb, flags[0], 63, 64);
 
 LE64_BITMASK(BCH_SB_STR_HASH_TYPE,     struct bch_sb, flags[1],  0,  4);
 LE64_BITMASK(BCH_SB_COMPRESSION_TYPE_LO,struct bch_sb, flags[1],  4,  8);
 
         */
        bool promote_full = (failed ||
                             *read_full ||
-                            READ_ONCE(c->promote_whole_extents));
+                            READ_ONCE(c->opts.promote_whole_extents));
        /* data might have to be decompressed in the write path: */
        unsigned sectors = promote_full
                ? max(pick->crc.compressed_size, pick->crc.live_size)
 
          OPT_BOOL(),                                                   \
          BCH2_NO_SB_OPT,               true,                           \
          NULL,         "Enable inline data extents")                   \
+       x(promote_whole_extents,        u8,                             \
+         OPT_FS|OPT_MOUNT|OPT_RUNTIME,                                 \
+         OPT_BOOL(),                                                   \
+         BCH_SB_PROMOTE_WHOLE_EXTENTS, true,                           \
+         NULL,         "Promote whole extents, instead of just part being read")\
        x(acl,                          u8,                             \
          OPT_FS|OPT_FORMAT|OPT_MOUNT,                                  \
          OPT_BOOL(),                                                   \
 
                if (le16_to_cpu(sb->version) <= bcachefs_metadata_version_disk_accounting_v2 &&
                    !BCH_SB_ALLOCATOR_STUCK_TIMEOUT(sb))
                        SET_BCH_SB_ALLOCATOR_STUCK_TIMEOUT(sb, 30);
+
+               if (le16_to_cpu(sb->version) <= bcachefs_metadata_version_disk_accounting_v2)
+                       SET_BCH_SB_PROMOTE_WHOLE_EXTENTS(sb, true);
        }
 
        for (opt_id = 0; opt_id < bch2_opts_nr; opt_id++) {
 
 
        c->copy_gc_enabled              = 1;
        c->rebalance.enabled            = 1;
-       c->promote_whole_extents        = true;
 
        c->journal.flush_write_time     = &c->times[BCH_TIME_journal_flush_write];
        c->journal.noflush_write_time   = &c->times[BCH_TIME_journal_noflush_write];
 
 rw_attribute(rebalance_enabled);
 sysfs_pd_controller_attribute(rebalance);
 read_attribute(rebalance_status);
-rw_attribute(promote_whole_extents);
 
 read_attribute(new_stripes);
 
        if (attr == &sysfs_rebalance_status)
                bch2_rebalance_status_to_text(out, c);
 
-       sysfs_print(promote_whole_extents,      c->promote_whole_extents);
-
        /* Debugging: */
 
        if (attr == &sysfs_journal_debug)
 
        sysfs_pd_controller_store(rebalance,    &c->rebalance.pd);
 
-       sysfs_strtoul(promote_whole_extents,    c->promote_whole_extents);
-
        /* Debugging: */
 
        if (!test_bit(BCH_FS_started, &c->flags))
        &sysfs_btree_cache_size,
        &sysfs_btree_write_stats,
 
-       &sysfs_promote_whole_extents,
        &sysfs_rebalance_status,
 
        &sysfs_compression_stats,