// SPDX-License-Identifier: GPL-2.0-or-later /* * Copyright (C) International Business Machines Corp., 2000-2004 */ #include <linux/fs.h> #include <linux/quotaops.h> #include "jfs_incore.h" #include "jfs_inode.h" #include "jfs_superblock.h" #include "jfs_dmap.h" #include "jfs_extent.h" #include "jfs_debug.h" /* * forward references */ static int extBalloc(struct inode *, s64, s64 *, s64 *); static s64 extRoundDown(s64 nb); #define DPD(a) … #define DPC(a) … #define DPL1(a) … #define DPL(a) … #define DPD1(a) … #define DPX(a) … #define DPX1(a) … #define DPS(a) … #define DPE(a) … #define DPE1(a) … #define DPS1(a) … /* * NAME: extAlloc() * * FUNCTION: allocate an extent for a specified page range within a * file. * * PARAMETERS: * ip - the inode of the file. * xlen - requested extent length. * pno - the starting page number with the file. * xp - pointer to an xad. on entry, xad describes an * extent that is used as an allocation hint if the * xaddr of the xad is non-zero. on successful exit, * the xad describes the newly allocated extent. * abnr - bool indicating whether the newly allocated extent * should be marked as allocated but not recorded. * * RETURN VALUES: * 0 - success * -EIO - i/o error. * -ENOSPC - insufficient disk resources. */ int extAlloc(struct inode *ip, s64 xlen, s64 pno, xad_t * xp, bool abnr) { … } /* * NAME: extHint() * * FUNCTION: produce an extent allocation hint for a file offset. * * PARAMETERS: * ip - the inode of the file. * offset - file offset for which the hint is needed. * xp - pointer to the xad that is to be filled in with * the hint. * * RETURN VALUES: * 0 - success * -EIO - i/o error. */ int extHint(struct inode *ip, s64 offset, xad_t * xp) { … } /* * NAME: extRecord() * * FUNCTION: change a page with a file from not recorded to recorded. * * PARAMETERS: * ip - inode of the file. * cp - cbuf of the file page. * * RETURN VALUES: * 0 - success * -EIO - i/o error. * -ENOSPC - insufficient disk resources. */ int extRecord(struct inode *ip, xad_t * xp) { … } /* * NAME: extBalloc() * * FUNCTION: allocate disk blocks to form an extent. * * initially, we will try to allocate disk blocks for the * requested size (nblocks). if this fails (nblocks * contiguous free blocks not available), we'll try to allocate * a smaller number of blocks (producing a smaller extent), with * this smaller number of blocks consisting of the requested * number of blocks rounded down to the next smaller power of 2 * number (i.e. 16 -> 8). we'll continue to round down and * retry the allocation until the number of blocks to allocate * is smaller than the number of blocks per page. * * PARAMETERS: * ip - the inode of the file. * hint - disk block number to be used as an allocation hint. * *nblocks - pointer to an s64 value. on entry, this value specifies * the desired number of block to be allocated. on successful * exit, this value is set to the number of blocks actually * allocated. * blkno - pointer to a block address that is filled in on successful * return with the starting block number of the newly * allocated block range. * * RETURN VALUES: * 0 - success * -EIO - i/o error. * -ENOSPC - insufficient disk resources. */ static int extBalloc(struct inode *ip, s64 hint, s64 * nblocks, s64 * blkno) { … } /* * NAME: extRoundDown() * * FUNCTION: round down a specified number of blocks to the next * smallest power of 2 number. * * PARAMETERS: * nb - the inode of the file. * * RETURN VALUES: * next smallest power of 2 number. */ static s64 extRoundDown(s64 nb) { … }