Deleted Added
full compact
ext2_alloc.c (252103) ext2_alloc.c (254283)
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
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 $
36 * $FreeBSD: head/sys/fs/ext2fs/ext2_alloc.c 254283 2013-08-13 15:40:43Z 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
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)
83ext2_alloc(struct inode *ip, daddr_t lbn, e4fs_daddr_t bpref, int size,
84 struct ucred *cred, e4fs_daddr_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;
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;
169 int soff;
170 e2fs_daddr_t 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 */
171 int i, len, start_lvl, end_lvl, pref, ssize;
172
173 if (doreallocblks == 0)
174 return (ENOSPC);
175
176 vp = ap->a_vp;
177 ip = VTOI(vp);
178 fs = ip->i_e2fs;

--- 67 unchanged lines hidden (view full) ---

246 /*
247 * Find the preferred location for the cluster.
248 */
249 EXT2_LOCK(ump);
250 pref = ext2_blkpref(ip, start_lbn, soff, sbap, 0);
251 /*
252 * Search the block map looking for an allocation of the desired size.
253 */
253 if ((newblk = (int32_t)ext2_hashalloc(ip, dtog(fs, pref), pref,
254 if ((newblk = (e2fs_daddr_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 */
255 len, ext2_clusteralloc)) == 0){
256 EXT2_UNLOCK(ump);
257 goto fail;
258 }
259 /*
260 * We have found a new contiguous block.
261 *
262 * First we have to replace the old block pointers with the new

--- 283 unchanged lines hidden (view full) ---

546 * we note: blocknr == 0 means that we're about to allocate either
547 * a direct block or a pointer block at the first level of indirection
548 * (In other words, stuff that will go in i_db[] or i_ib[])
549 *
550 * blocknr != 0 means that we're allocating a block that is none
551 * of the above. Then, blocknr tells us the number of the block
552 * that will hold the pointer
553 */
553int32_t
554ext2_blkpref(struct inode *ip, e2fs_lbn_t lbn, int indx, int32_t *bap,
555 int32_t blocknr)
554e4fs_daddr_t
555ext2_blkpref(struct inode *ip, e2fs_lbn_t lbn, int indx, e2fs_daddr_t *bap,
556 e2fs_daddr_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 :
557{
558 int tmp;
559 mtx_assert(EXT2_MTX(ip->i_ump), MA_OWNED);
560
561 /* if the next block is actually what we thought it is,
562 then set the goal to what we thought it should be
563 */
564 if (ip->i_next_alloc_block == lbn && ip->i_next_alloc_goal != 0)

--- 6 unchanged lines hidden (view full) ---

571 for (tmp = indx - 1; tmp >= 0; tmp--)
572 if (bap[tmp])
573 return bap[tmp];
574
575 /* else let's fall back to the blocknr, or, if there is none,
576 follow the rule that a block should be allocated near its inode
577 */
578 return blocknr ? blocknr :
578 (int32_t)(ip->i_block_group *
579 (e2fs_daddr_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
580 EXT2_BLOCKS_PER_GROUP(ip->i_e2fs)) +
581 ip->i_e2fs->e2fs->e2fs_first_dblock;
582}
583
584/*
585 * Implement the cylinder overflow algorithm.
586 *
587 * The policy implemented by this algorithm is:

--- 363 unchanged lines hidden (view full) ---

951 return (cg * fs->e2fs->e2fs_ipg + ipref +1);
952}
953
954/*
955 * Free a block or fragment.
956 *
957 */
958void
958ext2_blkfree(struct inode *ip, int32_t bno, long size)
959ext2_blkfree(struct inode *ip, e4fs_daddr_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 ---
960{
961 struct m_ext2fs *fs;
962 struct buf *bp;
963 struct ext2mount *ump;
964 int cg, error;
965 char *bbp;
966
967 fs = ip->i_e2fs;

--- 146 unchanged lines hidden ---