1/*-
2 * modified for Lites 1.1
3 *
4 * Aug 1995, Godmar Back (gback@cs.utah.edu)
5 * University of Utah, Department of Computer Science
6 */
7/*-
8 * Copyright (c) 1982, 1986, 1989, 1993
--- 19 unchanged lines hidden (view full) ---
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 *
35 * @(#)ffs_alloc.c 8.8 (Berkeley) 2/21/94
36 * $FreeBSD: head/sys/fs/ext2fs/ext2_alloc.c 252103 2013-06-23 02:44:42Z pfg $
37 */
38
39#include <sys/param.h>
40#include <sys/systm.h>
41#include <sys/conf.h>
42#include <sys/vnode.h>
43#include <sys/stat.h>
44#include <sys/mount.h>
--- 30 unchanged lines hidden (view full) ---
75 * If no block preference is given the following hierarchy is used
76 * to allocate a block:
77 * 1) allocate a block in the cylinder group that contains the
78 * inode for the file.
79 * 2) quadradically rehash into other cylinder groups, until an
80 * available block is located.
81 */
82int
83ext2_alloc(struct inode *ip, int32_t lbn, int32_t bpref, int size,
84 struct ucred *cred, int32_t *bnp)
85{
86 struct m_ext2fs *fs;
87 struct ext2mount *ump;
88 int32_t bno;
89 int cg;
90 *bnp = 0;
91 fs = ip->i_e2fs;
92 ump = ip->i_ump;
--- 68 unchanged lines hidden (view full) ---
161 struct inode *ip;
162 struct vnode *vp;
163 struct buf *sbp, *ebp;
164 uint32_t *bap, *sbap, *ebap = 0;
165 struct ext2mount *ump;
166 struct cluster_save *buflist;
167 struct indir start_ap[NIADDR + 1], end_ap[NIADDR + 1], *idp;
168 e2fs_lbn_t start_lbn, end_lbn;
169 int32_t soff, newblk, blkno;
170 int i, len, start_lvl, end_lvl, pref, ssize;
171
172 if (doreallocblks == 0)
173 return (ENOSPC);
174
175 vp = ap->a_vp;
176 ip = VTOI(vp);
177 fs = ip->i_e2fs;
--- 67 unchanged lines hidden (view full) ---
245 /*
246 * Find the preferred location for the cluster.
247 */
248 EXT2_LOCK(ump);
249 pref = ext2_blkpref(ip, start_lbn, soff, sbap, 0);
250 /*
251 * Search the block map looking for an allocation of the desired size.
252 */
253 if ((newblk = (int32_t)ext2_hashalloc(ip, dtog(fs, pref), pref,
254 len, ext2_clusteralloc)) == 0){
255 EXT2_UNLOCK(ump);
256 goto fail;
257 }
258 /*
259 * We have found a new contiguous block.
260 *
261 * First we have to replace the old block pointers with the new
--- 283 unchanged lines hidden (view full) ---
545 * we note: blocknr == 0 means that we're about to allocate either
546 * a direct block or a pointer block at the first level of indirection
547 * (In other words, stuff that will go in i_db[] or i_ib[])
548 *
549 * blocknr != 0 means that we're allocating a block that is none
550 * of the above. Then, blocknr tells us the number of the block
551 * that will hold the pointer
552 */
553int32_t
554ext2_blkpref(struct inode *ip, e2fs_lbn_t lbn, int indx, int32_t *bap,
555 int32_t blocknr)
556{
557 int tmp;
558 mtx_assert(EXT2_MTX(ip->i_ump), MA_OWNED);
559
560 /* if the next block is actually what we thought it is,
561 then set the goal to what we thought it should be
562 */
563 if (ip->i_next_alloc_block == lbn && ip->i_next_alloc_goal != 0)
--- 6 unchanged lines hidden (view full) ---
570 for (tmp = indx - 1; tmp >= 0; tmp--)
571 if (bap[tmp])
572 return bap[tmp];
573
574 /* else let's fall back to the blocknr, or, if there is none,
575 follow the rule that a block should be allocated near its inode
576 */
577 return blocknr ? blocknr :
578 (int32_t)(ip->i_block_group *
579 EXT2_BLOCKS_PER_GROUP(ip->i_e2fs)) +
580 ip->i_e2fs->e2fs->e2fs_first_dblock;
581}
582
583/*
584 * Implement the cylinder overflow algorithm.
585 *
586 * The policy implemented by this algorithm is:
--- 363 unchanged lines hidden (view full) ---
950 return (cg * fs->e2fs->e2fs_ipg + ipref +1);
951}
952
953/*
954 * Free a block or fragment.
955 *
956 */
957void
958ext2_blkfree(struct inode *ip, int32_t bno, long size)
959{
960 struct m_ext2fs *fs;
961 struct buf *bp;
962 struct ext2mount *ump;
963 int cg, error;
964 char *bbp;
965
966 fs = ip->i_e2fs;
--- 146 unchanged lines hidden ---
2 * modified for Lites 1.1
3 *
4 * Aug 1995, Godmar Back (gback@cs.utah.edu)
5 * University of Utah, Department of Computer Science
6 */
7/*-
8 * Copyright (c) 1982, 1986, 1989, 1993
--- 19 unchanged lines hidden (view full) ---
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 *
35 * @(#)ffs_alloc.c 8.8 (Berkeley) 2/21/94
36 * $FreeBSD: head/sys/fs/ext2fs/ext2_alloc.c 252103 2013-06-23 02:44:42Z pfg $
37 */
38
39#include <sys/param.h>
40#include <sys/systm.h>
41#include <sys/conf.h>
42#include <sys/vnode.h>
43#include <sys/stat.h>
44#include <sys/mount.h>
--- 30 unchanged lines hidden (view full) ---
75 * If no block preference is given the following hierarchy is used
76 * to allocate a block:
77 * 1) allocate a block in the cylinder group that contains the
78 * inode for the file.
79 * 2) quadradically rehash into other cylinder groups, until an
80 * available block is located.
81 */
82int
83ext2_alloc(struct inode *ip, int32_t lbn, int32_t bpref, int size,
84 struct ucred *cred, int32_t *bnp)
85{
86 struct m_ext2fs *fs;
87 struct ext2mount *ump;
88 int32_t bno;
89 int cg;
90 *bnp = 0;
91 fs = ip->i_e2fs;
92 ump = ip->i_ump;
--- 68 unchanged lines hidden (view full) ---
161 struct inode *ip;
162 struct vnode *vp;
163 struct buf *sbp, *ebp;
164 uint32_t *bap, *sbap, *ebap = 0;
165 struct ext2mount *ump;
166 struct cluster_save *buflist;
167 struct indir start_ap[NIADDR + 1], end_ap[NIADDR + 1], *idp;
168 e2fs_lbn_t start_lbn, end_lbn;
169 int32_t soff, newblk, blkno;
170 int i, len, start_lvl, end_lvl, pref, ssize;
171
172 if (doreallocblks == 0)
173 return (ENOSPC);
174
175 vp = ap->a_vp;
176 ip = VTOI(vp);
177 fs = ip->i_e2fs;
--- 67 unchanged lines hidden (view full) ---
245 /*
246 * Find the preferred location for the cluster.
247 */
248 EXT2_LOCK(ump);
249 pref = ext2_blkpref(ip, start_lbn, soff, sbap, 0);
250 /*
251 * Search the block map looking for an allocation of the desired size.
252 */
253 if ((newblk = (int32_t)ext2_hashalloc(ip, dtog(fs, pref), pref,
254 len, ext2_clusteralloc)) == 0){
255 EXT2_UNLOCK(ump);
256 goto fail;
257 }
258 /*
259 * We have found a new contiguous block.
260 *
261 * First we have to replace the old block pointers with the new
--- 283 unchanged lines hidden (view full) ---
545 * we note: blocknr == 0 means that we're about to allocate either
546 * a direct block or a pointer block at the first level of indirection
547 * (In other words, stuff that will go in i_db[] or i_ib[])
548 *
549 * blocknr != 0 means that we're allocating a block that is none
550 * of the above. Then, blocknr tells us the number of the block
551 * that will hold the pointer
552 */
553int32_t
554ext2_blkpref(struct inode *ip, e2fs_lbn_t lbn, int indx, int32_t *bap,
555 int32_t blocknr)
556{
557 int tmp;
558 mtx_assert(EXT2_MTX(ip->i_ump), MA_OWNED);
559
560 /* if the next block is actually what we thought it is,
561 then set the goal to what we thought it should be
562 */
563 if (ip->i_next_alloc_block == lbn && ip->i_next_alloc_goal != 0)
--- 6 unchanged lines hidden (view full) ---
570 for (tmp = indx - 1; tmp >= 0; tmp--)
571 if (bap[tmp])
572 return bap[tmp];
573
574 /* else let's fall back to the blocknr, or, if there is none,
575 follow the rule that a block should be allocated near its inode
576 */
577 return blocknr ? blocknr :
578 (int32_t)(ip->i_block_group *
579 EXT2_BLOCKS_PER_GROUP(ip->i_e2fs)) +
580 ip->i_e2fs->e2fs->e2fs_first_dblock;
581}
582
583/*
584 * Implement the cylinder overflow algorithm.
585 *
586 * The policy implemented by this algorithm is:
--- 363 unchanged lines hidden (view full) ---
950 return (cg * fs->e2fs->e2fs_ipg + ipref +1);
951}
952
953/*
954 * Free a block or fragment.
955 *
956 */
957void
958ext2_blkfree(struct inode *ip, int32_t bno, long size)
959{
960 struct m_ext2fs *fs;
961 struct buf *bp;
962 struct ext2mount *ump;
963 int cg, error;
964 char *bbp;
965
966 fs = ip->i_e2fs;
--- 146 unchanged lines hidden ---