| /* | |
| * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. | |
| * All Rights Reserved. | |
| * | |
| * This program is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU General Public License as | |
| * published by the Free Software Foundation. | |
| * | |
| * This program is distributed in the hope that it would be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| * GNU General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU General Public License | |
| * along with this program; if not, write the Free Software Foundation, | |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
| */ | |
| #ifndef __XFS_RTALLOC_H__ | |
| #define __XFS_RTALLOC_H__ | |
| /* kernel only definitions and functions */ | |
| struct xfs_mount; | |
| struct xfs_trans; | |
| struct xfs_rtalloc_rec { | |
| xfs_rtblock_t ar_startblock; | |
| xfs_rtblock_t ar_blockcount; | |
| }; | |
| typedef int (*xfs_rtalloc_query_range_fn)( | |
| struct xfs_trans *tp, | |
| struct xfs_rtalloc_rec *rec, | |
| void *priv); | |
| #ifdef CONFIG_XFS_RT | |
| /* | |
| * Function prototypes for exported functions. | |
| */ | |
| /* | |
| * Allocate an extent in the realtime subvolume, with the usual allocation | |
| * parameters. The length units are all in realtime extents, as is the | |
| * result block number. | |
| */ | |
| int /* error */ | |
| xfs_rtallocate_extent( | |
| struct xfs_trans *tp, /* transaction pointer */ | |
| xfs_rtblock_t bno, /* starting block number to allocate */ | |
| xfs_extlen_t minlen, /* minimum length to allocate */ | |
| xfs_extlen_t maxlen, /* maximum length to allocate */ | |
| xfs_extlen_t *len, /* out: actual length allocated */ | |
| int wasdel, /* was a delayed allocation extent */ | |
| xfs_extlen_t prod, /* extent product factor */ | |
| xfs_rtblock_t *rtblock); /* out: start block allocated */ | |
| /* | |
| * Free an extent in the realtime subvolume. Length is expressed in | |
| * realtime extents, as is the block number. | |
| */ | |
| int /* error */ | |
| xfs_rtfree_extent( | |
| struct xfs_trans *tp, /* transaction pointer */ | |
| xfs_rtblock_t bno, /* starting block number to free */ | |
| xfs_extlen_t len); /* length of extent freed */ | |
| /* | |
| * Initialize realtime fields in the mount structure. | |
| */ | |
| int /* error */ | |
| xfs_rtmount_init( | |
| struct xfs_mount *mp); /* file system mount structure */ | |
| void | |
| xfs_rtunmount_inodes( | |
| struct xfs_mount *mp); | |
| /* | |
| * Get the bitmap and summary inodes into the mount structure | |
| * at mount time. | |
| */ | |
| int /* error */ | |
| xfs_rtmount_inodes( | |
| struct xfs_mount *mp); /* file system mount structure */ | |
| /* | |
| * Pick an extent for allocation at the start of a new realtime file. | |
| * Use the sequence number stored in the atime field of the bitmap inode. | |
| * Translate this to a fraction of the rtextents, and return the product | |
| * of rtextents and the fraction. | |
| * The fraction sequence is 0, 1/2, 1/4, 3/4, 1/8, ..., 7/8, 1/16, ... | |
| */ | |
| int /* error */ | |
| xfs_rtpick_extent( | |
| struct xfs_mount *mp, /* file system mount point */ | |
| struct xfs_trans *tp, /* transaction pointer */ | |
| xfs_extlen_t len, /* allocation length (rtextents) */ | |
| xfs_rtblock_t *pick); /* result rt extent */ | |
| /* | |
| * Grow the realtime area of the filesystem. | |
| */ | |
| int | |
| xfs_growfs_rt( | |
| struct xfs_mount *mp, /* file system mount structure */ | |
| xfs_growfs_rt_t *in); /* user supplied growfs struct */ | |
| /* | |
| * From xfs_rtbitmap.c | |
| */ | |
| int xfs_rtbuf_get(struct xfs_mount *mp, struct xfs_trans *tp, | |
| xfs_rtblock_t block, int issum, struct xfs_buf **bpp); | |
| int xfs_rtcheck_range(struct xfs_mount *mp, struct xfs_trans *tp, | |
| xfs_rtblock_t start, xfs_extlen_t len, int val, | |
| xfs_rtblock_t *new, int *stat); | |
| int xfs_rtfind_back(struct xfs_mount *mp, struct xfs_trans *tp, | |
| xfs_rtblock_t start, xfs_rtblock_t limit, | |
| xfs_rtblock_t *rtblock); | |
| int xfs_rtfind_forw(struct xfs_mount *mp, struct xfs_trans *tp, | |
| xfs_rtblock_t start, xfs_rtblock_t limit, | |
| xfs_rtblock_t *rtblock); | |
| int xfs_rtmodify_range(struct xfs_mount *mp, struct xfs_trans *tp, | |
| xfs_rtblock_t start, xfs_extlen_t len, int val); | |
| int xfs_rtmodify_summary_int(struct xfs_mount *mp, struct xfs_trans *tp, | |
| int log, xfs_rtblock_t bbno, int delta, | |
| xfs_buf_t **rbpp, xfs_fsblock_t *rsb, | |
| xfs_suminfo_t *sum); | |
| int xfs_rtmodify_summary(struct xfs_mount *mp, struct xfs_trans *tp, int log, | |
| xfs_rtblock_t bbno, int delta, xfs_buf_t **rbpp, | |
| xfs_fsblock_t *rsb); | |
| int xfs_rtfree_range(struct xfs_mount *mp, struct xfs_trans *tp, | |
| xfs_rtblock_t start, xfs_extlen_t len, | |
| struct xfs_buf **rbpp, xfs_fsblock_t *rsb); | |
| int xfs_rtalloc_query_range(struct xfs_trans *tp, | |
| struct xfs_rtalloc_rec *low_rec, | |
| struct xfs_rtalloc_rec *high_rec, | |
| xfs_rtalloc_query_range_fn fn, | |
| void *priv); | |
| int xfs_rtalloc_query_all(struct xfs_trans *tp, | |
| xfs_rtalloc_query_range_fn fn, | |
| void *priv); | |
| #else | |
| # define xfs_rtallocate_extent(t,b,min,max,l,f,p,rb) (ENOSYS) | |
| # define xfs_rtfree_extent(t,b,l) (ENOSYS) | |
| # define xfs_rtpick_extent(m,t,l,rb) (ENOSYS) | |
| # define xfs_growfs_rt(mp,in) (ENOSYS) | |
| # define xfs_rtalloc_query_range(t,l,h,f,p) (ENOSYS) | |
| # define xfs_rtalloc_query_all(t,f,p) (ENOSYS) | |
| # define xfs_rtbuf_get(m,t,b,i,p) (ENOSYS) | |
| static inline int /* error */ | |
| xfs_rtmount_init( | |
| xfs_mount_t *mp) /* file system mount structure */ | |
| { | |
| if (mp->m_sb.sb_rblocks == 0) | |
| return 0; | |
| xfs_warn(mp, "Not built with CONFIG_XFS_RT"); | |
| return -ENOSYS; | |
| } | |
| # define xfs_rtmount_inodes(m) (((mp)->m_sb.sb_rblocks == 0)? 0 : (ENOSYS)) | |
| # define xfs_rtunmount_inodes(m) | |
| #endif /* CONFIG_XFS_RT */ | |
| #endif /* __XFS_RTALLOC_H__ */ |