Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'bcachefs-2024-08-10' of git://evilpiepirate.org/bcachefs

Pull more bcachefs fixes from Kent Overstreet:
"A couple last minute fixes for the new disk accounting

- fix a bug that was causing ACLs to seemingly "disappear"

- new on disk format version, bcachefs_metadata_version_disk_accounting_v3

bcachefs_metadata_version_disk_accounting_v2 accidentally included
padding in disk_accounting_key; fortunately, 6.11 isn't out yet so
we can fix this with another version bump"

* tag 'bcachefs-2024-08-10' of git://evilpiepirate.org/bcachefs:
bcachefs: bcachefs_metadata_version_disk_accounting_v3
bcachefs: improve bch2_dev_usage_to_text()
bcachefs: bch2_accounting_invalid()
bcachefs: Switch to .get_inode_acl()

+126 -28
+7 -4
fs/bcachefs/acl.c
··· 272 272 return xattr; 273 273 } 274 274 275 - struct posix_acl *bch2_get_acl(struct mnt_idmap *idmap, 276 - struct dentry *dentry, int type) 275 + struct posix_acl *bch2_get_acl(struct inode *vinode, int type, bool rcu) 277 276 { 278 - struct bch_inode_info *inode = to_bch_ei(dentry->d_inode); 277 + struct bch_inode_info *inode = to_bch_ei(vinode); 279 278 struct bch_fs *c = inode->v.i_sb->s_fs_info; 280 279 struct bch_hash_info hash = bch2_hash_info_init(c, &inode->ei_inode); 281 280 struct xattr_search_key search = X_SEARCH(acl_to_xattr_type(type), "", 0); 282 - struct btree_trans *trans = bch2_trans_get(c); 283 281 struct btree_iter iter = { NULL }; 284 282 struct posix_acl *acl = NULL; 283 + 284 + if (rcu) 285 + return ERR_PTR(-ECHILD); 286 + 287 + struct btree_trans *trans = bch2_trans_get(c); 285 288 retry: 286 289 bch2_trans_begin(trans); 287 290
+1 -1
fs/bcachefs/acl.h
··· 28 28 29 29 #ifdef CONFIG_BCACHEFS_POSIX_ACL 30 30 31 - struct posix_acl *bch2_get_acl(struct mnt_idmap *, struct dentry *, int); 31 + struct posix_acl *bch2_get_acl(struct inode *, int, bool); 32 32 33 33 int bch2_set_acl_trans(struct btree_trans *, subvol_inum, 34 34 struct bch_inode_unpacked *,
+1 -1
fs/bcachefs/alloc_foreground.c
··· 1740 1740 printbuf_tabstop_push(out, 16); 1741 1741 printbuf_tabstop_push(out, 16); 1742 1742 1743 - bch2_dev_usage_to_text(out, &stats); 1743 + bch2_dev_usage_to_text(out, ca, &stats); 1744 1744 1745 1745 prt_newline(out); 1746 1746
+2 -1
fs/bcachefs/bcachefs_format.h
··· 675 675 x(btree_subvolume_children, BCH_VERSION(1, 6)) \ 676 676 x(mi_btree_bitmap, BCH_VERSION(1, 7)) \ 677 677 x(bucket_stripe_sectors, BCH_VERSION(1, 8)) \ 678 - x(disk_accounting_v2, BCH_VERSION(1, 9)) 678 + x(disk_accounting_v2, BCH_VERSION(1, 9)) \ 679 + x(disk_accounting_v3, BCH_VERSION(1, 10)) 679 680 680 681 enum bcachefs_metadata_version { 681 682 bcachefs_metadata_version_min = 9,
+8 -4
fs/bcachefs/buckets.c
··· 71 71 return ret; 72 72 } 73 73 74 - void bch2_dev_usage_to_text(struct printbuf *out, struct bch_dev_usage *usage) 74 + void bch2_dev_usage_to_text(struct printbuf *out, 75 + struct bch_dev *ca, 76 + struct bch_dev_usage *usage) 75 77 { 76 78 prt_printf(out, "\tbuckets\rsectors\rfragmented\r\n"); 77 79 78 80 for (unsigned i = 0; i < BCH_DATA_NR; i++) { 79 81 bch2_prt_data_type(out, i); 80 82 prt_printf(out, "\t%llu\r%llu\r%llu\r\n", 81 - usage->d[i].buckets, 82 - usage->d[i].sectors, 83 - usage->d[i].fragmented); 83 + usage->d[i].buckets, 84 + usage->d[i].sectors, 85 + usage->d[i].fragmented); 84 86 } 87 + 88 + prt_printf(out, "capacity\t%llu\r\n", ca->mi.nbuckets); 85 89 } 86 90 87 91 static int bch2_check_fix_ptr(struct btree_trans *trans,
+1 -1
fs/bcachefs/buckets.h
··· 212 212 return ret; 213 213 } 214 214 215 - void bch2_dev_usage_to_text(struct printbuf *, struct bch_dev_usage *); 215 + void bch2_dev_usage_to_text(struct printbuf *, struct bch_dev *, struct bch_dev_usage *); 216 216 217 217 static inline u64 bch2_dev_buckets_reserved(struct bch_dev *ca, enum bch_watermark watermark) 218 218 {
+64 -1
fs/bcachefs/disk_accounting.c
··· 114 114 return bch2_disk_accounting_mod(trans, &acc, &sectors, 1, gc); 115 115 } 116 116 117 + static inline bool is_zero(char *start, char *end) 118 + { 119 + BUG_ON(start > end); 120 + 121 + for (; start < end; start++) 122 + if (*start) 123 + return false; 124 + return true; 125 + } 126 + 127 + #define field_end(p, member) (((void *) (&p.member)) + sizeof(p.member)) 128 + 117 129 int bch2_accounting_invalid(struct bch_fs *c, struct bkey_s_c k, 118 130 enum bch_validate_flags flags, 119 131 struct printbuf *err) 120 132 { 121 - return 0; 133 + struct disk_accounting_pos acc_k; 134 + bpos_to_disk_accounting_pos(&acc_k, k.k->p); 135 + void *end = &acc_k + 1; 136 + int ret = 0; 137 + 138 + switch (acc_k.type) { 139 + case BCH_DISK_ACCOUNTING_nr_inodes: 140 + end = field_end(acc_k, nr_inodes); 141 + break; 142 + case BCH_DISK_ACCOUNTING_persistent_reserved: 143 + end = field_end(acc_k, persistent_reserved); 144 + break; 145 + case BCH_DISK_ACCOUNTING_replicas: 146 + bkey_fsck_err_on(!acc_k.replicas.nr_devs, 147 + c, err, accounting_key_replicas_nr_devs_0, 148 + "accounting key replicas entry with nr_devs=0"); 149 + 150 + bkey_fsck_err_on(acc_k.replicas.nr_required > acc_k.replicas.nr_devs || 151 + (acc_k.replicas.nr_required > 1 && 152 + acc_k.replicas.nr_required == acc_k.replicas.nr_devs), 153 + c, err, accounting_key_replicas_nr_required_bad, 154 + "accounting key replicas entry with bad nr_required"); 155 + 156 + for (unsigned i = 0; i + 1 < acc_k.replicas.nr_devs; i++) 157 + bkey_fsck_err_on(acc_k.replicas.devs[i] > acc_k.replicas.devs[i + 1], 158 + c, err, accounting_key_replicas_devs_unsorted, 159 + "accounting key replicas entry with unsorted devs"); 160 + 161 + end = (void *) &acc_k.replicas + replicas_entry_bytes(&acc_k.replicas); 162 + break; 163 + case BCH_DISK_ACCOUNTING_dev_data_type: 164 + end = field_end(acc_k, dev_data_type); 165 + break; 166 + case BCH_DISK_ACCOUNTING_compression: 167 + end = field_end(acc_k, compression); 168 + break; 169 + case BCH_DISK_ACCOUNTING_snapshot: 170 + end = field_end(acc_k, snapshot); 171 + break; 172 + case BCH_DISK_ACCOUNTING_btree: 173 + end = field_end(acc_k, btree); 174 + break; 175 + case BCH_DISK_ACCOUNTING_rebalance_work: 176 + end = field_end(acc_k, rebalance_work); 177 + break; 178 + } 179 + 180 + bkey_fsck_err_on(!is_zero(end, (void *) (&acc_k + 1)), 181 + c, err, accounting_key_junk_at_end, 182 + "junk at end of accounting key"); 183 + fsck_err: 184 + return ret; 122 185 } 123 186 124 187 void bch2_accounting_key_to_text(struct printbuf *out, struct disk_accounting_pos *k)
+7 -8
fs/bcachefs/disk_accounting_format.h
··· 124 124 __u8 data_type; 125 125 }; 126 126 127 - struct bch_dev_stripe_buckets { 128 - __u8 dev; 129 - }; 130 - 131 127 struct bch_acct_compression { 132 128 __u8 type; 133 129 }; 134 130 135 131 struct bch_acct_snapshot { 136 132 __u32 id; 137 - }; 133 + } __packed; 138 134 139 135 struct bch_acct_btree { 140 136 __u32 id; 137 + } __packed; 138 + 139 + struct bch_acct_rebalance_work { 141 140 }; 142 141 143 142 struct disk_accounting_pos { ··· 148 149 struct bch_persistent_reserved persistent_reserved; 149 150 struct bch_replicas_entry_v1 replicas; 150 151 struct bch_dev_data_type dev_data_type; 151 - struct bch_dev_stripe_buckets dev_stripe_buckets; 152 152 struct bch_acct_compression compression; 153 153 struct bch_acct_snapshot snapshot; 154 154 struct bch_acct_btree btree; 155 - }; 156 - }; 155 + struct bch_acct_rebalance_work rebalance_work; 156 + } __packed; 157 + } __packed; 157 158 struct bpos _pad; 158 159 }; 159 160 };
+4 -4
fs/bcachefs/fs.c
··· 1199 1199 .fiemap = bch2_fiemap, 1200 1200 .listxattr = bch2_xattr_list, 1201 1201 #ifdef CONFIG_BCACHEFS_POSIX_ACL 1202 - .get_acl = bch2_get_acl, 1202 + .get_inode_acl = bch2_get_acl, 1203 1203 .set_acl = bch2_set_acl, 1204 1204 #endif 1205 1205 }; ··· 1219 1219 .tmpfile = bch2_tmpfile, 1220 1220 .listxattr = bch2_xattr_list, 1221 1221 #ifdef CONFIG_BCACHEFS_POSIX_ACL 1222 - .get_acl = bch2_get_acl, 1222 + .get_inode_acl = bch2_get_acl, 1223 1223 .set_acl = bch2_set_acl, 1224 1224 #endif 1225 1225 }; ··· 1241 1241 .setattr = bch2_setattr, 1242 1242 .listxattr = bch2_xattr_list, 1243 1243 #ifdef CONFIG_BCACHEFS_POSIX_ACL 1244 - .get_acl = bch2_get_acl, 1244 + .get_inode_acl = bch2_get_acl, 1245 1245 .set_acl = bch2_set_acl, 1246 1246 #endif 1247 1247 }; ··· 1251 1251 .setattr = bch2_setattr, 1252 1252 .listxattr = bch2_xattr_list, 1253 1253 #ifdef CONFIG_BCACHEFS_POSIX_ACL 1254 - .get_acl = bch2_get_acl, 1254 + .get_inode_acl = bch2_get_acl, 1255 1255 .set_acl = bch2_set_acl, 1256 1256 #endif 1257 1257 };
-1
fs/bcachefs/replicas.c
··· 24 24 static void verify_replicas_entry(struct bch_replicas_entry_v1 *e) 25 25 { 26 26 #ifdef CONFIG_BCACHEFS_DEBUG 27 - BUG_ON(e->data_type >= BCH_DATA_NR); 28 27 BUG_ON(!e->nr_devs); 29 28 BUG_ON(e->nr_required > 1 && 30 29 e->nr_required >= e->nr_devs);
+26 -1
fs/bcachefs/sb-downgrade.c
··· 61 61 BCH_FSCK_ERR_dev_usage_buckets_wrong, \ 62 62 BCH_FSCK_ERR_dev_usage_sectors_wrong, \ 63 63 BCH_FSCK_ERR_dev_usage_fragmented_wrong, \ 64 - BCH_FSCK_ERR_accounting_mismatch) 64 + BCH_FSCK_ERR_accounting_mismatch) \ 65 + x(disk_accounting_v3, \ 66 + BIT_ULL(BCH_RECOVERY_PASS_check_allocations), \ 67 + BCH_FSCK_ERR_bkey_version_in_future, \ 68 + BCH_FSCK_ERR_dev_usage_buckets_wrong, \ 69 + BCH_FSCK_ERR_dev_usage_sectors_wrong, \ 70 + BCH_FSCK_ERR_dev_usage_fragmented_wrong, \ 71 + BCH_FSCK_ERR_accounting_mismatch, \ 72 + BCH_FSCK_ERR_accounting_key_replicas_nr_devs_0, \ 73 + BCH_FSCK_ERR_accounting_key_replicas_nr_required_bad, \ 74 + BCH_FSCK_ERR_accounting_key_replicas_devs_unsorted, \ 75 + BCH_FSCK_ERR_accounting_key_junk_at_end) 65 76 66 77 #define DOWNGRADE_TABLE() \ 67 78 x(bucket_stripe_sectors, \ 68 79 0) \ 69 80 x(disk_accounting_v2, \ 81 + BIT_ULL(BCH_RECOVERY_PASS_check_allocations), \ 82 + BCH_FSCK_ERR_dev_usage_buckets_wrong, \ 83 + BCH_FSCK_ERR_dev_usage_sectors_wrong, \ 84 + BCH_FSCK_ERR_dev_usage_fragmented_wrong, \ 85 + BCH_FSCK_ERR_fs_usage_hidden_wrong, \ 86 + BCH_FSCK_ERR_fs_usage_btree_wrong, \ 87 + BCH_FSCK_ERR_fs_usage_data_wrong, \ 88 + BCH_FSCK_ERR_fs_usage_cached_wrong, \ 89 + BCH_FSCK_ERR_fs_usage_reserved_wrong, \ 90 + BCH_FSCK_ERR_fs_usage_nr_inodes_wrong, \ 91 + BCH_FSCK_ERR_fs_usage_persistent_reserved_wrong, \ 92 + BCH_FSCK_ERR_fs_usage_replicas_wrong, \ 93 + BCH_FSCK_ERR_bkey_version_in_future) \ 94 + x(disk_accounting_v3, \ 70 95 BIT_ULL(BCH_RECOVERY_PASS_check_allocations), \ 71 96 BCH_FSCK_ERR_dev_usage_buckets_wrong, \ 72 97 BCH_FSCK_ERR_dev_usage_sectors_wrong, \
+5 -1
fs/bcachefs/sb-errors_format.h
··· 287 287 x(accounting_replicas_not_marked, 273, 0) \ 288 288 x(invalid_btree_id, 274, 0) \ 289 289 x(alloc_key_io_time_bad, 275, 0) \ 290 - x(alloc_key_fragmentation_lru_wrong, 276, FSCK_AUTOFIX) 290 + x(alloc_key_fragmentation_lru_wrong, 276, FSCK_AUTOFIX) \ 291 + x(accounting_key_junk_at_end, 277, 0) \ 292 + x(accounting_key_replicas_nr_devs_0, 278, 0) \ 293 + x(accounting_key_replicas_nr_required_bad, 279, 0) \ 294 + x(accounting_key_replicas_devs_unsorted, 280, 0) \ 291 295 292 296 enum bch_sb_error_id { 293 297 #define x(t, n, ...) BCH_FSCK_ERR_##t = n,