From 42ba8b5a75b844446b91d43b6434fe3479143583 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Wed, 3 Nov 2021 21:24:52 -0400 Subject: Update bcachefs sources to 5fd0c70102 bcachefs: Fix __remove_dirent() --- .bcachefs_revision | 2 +- include/linux/backing-dev-defs.h | 0 include/linux/blk_types.h | 5 ++--- include/linux/blkdev.h | 11 +++++++++++ include/linux/poison.h | 3 +++ libbcachefs/acl.c | 5 ++++- libbcachefs/acl.h | 2 +- libbcachefs/alloc_background.c | 2 +- libbcachefs/bcachefs.h | 1 + libbcachefs/btree_iter.c | 4 ++-- libbcachefs/btree_iter.h | 3 +++ libbcachefs/btree_update_leaf.c | 14 ++++++++++++-- libbcachefs/fs-io.c | 5 ++--- libbcachefs/fsck.c | 36 ++++++++++++++++++++++++++++++++---- libbcachefs/super-io.c | 3 ++- libbcachefs/util.h | 1 - linux/blkdev.c | 4 ++-- 17 files changed, 79 insertions(+), 22 deletions(-) create mode 100644 include/linux/backing-dev-defs.h diff --git a/.bcachefs_revision b/.bcachefs_revision index 18cf2559..254b6fc6 100644 --- a/.bcachefs_revision +++ b/.bcachefs_revision @@ -1 +1 @@ -043cfba30c743a6faa4e53c5a88a259f8726ac01 +5fd0c701024d14d7e493780354a150d0e20cf0a6 diff --git a/include/linux/backing-dev-defs.h b/include/linux/backing-dev-defs.h new file mode 100644 index 00000000..e69de29b diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index 8aef4bb8..be736c8c 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -21,6 +21,8 @@ struct request_queue { }; struct gendisk { + struct backing_dev_info *bdi; + struct backing_dev_info __bdi; }; struct hd_struct { @@ -38,9 +40,6 @@ struct block_device { struct gendisk __bd_disk; int bd_fd; int bd_sync_fd; - - struct backing_dev_info *bd_bdi; - struct backing_dev_info __bd_bdi; }; #define bdev_kobj(_bdev) (&((_bdev)->kobj)) diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 4ebdcbd4..4ce43b5c 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -74,6 +74,17 @@ int blkdev_issue_discard(struct block_device *, sector_t, #define bdev_get_queue(bdev) (&((bdev)->queue)) +#ifndef SECTOR_SHIFT +#define SECTOR_SHIFT 9 +#endif +#ifndef SECTOR_SIZE +#define SECTOR_SIZE (1 << SECTOR_SHIFT) +#endif + +#define PAGE_SECTORS_SHIFT (PAGE_SHIFT - SECTOR_SHIFT) +#define PAGE_SECTORS (1 << PAGE_SECTORS_SHIFT) +#define SECTOR_MASK (PAGE_SECTORS - 1) + #define blk_queue_discard(q) ((void) (q), 0) #define blk_queue_nonrot(q) ((void) (q), 0) diff --git a/include/linux/poison.h b/include/linux/poison.h index aff1c925..d62ef5a6 100644 --- a/include/linux/poison.h +++ b/include/linux/poison.h @@ -78,4 +78,7 @@ /********** security/ **********/ #define KEY_DESTROY 0xbd +/********** net/core/page_pool.c **********/ +#define PP_SIGNATURE (0x40 + POISON_POINTER_DELTA) + #endif diff --git a/libbcachefs/acl.c b/libbcachefs/acl.c index f92b52e4..d0c6878b 100644 --- a/libbcachefs/acl.c +++ b/libbcachefs/acl.c @@ -212,7 +212,7 @@ bch2_acl_to_xattr(struct btree_trans *trans, return xattr; } -struct posix_acl *bch2_get_acl(struct inode *vinode, int type) +struct posix_acl *bch2_get_acl(struct inode *vinode, int type, bool rcu) { struct bch_inode_info *inode = to_bch_ei(vinode); struct bch_fs *c = inode->v.i_sb->s_fs_info; @@ -224,6 +224,9 @@ struct posix_acl *bch2_get_acl(struct inode *vinode, int type) struct bkey_s_c k; int ret; + if (rcu) + return ERR_PTR(-ECHILD); + bch2_trans_init(&trans, c, 0, 0); retry: bch2_trans_begin(&trans); diff --git a/libbcachefs/acl.h b/libbcachefs/acl.h index 2ad214bd..2d76a489 100644 --- a/libbcachefs/acl.h +++ b/libbcachefs/acl.h @@ -26,7 +26,7 @@ typedef struct { __le32 a_version; } bch_acl_header; -struct posix_acl *bch2_get_acl(struct inode *, int); +struct posix_acl *bch2_get_acl(struct inode *, int, bool); int bch2_set_acl_trans(struct btree_trans *, subvol_inum, struct bch_inode_unpacked *, diff --git a/libbcachefs/alloc_background.c b/libbcachefs/alloc_background.c index 67b24576..022c905d 100644 --- a/libbcachefs/alloc_background.c +++ b/libbcachefs/alloc_background.c @@ -1018,7 +1018,7 @@ void bch2_recalc_capacity(struct bch_fs *c) lockdep_assert_held(&c->state_lock); for_each_online_member(ca, c, i) { - struct backing_dev_info *bdi = ca->disk_sb.bdev->bd_bdi; + struct backing_dev_info *bdi = ca->disk_sb.bdev->bd_disk->bdi; ra_pages += bdi->ra_pages; } diff --git a/libbcachefs/bcachefs.h b/libbcachefs/bcachefs.h index 0c13fa19..131d0f7b 100644 --- a/libbcachefs/bcachefs.h +++ b/libbcachefs/bcachefs.h @@ -179,6 +179,7 @@ #undef pr_fmt #define pr_fmt(fmt) "bcachefs: %s() " fmt "\n", __func__ +#include #include #include #include diff --git a/libbcachefs/btree_iter.c b/libbcachefs/btree_iter.c index 8c7fc74f..f5d8a730 100644 --- a/libbcachefs/btree_iter.c +++ b/libbcachefs/btree_iter.c @@ -175,8 +175,8 @@ bool __bch2_btree_node_relock(struct btree_trans *trans, } } -static bool bch2_btree_node_upgrade(struct btree_trans *trans, - struct btree_path *path, unsigned level) +bool bch2_btree_node_upgrade(struct btree_trans *trans, + struct btree_path *path, unsigned level) { struct btree *b = path->l[level].b; diff --git a/libbcachefs/btree_iter.h b/libbcachefs/btree_iter.h index 61bbb7bc..2dc58828 100644 --- a/libbcachefs/btree_iter.h +++ b/libbcachefs/btree_iter.h @@ -166,6 +166,9 @@ static inline int btree_trans_restart(struct btree_trans *trans) return -EINTR; } +bool bch2_btree_node_upgrade(struct btree_trans *, + struct btree_path *, unsigned); + bool __bch2_btree_path_upgrade(struct btree_trans *, struct btree_path *, unsigned); diff --git a/libbcachefs/btree_update_leaf.c b/libbcachefs/btree_update_leaf.c index c4054667..b9c777cc 100644 --- a/libbcachefs/btree_update_leaf.c +++ b/libbcachefs/btree_update_leaf.c @@ -507,6 +507,15 @@ err: return ret; } +static inline void path_upgrade_readers(struct btree_trans *trans, struct btree_path *path) +{ + unsigned l; + + for (l = 0; l < BTREE_MAX_DEPTH; l++) + if (btree_node_read_locked(path, l)) + BUG_ON(!bch2_btree_node_upgrade(trans, path, l)); +} + static inline void upgrade_readers(struct btree_trans *trans, struct btree_path *path) { struct btree *b = path_l(path)->b; @@ -514,7 +523,7 @@ static inline void upgrade_readers(struct btree_trans *trans, struct btree_path do { if (path->nodes_locked && path->nodes_locked != path->nodes_intent_locked) - BUG_ON(!bch2_btree_path_upgrade(trans, path, path->level + 1)); + path_upgrade_readers(trans, path); } while ((path = prev_btree_path(trans, path)) && path_l(path)->b == b); } @@ -560,7 +569,8 @@ static inline bool have_conflicting_read_lock(struct btree_trans *trans, struct //if (path == pos) // break; - if (path->nodes_locked != path->nodes_intent_locked) + if (path->nodes_locked != path->nodes_intent_locked && + !bch2_btree_path_upgrade(trans, path, path->level + 1)) return true; } diff --git a/libbcachefs/fs-io.c b/libbcachefs/fs-io.c index 3a3f6c7d..684488ef 100644 --- a/libbcachefs/fs-io.c +++ b/libbcachefs/fs-io.c @@ -1509,8 +1509,8 @@ retry_reservation: unsigned pg_offset = (offset + copied) & (PAGE_SIZE - 1); unsigned pg_len = min_t(unsigned, len - copied, PAGE_SIZE - pg_offset); - unsigned pg_copied = iov_iter_copy_from_user_atomic(page, - iter, pg_offset, pg_len); + unsigned pg_copied = copy_page_from_iter_atomic(page, + pg_offset, pg_len,iter); if (!pg_copied) break; @@ -1523,7 +1523,6 @@ retry_reservation: } flush_dcache_page(page); - iov_iter_advance(iter, pg_copied); copied += pg_copied; if (pg_copied != pg_len) diff --git a/libbcachefs/fsck.c b/libbcachefs/fsck.c index 5bc04c7b..9519ced9 100644 --- a/libbcachefs/fsck.c +++ b/libbcachefs/fsck.c @@ -113,6 +113,35 @@ static int subvol_lookup(struct btree_trans *trans, u32 subvol, return lockrestart_do(trans, __subvol_lookup(trans, subvol, snapshot, inum)); } +static int lookup_first_inode(struct btree_trans *trans, u64 inode_nr, + struct bch_inode_unpacked *inode) +{ + struct btree_iter iter; + struct bkey_s_c k; + int ret; + + bch2_trans_iter_init(trans, &iter, BTREE_ID_inodes, + POS(0, inode_nr), + BTREE_ITER_ALL_SNAPSHOTS); + k = bch2_btree_iter_peek(&iter); + ret = bkey_err(k); + if (ret) + goto err; + + if (!k.k || bkey_cmp(k.k->p, POS(0, inode_nr))) { + ret = -ENOENT; + goto err; + } + + ret = bch2_inode_unpack(bkey_s_c_to_inode(k), inode); +err: + if (ret && ret != -EINTR) + bch_err(trans->c, "error %i fetching inode %llu", + ret, inode_nr); + bch2_trans_iter_exit(trans, &iter); + return ret; +} + static int __lookup_inode(struct btree_trans *trans, u64 inode_nr, struct bch_inode_unpacked *inode, u32 *snapshot) @@ -272,7 +301,7 @@ static int __remove_dirent(struct btree_trans *trans, struct bpos pos) struct bch_hash_info dir_hash_info; int ret; - ret = __lookup_inode(trans, pos.inode, &dir_inode, NULL); + ret = lookup_first_inode(trans, pos.inode, &dir_inode); if (ret) return ret; @@ -669,7 +698,7 @@ static int check_key_has_snapshot(struct btree_trans *trans, char buf[200]; int ret = 0; - if (fsck_err_on(!snapshot_t(c, k.k->p.snapshot)->equiv, c, + if (mustfix_fsck_err_on(!snapshot_t(c, k.k->p.snapshot)->equiv, c, "key in missing snapshot: %s", (bch2_bkey_val_to_text(&PBUF(buf), c, k), buf))) return bch2_btree_delete_at(trans, iter, @@ -918,8 +947,7 @@ static int check_inodes(struct bch_fs *c, bool full) bch2_trans_init(&trans, c, BTREE_ITER_MAX, 0); - bch2_trans_iter_init(&trans, &iter, BTREE_ID_inodes, - POS(BCACHEFS_ROOT_INO, 0), + bch2_trans_iter_init(&trans, &iter, BTREE_ID_inodes, POS_MIN, BTREE_ITER_INTENT| BTREE_ITER_PREFETCH| BTREE_ITER_ALL_SNAPSHOTS); diff --git a/libbcachefs/super-io.c b/libbcachefs/super-io.c index 3903b730..33d832bc 100644 --- a/libbcachefs/super-io.c +++ b/libbcachefs/super-io.c @@ -807,7 +807,8 @@ int bch2_write_super(struct bch_fs *c) !can_mount_with_written || (can_mount_without_written && !can_mount_with_written), c, - "Unable to write superblock to sufficient devices")) + "Unable to write superblock to sufficient devices (from %ps)", + (void *) _RET_IP_)) ret = -1; out: /* Make new options visible after they're persistent: */ diff --git a/libbcachefs/util.h b/libbcachefs/util.h index 84ef4d6d..bec84d8a 100644 --- a/libbcachefs/util.h +++ b/libbcachefs/util.h @@ -19,7 +19,6 @@ #include #define PAGE_SECTOR_SHIFT (PAGE_SHIFT - 9) -#define PAGE_SECTORS (1UL << PAGE_SECTOR_SHIFT) struct closure; diff --git a/linux/blkdev.c b/linux/blkdev.c index 59ef2a4a..762e5aa0 100644 --- a/linux/blkdev.c +++ b/linux/blkdev.c @@ -205,8 +205,8 @@ struct block_device *blkdev_get_by_path(const char *path, fmode_t mode, bdev->bd_sync_fd = sync_fd; bdev->bd_holder = holder; bdev->bd_disk = &bdev->__bd_disk; - bdev->bd_bdi = &bdev->__bd_bdi; - bdev->queue.backing_dev_info = bdev->bd_bdi; + bdev->bd_disk->bdi = &bdev->bd_disk->__bdi; + bdev->queue.backing_dev_info = bdev->bd_disk->bdi; return bdev; } -- cgit v1.2.3