ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / fs / xfs / xfs_trans_space.h
1 /*
2  * Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms of version 2 of the GNU General Public License as
6  * published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it would be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11  *
12  * Further, this software is distributed without any warranty that it is
13  * free of the rightful claim of any third person regarding infringement
14  * or the like.  Any license provided herein, whether implied or
15  * otherwise, applies only to this software file.  Patent licenses, if
16  * any, provided herein do not apply to combinations of this program with
17  * other software, or any other product whatsoever.
18  *
19  * You should have received a copy of the GNU General Public License along
20  * with this program; if not, write the Free Software Foundation, Inc., 59
21  * Temple Place - Suite 330, Boston MA 02111-1307, USA.
22  *
23  * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
24  * Mountain View, CA  94043, or:
25  *
26  * http://www.sgi.com
27  *
28  * For further information regarding this notice, see:
29  *
30  * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
31  */
32 #ifndef __XFS_TRANS_SPACE_H__
33 #define __XFS_TRANS_SPACE_H__
34
35 /*
36  * Components of space reservations.
37  */
38 #define XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp)    \
39                 (((mp)->m_alloc_mxr[0]) - ((mp)->m_alloc_mnr[0]))
40 #define XFS_EXTENTADD_SPACE_RES(mp,w)   (XFS_BM_MAXLEVELS(mp,w) - 1)
41 #define XFS_NEXTENTADD_SPACE_RES(mp,b,w)\
42         (((b + XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp) - 1) / \
43           XFS_MAX_CONTIG_EXTENTS_PER_BLOCK(mp)) * \
44           XFS_EXTENTADD_SPACE_RES(mp,w))
45 #define XFS_DAENTER_1B(mp,w)    ((w) == XFS_DATA_FORK ? (mp)->m_dirblkfsbs : 1)
46 #define XFS_DAENTER_DBS(mp,w)   \
47         (XFS_DA_NODE_MAXDEPTH + \
48          ((XFS_DIR_IS_V2(mp) && (w) == XFS_DATA_FORK) ? 2 : 0))
49 #define XFS_DAENTER_BLOCKS(mp,w)        \
50         (XFS_DAENTER_1B(mp,w) * XFS_DAENTER_DBS(mp,w))
51 #define XFS_DAENTER_BMAP1B(mp,w)        \
52         XFS_NEXTENTADD_SPACE_RES(mp, XFS_DAENTER_1B(mp, w), w)
53 #define XFS_DAENTER_BMAPS(mp,w)         \
54         (XFS_DAENTER_DBS(mp,w) * XFS_DAENTER_BMAP1B(mp,w))
55 #define XFS_DAENTER_SPACE_RES(mp,w)     \
56         (XFS_DAENTER_BLOCKS(mp,w) + XFS_DAENTER_BMAPS(mp,w))
57 #define XFS_DAREMOVE_SPACE_RES(mp,w)    XFS_DAENTER_BMAPS(mp,w)
58 #define XFS_DIRENTER_MAX_SPLIT(mp,nl)   \
59         (((mp)->m_sb.sb_blocksize == 512 && \
60           XFS_DIR_IS_V1(mp) && \
61           (nl) >= XFS_DIR_LEAF_CAN_DOUBLE_SPLIT_LEN) ? 2 : 1)
62 #define XFS_DIRENTER_SPACE_RES(mp,nl)   \
63         (XFS_DAENTER_SPACE_RES(mp, XFS_DATA_FORK) * \
64          XFS_DIRENTER_MAX_SPLIT(mp,nl))
65 #define XFS_DIRREMOVE_SPACE_RES(mp)     \
66         XFS_DAREMOVE_SPACE_RES(mp, XFS_DATA_FORK)
67 #define XFS_IALLOC_SPACE_RES(mp)        \
68         (XFS_IALLOC_BLOCKS(mp) + XFS_IN_MAXLEVELS(mp)-1)
69
70 /*
71  * Space reservation values for various transactions.
72  */
73 #define XFS_ADDAFORK_SPACE_RES(mp)      \
74         ((mp)->m_dirblkfsbs + \
75          (XFS_DIR_IS_V1(mp) ? 0 : XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK)))
76 #define XFS_ATTRRM_SPACE_RES(mp)        \
77         XFS_DAREMOVE_SPACE_RES(mp, XFS_ATTR_FORK)
78 /* This macro is not used - see inline code in xfs_attr_set */
79 #define XFS_ATTRSET_SPACE_RES(mp, v)    \
80         (XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK) + XFS_B_TO_FSB(mp, v))
81 #define XFS_CREATE_SPACE_RES(mp,nl)     \
82         (XFS_IALLOC_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl))
83 #define XFS_DIOSTRAT_SPACE_RES(mp, v)   \
84         (XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK) + (v))
85 #define XFS_GROWFS_SPACE_RES(mp)        \
86         (2 * XFS_AG_MAXLEVELS(mp))
87 #define XFS_GROWFSRT_SPACE_RES(mp,b)    \
88         ((b) + XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK))
89 #define XFS_LINK_SPACE_RES(mp,nl)       \
90         XFS_DIRENTER_SPACE_RES(mp,nl)
91 #define XFS_MKDIR_SPACE_RES(mp,nl)      \
92         (XFS_IALLOC_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl))
93 #define XFS_QM_DQALLOC_SPACE_RES(mp)    \
94         (XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK) + \
95          XFS_DQUOT_CLUSTER_SIZE_FSB)
96 #define XFS_QM_QINOCREATE_SPACE_RES(mp) \
97         XFS_IALLOC_SPACE_RES(mp)
98 #define XFS_REMOVE_SPACE_RES(mp)        \
99         XFS_DIRREMOVE_SPACE_RES(mp)
100 #define XFS_RENAME_SPACE_RES(mp,nl)     \
101         (XFS_DIRREMOVE_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl))
102 #define XFS_SYMLINK_SPACE_RES(mp,nl,b)  \
103         (XFS_IALLOC_SPACE_RES(mp) + XFS_DIRENTER_SPACE_RES(mp,nl) + (b))
104
105 #endif  /* __XFS_TRANS_SPACE_H__ */