Lines Matching +full:ip +full:- +full:block

1 /*-
7 /*-
8 * SPDX-License-Identifier: BSD-3-Clause
56 ext2_ext_balloc(struct inode *ip, uint32_t lbn, int size, in ext2_ext_balloc() argument
61 struct vnode *vp = ITOV(ip); in ext2_ext_balloc()
65 fs = ip->i_e2fs; in ext2_ext_balloc()
66 blks = howmany(size, fs->e2fs_bsize); in ext2_ext_balloc()
68 error = ext4_ext_get_blocks(ip, lbn, blks, cred, NULL, &allocated, &newblk); in ext2_ext_balloc()
73 bp = getblk(vp, lbn, fs->e2fs_bsize, 0, 0, 0); in ext2_ext_balloc()
77 error = bread(vp, lbn, fs->e2fs_bsize, NOCRED, &bp); in ext2_ext_balloc()
83 bp->b_blkno = fsbtodb(fs, newblk); in ext2_ext_balloc()
95 * the inode and the logical block number in a file.
98 ext2_balloc(struct inode *ip, e2fs_lbn_t lbn, int size, struct ucred *cred, in ext2_balloc() argument
104 struct vnode *vp = ITOV(ip); in ext2_balloc()
113 fs = ip->i_e2fs; in ext2_balloc()
114 ump = ip->i_ump; in ext2_balloc()
117 * check if this is a sequential block allocation. in ext2_balloc()
121 if (lbn == ip->i_next_alloc_block + 1) { in ext2_balloc()
122 ip->i_next_alloc_block++; in ext2_balloc()
123 ip->i_next_alloc_goal++; in ext2_balloc()
126 if (ip->i_flag & IN_E4EXTENTS) in ext2_balloc()
127 return (ext2_ext_balloc(ip, lbn, size, cred, bpp, flags)); in ext2_balloc()
133 nb = ip->i_db[lbn]; in ext2_balloc()
135 * no new block is to be allocated, and no need to expand in ext2_balloc()
139 error = bread(vp, lbn, fs->e2fs_bsize, NOCRED, &bp); in ext2_balloc()
143 bp->b_blkno = fsbtodb(fs, nb); in ext2_balloc()
144 if (ip->i_size >= (lbn + 1) * fs->e2fs_bsize) { in ext2_balloc()
150 error = ext2_alloc(ip, lbn, in ext2_balloc()
151 ext2_blkpref(ip, lbn, (int)lbn, &ip->i_db[0], 0), in ext2_balloc()
152 fs->e2fs_bsize, cred, &newb); in ext2_balloc()
156 * If the newly allocated block exceeds 32-bit limit, in ext2_balloc()
157 * we can not use it in file block maps. in ext2_balloc()
161 bp = getblk(vp, lbn, fs->e2fs_bsize, 0, 0, 0); in ext2_balloc()
162 bp->b_blkno = fsbtodb(fs, newb); in ext2_balloc()
166 ip->i_db[lbn] = dbtofsb(fs, bp->b_blkno); in ext2_balloc()
167 ip->i_flag |= IN_CHANGE | IN_UPDATE; in ext2_balloc()
179 panic("ext2_balloc: ext2_getlbns returned indirect block"); in ext2_balloc()
182 * Fetch the first indirect block allocating if necessary. in ext2_balloc()
184 --num; in ext2_balloc()
185 nb = ip->i_ib[indirs[0].in_off]; in ext2_balloc()
188 pref = ext2_blkpref(ip, lbn, indirs[0].in_off + in ext2_balloc()
189 EXT2_NDIR_BLOCKS, &ip->i_db[0], 0); in ext2_balloc()
190 if ((error = ext2_alloc(ip, lbn, pref, fs->e2fs_bsize, cred, in ext2_balloc()
196 bp = getblk(vp, indirs[1].in_lbn, fs->e2fs_bsize, 0, 0, 0); in ext2_balloc()
197 bp->b_blkno = fsbtodb(fs, newb); in ext2_balloc()
204 ext2_blkfree(ip, nb, fs->e2fs_bsize); in ext2_balloc()
207 ip->i_ib[indirs[0].in_off] = newb; in ext2_balloc()
208 ip->i_flag |= IN_CHANGE | IN_UPDATE; in ext2_balloc()
215 indirs[i].in_lbn, (int)fs->e2fs_bsize, NOCRED, &bp); in ext2_balloc()
219 bap = (e2fs_daddr_t *)bp->b_data; in ext2_balloc()
230 pref = ext2_blkpref(ip, lbn, indirs[i].in_off, bap, in ext2_balloc()
231 bp->b_lblkno); in ext2_balloc()
232 error = ext2_alloc(ip, lbn, pref, (int)fs->e2fs_bsize, cred, &newb); in ext2_balloc()
240 nbp = getblk(vp, indirs[i].in_lbn, fs->e2fs_bsize, 0, 0, 0); in ext2_balloc()
241 nbp->b_blkno = fsbtodb(fs, nb); in ext2_balloc()
248 ext2_blkfree(ip, nb, fs->e2fs_bsize); in ext2_balloc()
252 bap[indirs[i - 1].in_off] = htole32(nb); in ext2_balloc()
260 if (bp->b_bufsize == fs->e2fs_bsize) in ext2_balloc()
261 bp->b_flags |= B_CLUSTEROK; in ext2_balloc()
266 * Get the data block, allocating if necessary. in ext2_balloc()
270 pref = ext2_blkpref(ip, lbn, indirs[i].in_off, &bap[0], in ext2_balloc()
271 bp->b_lblkno); in ext2_balloc()
272 if ((error = ext2_alloc(ip, in ext2_balloc()
273 lbn, pref, (int)fs->e2fs_bsize, cred, &newb)) != 0) { in ext2_balloc()
280 nbp = getblk(vp, lbn, fs->e2fs_bsize, 0, 0, 0); in ext2_balloc()
281 nbp->b_blkno = fsbtodb(fs, nb); in ext2_balloc()
292 if (bp->b_bufsize == fs->e2fs_bsize) in ext2_balloc()
293 bp->b_flags |= B_CLUSTEROK; in ext2_balloc()
303 if (seqcount && (vp->v_mount->mnt_flag & MNT_NOCLUSTERR) == 0) { in ext2_balloc()
304 error = cluster_read(vp, ip->i_size, lbn, in ext2_balloc()
305 (int)fs->e2fs_bsize, NOCRED, in ext2_balloc()
308 error = bread(vp, lbn, (int)fs->e2fs_bsize, NOCRED, &nbp); in ext2_balloc()
315 nbp = getblk(vp, lbn, fs->e2fs_bsize, 0, 0, 0); in ext2_balloc()
316 nbp->b_blkno = fsbtodb(fs, nb); in ext2_balloc()