]> Git Repo - linux.git/commitdiff
Merge tag 'for-6.6-rc3-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave...
authorLinus Torvalds <[email protected]>
Tue, 26 Sep 2023 16:44:08 +0000 (09:44 -0700)
committerLinus Torvalds <[email protected]>
Tue, 26 Sep 2023 16:44:08 +0000 (09:44 -0700)
Pull btrfs fixes from David Sterba:

 - delayed refs fixes:
     - fix race when refilling delayed refs block reserve
     - prevent transaction block reserve underflow when starting
       transaction
     - error message and value adjustments

 - fix build warnings with CONFIG_CC_OPTIMIZE_FOR_SIZE and
   -Wmaybe-uninitialized

 - fix for smatch report where uninitialized data from invalid extent
   buffer range could be returned to the caller

 - fix numeric overflow in statfs when calculating lower threshold
   for a full filesystem

* tag 'for-6.6-rc3-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux:
  btrfs: initialize start_slot in btrfs_log_prealloc_extents
  btrfs: make sure to initialize start and len in find_free_dev_extent
  btrfs: reset destination buffer when read_extent_buffer() gets invalid range
  btrfs: properly report 0 avail for very full file systems
  btrfs: log message if extent item not found when running delayed extent op
  btrfs: remove redundant BUG_ON() from __btrfs_inc_extent_ref()
  btrfs: return -EUCLEAN for delayed tree ref with a ref count not equals to 1
  btrfs: prevent transaction block reserve underflow when starting transaction
  btrfs: fix race when refilling delayed refs block reserve

1  2 
fs/btrfs/transaction.c
fs/btrfs/tree-log.c
fs/btrfs/volumes.c

diff --combined fs/btrfs/transaction.c
index 0bf42dccb0412d80db1250259ced8066deda7848,3b60e56e5e02b3022ff8f93cf5724f64a73faabb..c780d37294636852144c8082899e1da4c1189b78
@@@ -631,14 -631,14 +631,14 @@@ start_transaction(struct btrfs_root *ro
                        reloc_reserved = true;
                }
  
-               ret = btrfs_block_rsv_add(fs_info, rsv, num_bytes, flush);
+               ret = btrfs_reserve_metadata_bytes(fs_info, rsv, num_bytes, flush);
                if (ret)
                        goto reserve_fail;
                if (delayed_refs_bytes) {
-                       btrfs_migrate_to_delayed_refs_rsv(fs_info, rsv,
-                                                         delayed_refs_bytes);
+                       btrfs_migrate_to_delayed_refs_rsv(fs_info, delayed_refs_bytes);
                        num_bytes -= delayed_refs_bytes;
                }
+               btrfs_block_rsv_add_bytes(rsv, num_bytes, true);
  
                if (rsv->space_info->force_alloc)
                        do_chunk_alloc = true;
@@@ -1860,7 -1860,8 +1860,7 @@@ static noinline int create_pending_snap
  
        btrfs_i_size_write(BTRFS_I(parent_inode), parent_inode->i_size +
                                                  fname.disk_name.len * 2);
 -      parent_inode->i_mtime = current_time(parent_inode);
 -      parent_inode->i_ctime = parent_inode->i_mtime;
 +      parent_inode->i_mtime = inode_set_ctime_current(parent_inode);
        ret = btrfs_update_inode_fallback(trans, parent_root, BTRFS_I(parent_inode));
        if (ret) {
                btrfs_abort_transaction(trans, ret);
diff --combined fs/btrfs/tree-log.c
index d1e46b839519ca0cdd5560fc990c99ff59ffe973,537eb3de8809cfeb1f51bc81d19b44788c2f9445..cbb17b542131770e8893d47d057046241f465629
@@@ -4148,9 -4148,9 +4148,9 @@@ static void fill_inode_item(struct btrf
                                      inode->i_mtime.tv_nsec);
  
        btrfs_set_token_timespec_sec(&token, &item->ctime,
 -                                   inode->i_ctime.tv_sec);
 +                                   inode_get_ctime(inode).tv_sec);
        btrfs_set_token_timespec_nsec(&token, &item->ctime,
 -                                    inode->i_ctime.tv_nsec);
 +                                    inode_get_ctime(inode).tv_nsec);
  
        /*
         * We do not need to set the nbytes field, in fact during a fast fsync
@@@ -4722,7 -4722,7 +4722,7 @@@ static int btrfs_log_prealloc_extents(s
        struct extent_buffer *leaf;
        int slot;
        int ins_nr = 0;
-       int start_slot;
+       int start_slot = 0;
        int ret;
  
        if (!(inode->flags & BTRFS_INODE_PREALLOC))
diff --combined fs/btrfs/volumes.c
index 9621455edebc9da384d249c8c34cfcaa245d9888,e3a3769fd92e8c3c6115c64dcc0cf27751c7a864..5a5a8d488a7bcd042175ca7499bea3a3c7d84ff4
@@@ -1594,7 -1594,7 +1594,7 @@@ static int find_free_dev_extent(struct 
        u64 search_start;
        u64 hole_size;
        u64 max_hole_start;
-       u64 max_hole_size;
+       u64 max_hole_size = 0;
        u64 extent_end;
        u64 search_end = device->total_bytes;
        int ret;
        struct extent_buffer *l;
  
        search_start = dev_extent_search_start(device);
+       max_hole_start = search_start;
  
        WARN_ON(device->zone_info &&
                !IS_ALIGNED(num_bytes, device->zone_info->zone_size));
  
        path = btrfs_alloc_path();
-       if (!path)
-               return -ENOMEM;
-       max_hole_start = search_start;
-       max_hole_size = 0;
+       if (!path) {
+               ret = -ENOMEM;
+               goto out;
+       }
  again:
        if (search_start >= search_end ||
                test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state)) {
  static void update_dev_time(const char *device_path)
  {
        struct path path;
 -      struct timespec64 now;
        int ret;
  
        ret = kern_path(device_path, LOOKUP_FOLLOW, &path);
        if (ret)
                return;
  
 -      now = current_time(d_inode(path.dentry));
 -      inode_update_time(d_inode(path.dentry), &now, S_MTIME | S_CTIME | S_VERSION);
 +      inode_update_time(d_inode(path.dentry), S_MTIME | S_CTIME | S_VERSION);
        path_put(&path);
  }
  
This page took 0.088762 seconds and 4 git commands to generate.