// SPDX-License-Identifier: GPL-2.0-only /* * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. * Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved. */ #include <linux/sched.h> #include <linux/slab.h> #include <linux/spinlock.h> #include <linux/completion.h> #include <linux/buffer_head.h> #include <linux/mm.h> #include <linux/pagemap.h> #include <linux/writeback.h> #include <linux/swap.h> #include <linux/delay.h> #include <linux/bio.h> #include <linux/gfs2_ondisk.h> #include "gfs2.h" #include "incore.h" #include "glock.h" #include "glops.h" #include "inode.h" #include "log.h" #include "lops.h" #include "meta_io.h" #include "rgrp.h" #include "trans.h" #include "util.h" #include "trace_gfs2.h" static int gfs2_aspace_writepage(struct page *page, struct writeback_control *wbc) { … } const struct address_space_operations gfs2_meta_aops = …; const struct address_space_operations gfs2_rgrp_aops = …; /** * gfs2_getbuf - Get a buffer with a given address space * @gl: the glock * @blkno: the block number (filesystem scope) * @create: 1 if the buffer should be created * * Returns: the buffer */ struct buffer_head *gfs2_getbuf(struct gfs2_glock *gl, u64 blkno, int create) { … } static void meta_prep_new(struct buffer_head *bh) { … } /** * gfs2_meta_new - Get a block * @gl: The glock associated with this block * @blkno: The block number * * Returns: The buffer */ struct buffer_head *gfs2_meta_new(struct gfs2_glock *gl, u64 blkno) { … } static void gfs2_meta_read_endio(struct bio *bio) { … } /* * Submit several consecutive buffer head I/O requests as a single bio I/O * request. (See submit_bh_wbc.) */ static void gfs2_submit_bhs(blk_opf_t opf, struct buffer_head *bhs[], int num) { … } /** * gfs2_meta_read - Read a block from disk * @gl: The glock covering the block * @blkno: The block number * @flags: flags * @rahead: Do read-ahead * @bhp: the place where the buffer is returned (NULL on failure) * * Returns: errno */ int gfs2_meta_read(struct gfs2_glock *gl, u64 blkno, int flags, int rahead, struct buffer_head **bhp) { … } /** * gfs2_meta_wait - Reread a block from disk * @sdp: the filesystem * @bh: The block to wait for * * Returns: errno */ int gfs2_meta_wait(struct gfs2_sbd *sdp, struct buffer_head *bh) { … } void gfs2_remove_from_journal(struct buffer_head *bh, int meta) { … } /** * gfs2_ail1_wipe - remove deleted/freed buffers from the ail1 list * @sdp: superblock * @bstart: starting block address of buffers to remove * @blen: length of buffers to be removed * * This function is called from gfs2_journal wipe, whose job is to remove * buffers, corresponding to deleted blocks, from the journal. If we find any * bufdata elements on the system ail1 list, they haven't been written to * the journal yet. So we remove them. */ static void gfs2_ail1_wipe(struct gfs2_sbd *sdp, u64 bstart, u32 blen) { … } static struct buffer_head *gfs2_getjdatabuf(struct gfs2_inode *ip, u64 blkno) { … } /** * gfs2_journal_wipe - make inode's buffers so they aren't dirty/pinned anymore * @ip: the inode who owns the buffers * @bstart: the first buffer in the run * @blen: the number of buffers in the run * */ void gfs2_journal_wipe(struct gfs2_inode *ip, u64 bstart, u32 blen) { … } /** * gfs2_meta_buffer - Get a metadata buffer * @ip: The GFS2 inode * @mtype: The block type (GFS2_METATYPE_*) * @num: The block number (device relative) of the buffer * @bhp: the buffer is returned here * * Returns: errno */ int gfs2_meta_buffer(struct gfs2_inode *ip, u32 mtype, u64 num, struct buffer_head **bhp) { … } /** * gfs2_meta_ra - start readahead on an extent of a file * @gl: the glock the blocks belong to * @dblock: the starting disk block * @extlen: the number of blocks in the extent * * returns: the first buffer in the extent */ struct buffer_head *gfs2_meta_ra(struct gfs2_glock *gl, u64 dblock, u32 extlen) { … }