• Kent Overstreet's avatar
    bcachefs: Nocow support · a8b3a677
    Kent Overstreet authored
    This adds support for nocow mode, where we do writes in-place when
    possible. Patch components:
    
     - New boolean filesystem and inode option, nocow: note that when nocow
       is enabled, data checksumming and compression are implicitly disabled
    
     - To prevent in-place writes from racing with data moves
       (data_update.c) or bucket reuse (i.e. a bucket being reused and
       re-allocated while a nocow write is in flight, we have a new locking
       mechanism.
    
       Buckets can be locked for either data update or data move, using a
       fixed size hash table of two_state_shared locks. We don't have any
       chaining, meaning updates and moves to different buckets that hash to
       the same lock will wait unnecessarily - we'll want to watch for this
       becoming an issue.
    
     - The allocator path also needs to check for in-place writes in flight
       to a given bucket before giving it out: thus we add another counter
       to bucket_alloc_state so we can track this.
    
     - Fsync now may need to issue cache flushes to block devices instead of
       flushing the journal. We add a device bitmask to bch_inode_info,
       ei_devs_need_flush, which tracks devices that need to have flushes
       issued - note that this will lead to unnecessary flushes when other
       codepaths have already issued flushes, we may want to replace this with
       a sequence number.
    
     - New nocow write path: look up extents, and if they're writable write
       to them - otherwise fall back to the normal COW write path.
    
    XXX: switch to sequence numbers instead of bitmask for devs needing
    journal flush
    
    XXX: ei_quota_lock being a mutex means bch2_nocow_write_done() needs to
    run in process context - see if we can improve this
    Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
    a8b3a677
alloc_foreground.c 34.1 KB