Merge tag 'gfs2-for-v6.10' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2...
[linux-2.6-block.git] / fs / gfs2 / ops_fstype.c
index 572d58e86296f9117a4e476075eaacdef52394f7..227edbaddfbc062f138986b0b5270132387ea193 100644 (file)
@@ -136,6 +136,7 @@ static struct gfs2_sbd *init_sbd(struct super_block *sb)
        atomic_set(&sdp->sd_log_in_flight, 0);
        init_waitqueue_head(&sdp->sd_log_flush_wait);
        mutex_init(&sdp->sd_freeze_mutex);
+       INIT_LIST_HEAD(&sdp->sd_dead_glocks);
 
        return sdp;
 
@@ -184,22 +185,10 @@ static int gfs2_check_sb(struct gfs2_sbd *sdp, int silent)
        return 0;
 }
 
-static void end_bio_io_page(struct bio *bio)
-{
-       struct page *page = bio->bi_private;
-
-       if (!bio->bi_status)
-               SetPageUptodate(page);
-       else
-               pr_warn("error %d reading superblock\n", bio->bi_status);
-       unlock_page(page);
-}
-
-static void gfs2_sb_in(struct gfs2_sbd *sdp, const void *buf)
+static void gfs2_sb_in(struct gfs2_sbd *sdp, const struct gfs2_sb *str)
 {
        struct gfs2_sb_host *sb = &sdp->sd_sb;
        struct super_block *s = sdp->sd_vfs;
-       const struct gfs2_sb *str = buf;
 
        sb->sb_magic = be32_to_cpu(str->sb_header.mh_magic);
        sb->sb_type = be32_to_cpu(str->sb_header.mh_type);
@@ -239,34 +228,26 @@ static void gfs2_sb_in(struct gfs2_sbd *sdp, const void *buf)
 static int gfs2_read_super(struct gfs2_sbd *sdp, sector_t sector, int silent)
 {
        struct super_block *sb = sdp->sd_vfs;
-       struct gfs2_sb *p;
        struct page *page;
-       struct bio *bio;
+       struct bio_vec bvec;
+       struct bio bio;
+       int err;
 
-       page = alloc_page(GFP_NOFS);
+       page = alloc_page(GFP_KERNEL);
        if (unlikely(!page))
                return -ENOMEM;
 
-       ClearPageUptodate(page);
-       ClearPageDirty(page);
-       lock_page(page);
-
-       bio = bio_alloc(sb->s_bdev, 1, REQ_OP_READ | REQ_META, GFP_NOFS);
-       bio->bi_iter.bi_sector = sector * (sb->s_blocksize >> 9);
-       __bio_add_page(bio, page, PAGE_SIZE, 0);
+       bio_init(&bio, sb->s_bdev, &bvec, 1, REQ_OP_READ | REQ_META);
+       bio.bi_iter.bi_sector = sector * (sb->s_blocksize >> 9);
+       __bio_add_page(&bio, page, PAGE_SIZE, 0);
 
-       bio->bi_end_io = end_bio_io_page;
-       bio->bi_private = page;
-       submit_bio(bio);
-       wait_on_page_locked(page);
-       bio_put(bio);
-       if (!PageUptodate(page)) {
+       err = submit_bio_wait(&bio);
+       if (err) {
+               pr_warn("error %d reading superblock\n", err);
                __free_page(page);
-               return -EIO;
+               return err;
        }
-       p = kmap(page);
-       gfs2_sb_in(sdp, p);
-       kunmap(page);
+       gfs2_sb_in(sdp, page_address(page));
        __free_page(page);
        return gfs2_check_sb(sdp, silent);
 }
@@ -1288,7 +1269,7 @@ static int gfs2_fill_super(struct super_block *sb, struct fs_context *fc)
                error = gfs2_make_fs_rw(sdp);
 
        if (error) {
-               gfs2_freeze_unlock(&sdp->sd_freeze_gh);
+               gfs2_freeze_unlock(sdp);
                gfs2_destroy_threads(sdp);
                fs_err(sdp, "can't make FS RW: %d\n", error);
                goto fail_per_node;