• Home
  • Raw
  • Download

Lines Matching +full:ip +full:- +full:blocks

2  * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
3 * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
45 static int punch_hole(struct gfs2_inode *ip, u64 offset, u64 length);
48 * gfs2_unstuffer_page - unstuff a stuffed inode into a block cached by a page
49 * @ip: the inode
57 static int gfs2_unstuffer_page(struct gfs2_inode *ip, struct buffer_head *dibh, in gfs2_unstuffer_page() argument
60 struct inode *inode = &ip->i_inode; in gfs2_unstuffer_page()
64 if (!page || page->index) { in gfs2_unstuffer_page()
65 page = find_or_create_page(inode->i_mapping, 0, GFP_NOFS); in gfs2_unstuffer_page()
67 return -ENOMEM; in gfs2_unstuffer_page()
75 if (dsize > gfs2_max_stuffed_size(ip)) in gfs2_unstuffer_page()
76 dsize = gfs2_max_stuffed_size(ip); in gfs2_unstuffer_page()
78 memcpy(kaddr, dibh->b_data + sizeof(struct gfs2_dinode), dsize); in gfs2_unstuffer_page()
79 memset(kaddr + dsize, 0, PAGE_SIZE - dsize); in gfs2_unstuffer_page()
86 create_empty_buffers(page, BIT(inode->i_blkbits), in gfs2_unstuffer_page()
92 map_bh(bh, inode->i_sb, block); in gfs2_unstuffer_page()
95 if (gfs2_is_jdata(ip)) in gfs2_unstuffer_page()
96 gfs2_trans_add_data(ip->i_gl, bh); in gfs2_unstuffer_page()
99 gfs2_ordered_add_inode(ip); in gfs2_unstuffer_page()
111 * gfs2_unstuff_dinode - Unstuff a dinode when the data has grown too big
112 * @ip: The GFS2 inode to unstuff
121 int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page) in gfs2_unstuff_dinode() argument
126 int isdir = gfs2_is_dir(ip); in gfs2_unstuff_dinode()
129 down_write(&ip->i_rw_mutex); in gfs2_unstuff_dinode()
131 error = gfs2_meta_inode_buffer(ip, &dibh); in gfs2_unstuff_dinode()
135 if (i_size_read(&ip->i_inode)) { in gfs2_unstuff_dinode()
140 error = gfs2_alloc_blocks(ip, &block, &n, 0, NULL); in gfs2_unstuff_dinode()
144 gfs2_trans_add_unrevoke(GFS2_SB(&ip->i_inode), block, 1); in gfs2_unstuff_dinode()
145 error = gfs2_dir_get_new_buffer(ip, block, &bh); in gfs2_unstuff_dinode()
152 error = gfs2_unstuffer_page(ip, dibh, block, page); in gfs2_unstuff_dinode()
160 gfs2_trans_add_meta(ip->i_gl, dibh); in gfs2_unstuff_dinode()
161 di = (struct gfs2_dinode *)dibh->b_data; in gfs2_unstuff_dinode()
164 if (i_size_read(&ip->i_inode)) { in gfs2_unstuff_dinode()
166 gfs2_add_inode_blocks(&ip->i_inode, 1); in gfs2_unstuff_dinode()
167 di->di_blocks = cpu_to_be64(gfs2_get_inode_blocks(&ip->i_inode)); in gfs2_unstuff_dinode()
170 ip->i_height = 1; in gfs2_unstuff_dinode()
171 di->di_height = cpu_to_be16(1); in gfs2_unstuff_dinode()
176 up_write(&ip->i_rw_mutex); in gfs2_unstuff_dinode()
182 * find_metapath - Find path through the metadata tree
186 * @height: The pre-calculated height of the metadata tree
189 * through the metadata of inode "ip" to get to block "block".
192 * Given: "ip" is a height 3 file, "offset" is 101342453, and this is a
204 * ----------------------------------------
209 * ----------------------------------------
213 * ----------------------------------------
218 * ----------------------------------------
222 * ----------------------------------------
227 * ----------------------------------------
231 * ----------------------------------------
236 * ----------------------------------------
245 mp->mp_fheight = height; in find_metapath()
246 for (i = height; i--;) in find_metapath()
247 mp->mp_list[i] = do_div(block, sdp->sd_inptrs); in find_metapath()
252 if (mp->mp_list[0] == 0) in metapath_branch_start()
258 * metaptr1 - Return the first possible metadata pointer in a metapath buffer
264 struct buffer_head *bh = mp->mp_bh[height]; in metaptr1()
266 return ((__be64 *)(bh->b_data + sizeof(struct gfs2_dinode))); in metaptr1()
267 return ((__be64 *)(bh->b_data + sizeof(struct gfs2_meta_header))); in metaptr1()
271 * metapointer - Return pointer to start of metadata in a buffer
283 return p + mp->mp_list[height]; in metapointer()
288 const struct buffer_head *bh = mp->mp_bh[height]; in metaend()
289 return (const __be64 *)(bh->b_data + bh->b_size); in metaend()
297 for (hgt = 0; hgt < mp->mp_aheight; hgt++) in clone_metapath()
298 get_bh(clone->mp_bh[hgt]); in clone_metapath()
314 rabh->b_end_io = end_buffer_read_sync; in gfs2_metapath_ra()
326 static int __fillup_metapath(struct gfs2_inode *ip, struct metapath *mp, in __fillup_metapath() argument
336 ret = gfs2_meta_indirect_buffer(ip, x + 1, dblock, &mp->mp_bh[x + 1]); in __fillup_metapath()
340 mp->mp_aheight = x + 1; in __fillup_metapath()
345 * lookup_metapath - Walk the metadata tree to a specific point
346 * @ip: The inode
350 * hooked onto mp->mp_bh[0] and that the metapath has been initialised
355 * at which it found the unallocated block. Blocks which are found are
356 * added to the mp->mp_bh[] list.
361 static int lookup_metapath(struct gfs2_inode *ip, struct metapath *mp) in lookup_metapath() argument
363 return __fillup_metapath(ip, mp, 0, ip->i_height - 1); in lookup_metapath()
367 * fillup_metapath - fill up buffers for the metadata path to a specific height
368 * @ip: The inode
377 static int fillup_metapath(struct gfs2_inode *ip, struct metapath *mp, int h) in fillup_metapath() argument
384 for (x = h - 1; x > 0; x--) { in fillup_metapath()
385 if (mp->mp_bh[x]) in fillup_metapath()
389 ret = __fillup_metapath(ip, mp, x, h); in fillup_metapath()
392 return mp->mp_aheight - x - 1; in fillup_metapath()
400 for (hgt = mp->mp_fheight - 1; hgt >= 0; hgt--) { in metapath_to_block()
401 if (hgt < mp->mp_aheight) in metapath_to_block()
402 block += mp->mp_list[hgt] * factor; in metapath_to_block()
403 factor *= sdp->sd_inptrs; in metapath_to_block()
413 if (mp->mp_bh[i] == NULL) in release_metapath()
415 brelse(mp->mp_bh[i]); in release_metapath()
416 mp->mp_bh[i] = NULL; in release_metapath()
421 * gfs2_extent_length - Returns length of an extent of blocks
432 const __be64 *end = (__be64 *)(bh->b_data + bh->b_size); in gfs2_extent_length()
445 return ptr - first; in gfs2_extent_length()
451 * gfs2_metadata_walker - walk an indirect block
462 * gfs2_walk_metadata - walk a tree of indirect blocks
465 * @max_len: Maximum number of blocks to walk
475 struct gfs2_inode *ip = GFS2_I(inode); in gfs2_walk_metadata() local
486 for (hgt = mp->mp_fheight - 1; hgt >= mp->mp_aheight; hgt--) { in gfs2_walk_metadata()
487 max_len += mp->mp_list[hgt] * factor; in gfs2_walk_metadata()
488 mp->mp_list[hgt] = 0; in gfs2_walk_metadata()
489 factor *= sdp->sd_inptrs; in gfs2_walk_metadata()
493 u16 start = mp->mp_list[hgt]; in gfs2_walk_metadata()
499 ptrs = (hgt >= 1 ? sdp->sd_inptrs : sdp->sd_diptrs) - start; in gfs2_walk_metadata()
508 BUG_ON(mp->mp_aheight == mp->mp_fheight); in gfs2_walk_metadata()
509 ptrs = mp->mp_list[hgt] - start; in gfs2_walk_metadata()
517 max_len -= len; in gfs2_walk_metadata()
523 brelse(mp->mp_bh[hgt]); in gfs2_walk_metadata()
524 mp->mp_bh[hgt] = NULL; in gfs2_walk_metadata()
525 mp->mp_list[hgt] = 0; in gfs2_walk_metadata()
528 hgt--; in gfs2_walk_metadata()
529 factor *= sdp->sd_inptrs; in gfs2_walk_metadata()
532 (mp->mp_list[hgt])++; in gfs2_walk_metadata()
534 if (mp->mp_list[hgt] >= sdp->sd_inptrs) in gfs2_walk_metadata()
537 if (mp->mp_list[hgt] >= sdp->sd_diptrs) in gfs2_walk_metadata()
543 ret = fillup_metapath(ip, mp, ip->i_height - 1); in gfs2_walk_metadata()
547 for (; ret; ret--) in gfs2_walk_metadata()
548 do_div(factor, sdp->sd_inptrs); in gfs2_walk_metadata()
549 mp->mp_aheight = hgt + 1; in gfs2_walk_metadata()
560 hgt = mp->mp_aheight - 1; in gfs2_hole_walker()
566 mp->mp_list[hgt] += ptr - start; in gfs2_hole_walker()
567 if (mp->mp_aheight == mp->mp_fheight) in gfs2_hole_walker()
576 * gfs2_hole_size - figure out the size of a hole
579 * @len: How far to look (in blocks)
600 hole_size = metapath_to_block(GFS2_SB(inode), &clone) - lblock; in gfs2_hole_size()
603 iomap->length = hole_size << inode->i_blkbits; in gfs2_hole_size()
615 __be64 *ptr = (__be64 *)(mp->mp_bh[i - 1]->b_data + in gfs2_indirect_init()
619 BUG_ON(mp->mp_bh[i] != NULL); in gfs2_indirect_init()
620 mp->mp_bh[i] = gfs2_meta_new(gl, bn); in gfs2_indirect_init()
621 gfs2_trans_add_meta(gl, mp->mp_bh[i]); in gfs2_indirect_init()
622 gfs2_metatype_set(mp->mp_bh[i], GFS2_METATYPE_IN, GFS2_FORMAT_IN); in gfs2_indirect_init()
623 gfs2_buffer_clear_tail(mp->mp_bh[i], sizeof(struct gfs2_meta_header)); in gfs2_indirect_init()
637 * gfs2_iomap_alloc - Build a metadata tree of the requested height
644 * i) Indirect blocks to grow the metadata tree height
645 * ii) Indirect blocks to fill in lower part of the metadata tree
646 * iii) Data blocks
649 * total number of blocks which we need via gfs2_alloc_size.
652 * enough contiguous free blocks are available, there will only be one
654 * the blocks in order.
657 * worth of data -- with a default block size of 4K, that's slightly
661 * iomap iteration would then find the blocks already allocated.
669 struct gfs2_inode *ip = GFS2_I(inode); in gfs2_iomap_alloc() local
671 struct buffer_head *dibh = mp->mp_bh[0]; in gfs2_iomap_alloc()
674 size_t dblks = iomap->length >> inode->i_blkbits; in gfs2_iomap_alloc()
675 const unsigned end_of_metadata = mp->mp_fheight - 1; in gfs2_iomap_alloc()
681 BUG_ON(mp->mp_aheight < 1); in gfs2_iomap_alloc()
685 gfs2_trans_add_meta(ip->i_gl, dibh); in gfs2_iomap_alloc()
687 down_write(&ip->i_rw_mutex); in gfs2_iomap_alloc()
689 if (mp->mp_fheight == mp->mp_aheight) { in gfs2_iomap_alloc()
693 /* Need to allocate indirect blocks */ in gfs2_iomap_alloc()
694 if (mp->mp_fheight == ip->i_height) { in gfs2_iomap_alloc()
696 iblks = mp->mp_fheight - mp->mp_aheight; in gfs2_iomap_alloc()
701 iblks = mp->mp_fheight - ip->i_height; in gfs2_iomap_alloc()
703 iblks += (mp->mp_fheight - branch_start); in gfs2_iomap_alloc()
710 i = mp->mp_aheight; in gfs2_iomap_alloc()
712 n = blks - alloced; in gfs2_iomap_alloc()
713 ret = gfs2_alloc_blocks(ip, &bn, &n, 0, NULL); in gfs2_iomap_alloc()
717 if (state != ALLOC_DATA || gfs2_is_jdata(ip)) in gfs2_iomap_alloc()
723 ptr = (__be64 *)(dibh->b_data + in gfs2_iomap_alloc()
727 for (; i - 1 < mp->mp_fheight - ip->i_height && n > 0; in gfs2_iomap_alloc()
728 i++, n--) in gfs2_iomap_alloc()
729 gfs2_indirect_init(mp, ip->i_gl, i, 0, bn++); in gfs2_iomap_alloc()
730 if (i - 1 == mp->mp_fheight - ip->i_height) { in gfs2_iomap_alloc()
731 i--; in gfs2_iomap_alloc()
732 gfs2_buffer_copy_tail(mp->mp_bh[i], in gfs2_iomap_alloc()
738 ptr = (__be64 *)(mp->mp_bh[i]->b_data + in gfs2_iomap_alloc()
742 for(i = branch_start; i < mp->mp_fheight; i++) { in gfs2_iomap_alloc()
743 if (mp->mp_bh[i] == NULL) in gfs2_iomap_alloc()
745 brelse(mp->mp_bh[i]); in gfs2_iomap_alloc()
746 mp->mp_bh[i] = NULL; in gfs2_iomap_alloc()
754 if (i > 1 && i < mp->mp_fheight) in gfs2_iomap_alloc()
755 gfs2_trans_add_meta(ip->i_gl, mp->mp_bh[i-1]); in gfs2_iomap_alloc()
756 for (; i < mp->mp_fheight && n > 0; i++, n--) in gfs2_iomap_alloc()
757 gfs2_indirect_init(mp, ip->i_gl, i, in gfs2_iomap_alloc()
758 mp->mp_list[i-1], bn++); in gfs2_iomap_alloc()
759 if (i == mp->mp_fheight) in gfs2_iomap_alloc()
763 /* Tree complete, adding data blocks */ in gfs2_iomap_alloc()
766 BUG_ON(mp->mp_bh[end_of_metadata] == NULL); in gfs2_iomap_alloc()
767 gfs2_trans_add_meta(ip->i_gl, mp->mp_bh[end_of_metadata]); in gfs2_iomap_alloc()
770 iomap->addr = bn << inode->i_blkbits; in gfs2_iomap_alloc()
771 iomap->flags |= IOMAP_F_MERGED | IOMAP_F_NEW; in gfs2_iomap_alloc()
772 while (n-- > 0) in gfs2_iomap_alloc()
776 } while (iomap->addr == IOMAP_NULL_ADDR); in gfs2_iomap_alloc()
778 iomap->type = IOMAP_MAPPED; in gfs2_iomap_alloc()
779 iomap->length = (u64)dblks << inode->i_blkbits; in gfs2_iomap_alloc()
780 ip->i_height = mp->mp_fheight; in gfs2_iomap_alloc()
781 gfs2_add_inode_blocks(&ip->i_inode, alloced); in gfs2_iomap_alloc()
782 gfs2_dinode_out(ip, dibh->b_data); in gfs2_iomap_alloc()
784 up_write(&ip->i_rw_mutex); in gfs2_iomap_alloc()
791 * gfs2_alloc_size - Compute the maximum allocation size
794 * @size: Requested size in blocks
798 * Returns: size in blocks
802 struct gfs2_inode *ip = GFS2_I(inode); in gfs2_alloc_size() local
814 if (gfs2_is_stuffed(ip) || mp->mp_fheight != mp->mp_aheight) { in gfs2_alloc_size()
815 unsigned int maxsize = mp->mp_fheight > 1 ? in gfs2_alloc_size()
816 sdp->sd_inptrs : sdp->sd_diptrs; in gfs2_alloc_size()
817 maxsize -= mp->mp_list[mp->mp_fheight - 1]; in gfs2_alloc_size()
823 first = metapointer(ip->i_height - 1, mp); in gfs2_alloc_size()
824 end = metaend(ip->i_height - 1, mp); in gfs2_alloc_size()
825 if (end - first > size) in gfs2_alloc_size()
831 return ptr - first; in gfs2_alloc_size()
835 * gfs2_iomap_get - Map blocks from an inode to disk blocks
849 struct gfs2_inode *ip = GFS2_I(inode); in gfs2_iomap_get() local
862 return -EINVAL; in gfs2_iomap_get()
864 down_read(&ip->i_rw_mutex); in gfs2_iomap_get()
866 ret = gfs2_meta_inode_buffer(ip, &dibh); in gfs2_iomap_get()
869 mp->mp_bh[0] = dibh; in gfs2_iomap_get()
871 if (gfs2_is_stuffed(ip)) { in gfs2_iomap_get()
873 loff_t max_size = gfs2_max_stuffed_size(ip); in gfs2_iomap_get()
877 iomap->length = max_size; in gfs2_iomap_get()
881 ret = -ENOENT; in gfs2_iomap_get()
884 iomap->offset = pos; in gfs2_iomap_get()
885 iomap->length = length; in gfs2_iomap_get()
889 iomap->length = size; in gfs2_iomap_get()
891 iomap->addr = (ip->i_no_addr << inode->i_blkbits) + in gfs2_iomap_get()
893 iomap->type = IOMAP_INLINE; in gfs2_iomap_get()
894 iomap->inline_data = dibh->b_data + sizeof(struct gfs2_dinode); in gfs2_iomap_get()
899 lblock = pos >> inode->i_blkbits; in gfs2_iomap_get()
900 iomap->offset = lblock << inode->i_blkbits; in gfs2_iomap_get()
901 lblock_stop = (pos + length - 1) >> inode->i_blkbits; in gfs2_iomap_get()
902 len = lblock_stop - lblock + 1; in gfs2_iomap_get()
903 iomap->length = len << inode->i_blkbits; in gfs2_iomap_get()
905 height = ip->i_height; in gfs2_iomap_get()
906 while ((lblock + 1) * sdp->sd_sb.sb_bsize > sdp->sd_heightsize[height]) in gfs2_iomap_get()
909 if (height > ip->i_height || gfs2_is_stuffed(ip)) in gfs2_iomap_get()
912 ret = lookup_metapath(ip, mp); in gfs2_iomap_get()
916 if (mp->mp_aheight != ip->i_height) in gfs2_iomap_get()
919 ptr = metapointer(ip->i_height - 1, mp); in gfs2_iomap_get()
923 bh = mp->mp_bh[ip->i_height - 1]; in gfs2_iomap_get()
926 iomap->addr = be64_to_cpu(*ptr) << inode->i_blkbits; in gfs2_iomap_get()
927 iomap->length = len << inode->i_blkbits; in gfs2_iomap_get()
928 iomap->type = IOMAP_MAPPED; in gfs2_iomap_get()
929 iomap->flags |= IOMAP_F_MERGED; in gfs2_iomap_get()
931 iomap->flags |= IOMAP_F_GFS2_BOUNDARY; in gfs2_iomap_get()
934 iomap->bdev = inode->i_sb->s_bdev; in gfs2_iomap_get()
936 up_read(&ip->i_rw_mutex); in gfs2_iomap_get()
942 ret = -ENOENT; in gfs2_iomap_get()
943 else if (height == ip->i_height) in gfs2_iomap_get()
946 iomap->length = size - pos; in gfs2_iomap_get()
954 alloc_size = len << inode->i_blkbits; in gfs2_iomap_get()
955 if (alloc_size < iomap->length) in gfs2_iomap_get()
956 iomap->length = alloc_size; in gfs2_iomap_get()
958 if (pos < size && height == ip->i_height) in gfs2_iomap_get()
962 iomap->addr = IOMAP_NULL_ADDR; in gfs2_iomap_get()
963 iomap->type = IOMAP_HOLE; in gfs2_iomap_get()
969 struct gfs2_inode *ip = GFS2_I(inode); in gfs2_write_lock() local
973 gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &ip->i_gh); in gfs2_write_lock()
974 error = gfs2_glock_nq(&ip->i_gh); in gfs2_write_lock()
977 if (&ip->i_inode == sdp->sd_rindex) { in gfs2_write_lock()
978 struct gfs2_inode *m_ip = GFS2_I(sdp->sd_statfs_inode); in gfs2_write_lock()
980 error = gfs2_glock_nq_init(m_ip->i_gl, LM_ST_EXCLUSIVE, in gfs2_write_lock()
981 GL_NOCACHE, &m_ip->i_gh); in gfs2_write_lock()
988 gfs2_glock_dq(&ip->i_gh); in gfs2_write_lock()
990 gfs2_holder_uninit(&ip->i_gh); in gfs2_write_lock()
996 struct gfs2_inode *ip = GFS2_I(inode); in gfs2_write_unlock() local
999 if (&ip->i_inode == sdp->sd_rindex) { in gfs2_write_unlock()
1000 struct gfs2_inode *m_ip = GFS2_I(sdp->sd_statfs_inode); in gfs2_write_unlock()
1002 gfs2_glock_dq_uninit(&m_ip->i_gh); in gfs2_write_unlock()
1004 gfs2_glock_dq_uninit(&ip->i_gh); in gfs2_write_unlock()
1011 struct gfs2_inode *ip = GFS2_I(inode); in gfs2_iomap_journaled_page_done() local
1013 gfs2_page_add_databufs(ip, page, offset_in_page(pos), copied); in gfs2_iomap_journaled_page_done()
1021 struct gfs2_inode *ip = GFS2_I(inode); in gfs2_iomap_begin_write() local
1031 unstuff = gfs2_is_stuffed(ip) && in gfs2_iomap_begin_write()
1032 pos + length > gfs2_max_stuffed_size(ip); in gfs2_iomap_begin_write()
1038 alloc_required = unstuff || iomap->type == IOMAP_HOLE; in gfs2_iomap_begin_write()
1040 if (alloc_required || gfs2_is_jdata(ip)) in gfs2_iomap_begin_write()
1041 gfs2_write_calc_reserv(ip, iomap->length, &data_blocks, in gfs2_iomap_begin_write()
1049 ret = gfs2_quota_lock_check(ip, &ap); in gfs2_iomap_begin_write()
1053 ret = gfs2_inplace_reserve(ip, &ap); in gfs2_iomap_begin_write()
1059 if (gfs2_is_jdata(ip)) in gfs2_iomap_begin_write()
1063 if (inode == sdp->sd_rindex) in gfs2_iomap_begin_write()
1066 rblocks += gfs2_rg_blocks(ip, data_blocks + ind_blocks); in gfs2_iomap_begin_write()
1068 ret = gfs2_trans_begin(sdp, rblocks, iomap->length >> inode->i_blkbits); in gfs2_iomap_begin_write()
1073 ret = gfs2_unstuff_dinode(ip, NULL); in gfs2_iomap_begin_write()
1077 ret = gfs2_iomap_get(inode, iomap->offset, iomap->length, in gfs2_iomap_begin_write()
1083 if (iomap->type == IOMAP_HOLE) { in gfs2_iomap_begin_write()
1087 gfs2_inplace_release(ip); in gfs2_iomap_begin_write()
1088 punch_hole(ip, iomap->offset, iomap->length); in gfs2_iomap_begin_write()
1092 if (!gfs2_is_stuffed(ip) && gfs2_is_jdata(ip)) in gfs2_iomap_begin_write()
1093 iomap->page_done = gfs2_iomap_journaled_page_done; in gfs2_iomap_begin_write()
1100 gfs2_inplace_release(ip); in gfs2_iomap_begin_write()
1103 gfs2_quota_unlock(ip); in gfs2_iomap_begin_write()
1112 struct gfs2_inode *ip = GFS2_I(inode); in gfs2_iomap_begin() local
1116 iomap->flags |= IOMAP_F_BUFFER_HEAD; in gfs2_iomap_begin()
1118 trace_gfs2_iomap_start(ip, pos, length, flags); in gfs2_iomap_begin()
1129 iomap->type != IOMAP_MAPPED) in gfs2_iomap_begin()
1130 ret = -ENOTBLK; in gfs2_iomap_begin()
1134 iomap->private = mp.mp_bh[0]; in gfs2_iomap_begin()
1137 trace_gfs2_iomap_end(ip, iomap, ret); in gfs2_iomap_begin()
1144 struct gfs2_inode *ip = GFS2_I(inode); in gfs2_iomap_end() local
1146 struct gfs2_trans *tr = current->journal_info; in gfs2_iomap_end()
1147 struct buffer_head *dibh = iomap->private; in gfs2_iomap_end()
1152 if (iomap->type != IOMAP_INLINE) { in gfs2_iomap_end()
1153 gfs2_ordered_add_inode(ip); in gfs2_iomap_end()
1155 if (tr->tr_num_buf_new) in gfs2_iomap_end()
1158 gfs2_trans_add_meta(ip->i_gl, dibh); in gfs2_iomap_end()
1161 if (inode == sdp->sd_rindex) { in gfs2_iomap_end()
1163 sdp->sd_rindex_uptodate = 0; in gfs2_iomap_end()
1167 gfs2_inplace_release(ip); in gfs2_iomap_end()
1169 if (length != written && (iomap->flags & IOMAP_F_NEW)) { in gfs2_iomap_end()
1170 /* Deallocate blocks that were just allocated. */ in gfs2_iomap_end()
1171 loff_t blockmask = i_blocksize(inode) - 1; in gfs2_iomap_end()
1176 truncate_pagecache_range(inode, pos, end - 1); in gfs2_iomap_end()
1177 punch_hole(ip, pos, end - pos); in gfs2_iomap_end()
1181 if (ip->i_qadata && ip->i_qadata->qa_qd_num) in gfs2_iomap_end()
1182 gfs2_quota_unlock(ip); in gfs2_iomap_end()
1197 * gfs2_block_map - Map one or more blocks of an inode to a disk block
1201 * @create: True if its ok to alloc blocks to satify the request
1203 * The size of the requested mapping is defined in bh_map->b_size.
1205 * Clears buffer_mapped(bh_map) and leaves bh_map->b_size unchanged
1207 * bh_map->b_size to indicate the size of the mapping when @lblock and
1208 * successive blocks are mapped, up to the requested size.
1212 * blocks were allocated.
1220 struct gfs2_inode *ip = GFS2_I(inode); in gfs2_block_map() local
1221 loff_t pos = (loff_t)lblock << inode->i_blkbits; in gfs2_block_map()
1222 loff_t length = bh_map->b_size; in gfs2_block_map()
1230 trace_gfs2_bmap(ip, bh_map, lblock, create, 1); in gfs2_block_map()
1244 if (iomap.length > bh_map->b_size) { in gfs2_block_map()
1245 iomap.length = bh_map->b_size; in gfs2_block_map()
1249 map_bh(bh_map, inode->i_sb, iomap.addr >> inode->i_blkbits); in gfs2_block_map()
1250 bh_map->b_size = iomap.length; in gfs2_block_map()
1257 trace_gfs2_bmap(ip, bh_map, lblock, create, ret); in gfs2_block_map()
1274 bh.b_size = BIT(inode->i_blkbits + (create ? 0 : 5)); in gfs2_extent_map()
1276 *extlen = bh.b_size >> inode->i_blkbits; in gfs2_extent_map()
1286 * gfs2_block_zero_range - Deal with zeroing out data
1293 struct address_space *mapping = inode->i_mapping; in gfs2_block_zero_range()
1294 struct gfs2_inode *ip = GFS2_I(inode); in gfs2_block_zero_range() local
1296 unsigned offset = from & (PAGE_SIZE-1); in gfs2_block_zero_range()
1306 blocksize = inode->i_sb->s_blocksize; in gfs2_block_zero_range()
1307 iblock = index << (PAGE_SHIFT - inode->i_sb->s_blocksize_bits); in gfs2_block_zero_range()
1316 bh = bh->b_this_page; in gfs2_block_zero_range()
1325 /* unmapped? It's a hole - nothing to do */ in gfs2_block_zero_range()
1330 /* Ok, it's mapped. Make sure it's up-to-date */ in gfs2_block_zero_range()
1335 err = -EIO; in gfs2_block_zero_range()
1344 if (gfs2_is_jdata(ip)) in gfs2_block_zero_range()
1345 gfs2_trans_add_data(ip->i_gl, bh); in gfs2_block_zero_range()
1347 gfs2_ordered_add_inode(ip); in gfs2_block_zero_range()
1360 * gfs2_journaled_truncate - Wrapper for truncate_pagecache for jdata files
1373 u64 max_chunk = GFS2_JTRUNC_REVOKES * sdp->sd_vfs->s_blocksize; in gfs2_journaled_truncate()
1381 chunk = oldsize - newsize; in gfs2_journaled_truncate()
1387 chunk = offs + ((chunk - offs) & PAGE_MASK); in gfs2_journaled_truncate()
1389 truncate_pagecache(inode, oldsize - chunk); in gfs2_journaled_truncate()
1390 oldsize -= chunk; in gfs2_journaled_truncate()
1392 tr = current->journal_info; in gfs2_journaled_truncate()
1393 if (!test_bit(TR_TOUCHED, &tr->tr_flags)) in gfs2_journaled_truncate()
1407 struct gfs2_inode *ip = GFS2_I(inode); in trunc_start() local
1410 int journaled = gfs2_is_jdata(ip); in trunc_start()
1411 u64 oldsize = inode->i_size; in trunc_start()
1421 error = gfs2_meta_inode_buffer(ip, &dibh); in trunc_start()
1425 gfs2_trans_add_meta(ip->i_gl, dibh); in trunc_start()
1427 if (gfs2_is_stuffed(ip)) { in trunc_start()
1431 unsigned int offs = newsize & (blocksize - 1); in trunc_start()
1434 blocksize - offs); in trunc_start()
1438 ip->i_diskflags |= GFS2_DIF_TRUNC_IN_PROG; in trunc_start()
1442 ip->i_inode.i_mtime = ip->i_inode.i_ctime = current_time(&ip->i_inode); in trunc_start()
1443 gfs2_dinode_out(ip, dibh->b_data); in trunc_start()
1452 if (current->journal_info) in trunc_start()
1464 if (!ret && iomap->type == IOMAP_HOLE) in gfs2_iomap_get_alloc()
1471 * sweep_bh_for_rgrps - find an rgrp in a meta buffer and free blocks therein
1472 * @ip: inode
1478 * @btotal: place to keep count of total blocks freed
1480 * We sweep a metadata buffer (provided by the metapath) for blocks we need to
1487 * if we're interrupted by power-outages.
1490 * *btotal has the total number of blocks freed
1492 static int sweep_bh_for_rgrps(struct gfs2_inode *ip, struct gfs2_holder *rd_gh, in sweep_bh_for_rgrps() argument
1496 struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); in sweep_bh_for_rgrps()
1509 rgd = gfs2_glock2rgrp(rd_gh->gh_gl); in sweep_bh_for_rgrps()
1511 gfs2_glock_is_locked_by_me(rd_gh->gh_gl)); in sweep_bh_for_rgrps()
1530 ret = -EIO; in sweep_bh_for_rgrps()
1533 ret = gfs2_glock_nq_init(rgd->rd_gl, LM_ST_EXCLUSIVE, in sweep_bh_for_rgrps()
1539 if (gfs2_rs_active(&ip->i_res) && in sweep_bh_for_rgrps()
1540 rgd == ip->i_res.rs_rbm.rgd) in sweep_bh_for_rgrps()
1541 gfs2_rs_deltree(&ip->i_res); in sweep_bh_for_rgrps()
1545 actually process all the metadata blocks that relate to in sweep_bh_for_rgrps()
1549 if (current->journal_info == NULL) { in sweep_bh_for_rgrps()
1552 jblocks_rqsted = rgd->rd_length + RES_DINODE + in sweep_bh_for_rgrps()
1554 isize_blks = gfs2_get_inode_blocks(&ip->i_inode); in sweep_bh_for_rgrps()
1555 if (isize_blks > atomic_read(&sdp->sd_log_thresh2)) in sweep_bh_for_rgrps()
1557 atomic_read(&sdp->sd_log_thresh2); in sweep_bh_for_rgrps()
1562 revokes += end - start; in sweep_bh_for_rgrps()
1563 else if (ip->i_depth) in sweep_bh_for_rgrps()
1564 revokes += sdp->sd_inptrs; in sweep_bh_for_rgrps()
1568 down_write(&ip->i_rw_mutex); in sweep_bh_for_rgrps()
1570 /* check if we will exceed the transaction blocks requested */ in sweep_bh_for_rgrps()
1571 tr = current->journal_info; in sweep_bh_for_rgrps()
1572 if (tr->tr_num_buf_new + RES_STATFS + in sweep_bh_for_rgrps()
1573 RES_QUOTA >= atomic_read(&sdp->sd_log_thresh2)) { in sweep_bh_for_rgrps()
1595 gfs2_trans_add_meta(ip->i_gl, bh); in sweep_bh_for_rgrps()
1603 __gfs2_free_blocks(ip, bstart, (u32)blen, meta); in sweep_bh_for_rgrps()
1605 gfs2_add_inode_blocks(&ip->i_inode, -blen); in sweep_bh_for_rgrps()
1611 __gfs2_free_blocks(ip, bstart, (u32)blen, meta); in sweep_bh_for_rgrps()
1613 gfs2_add_inode_blocks(&ip->i_inode, -blen); in sweep_bh_for_rgrps()
1616 if (!ret && blks_outside_rgrp) { /* If buffer still has non-zero blocks in sweep_bh_for_rgrps()
1619 if (current->journal_info) { in sweep_bh_for_rgrps()
1622 ret = gfs2_meta_inode_buffer(ip, &dibh); in sweep_bh_for_rgrps()
1628 ip->i_inode.i_mtime = ip->i_inode.i_ctime = in sweep_bh_for_rgrps()
1629 current_time(&ip->i_inode); in sweep_bh_for_rgrps()
1630 gfs2_trans_add_meta(ip->i_gl, dibh); in sweep_bh_for_rgrps()
1631 gfs2_dinode_out(ip, dibh->b_data); in sweep_bh_for_rgrps()
1633 up_write(&ip->i_rw_mutex); in sweep_bh_for_rgrps()
1647 if (memcmp(mp->mp_list, list, h * sizeof(mp->mp_list[0]))) in mp_eq_to_hgt()
1653 * find_nonnull_ptr - find a non-null pointer given a metapath and height
1658 * Returns: true if a non-null pointer was found in the metapath buffer
1665 struct buffer_head *bh = mp->mp_bh[h]; in find_nonnull_ptr()
1669 ptr = first + mp->mp_list[h]; in find_nonnull_ptr()
1670 end = (__be64 *)(bh->b_data + bh->b_size); in find_nonnull_ptr()
1677 if (*ptr) { /* if we have a non-null pointer */ in find_nonnull_ptr()
1678 mp->mp_list[h] = ptr - first; in find_nonnull_ptr()
1681 mp->mp_list[h] = 0; in find_nonnull_ptr()
1702 struct buffer_head *bh = mp->mp_bh[height]; in metapointer_range()
1711 *end = (__be64 *)(bh->b_data + bh->b_size); in metapointer_range()
1730 end = (height > 0) ? sdp->sd_inptrs : sdp->sd_diptrs; in walk_done()
1731 return mp->mp_list[height] >= end; in walk_done()
1735 * punch_hole - deallocate blocks in a file
1736 * @ip: inode to truncate
1741 * function operates in whole blocks (@offset and @length are rounded
1742 * accordingly); partially filled blocks must be cleared otherwise.
1750 static int punch_hole(struct gfs2_inode *ip, u64 offset, u64 length) in punch_hole() argument
1752 struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); in punch_hole()
1753 u64 maxsize = sdp->sd_heightsize[ip->i_height]; in punch_hole()
1757 unsigned int bsize_shift = sdp->sd_sb.sb_bsize_shift; in punch_hole()
1758 u64 lblock = (offset + (1 << bsize_shift) - 1) >> bsize_shift; in punch_hole()
1762 unsigned int strip_h = ip->i_height - 1; in punch_hole()
1771 * The starting point lies beyond the allocated meta-data; in punch_hole()
1772 * there are no blocks do deallocate. in punch_hole()
1805 find_metapath(sdp, lend, &mp, ip->i_height); in punch_hole()
1809 for (mp_h = ip->i_height - 1; mp_h > 0; mp_h--) { in punch_hole()
1816 find_metapath(sdp, lblock, &mp, ip->i_height); in punch_hole()
1819 for (mp_h = ip->i_height - 1; mp_h > 0; mp_h--) { in punch_hole()
1825 ret = gfs2_meta_inode_buffer(ip, &dibh); in punch_hole()
1830 ret = lookup_metapath(ip, &mp); in punch_hole()
1834 /* issue read-ahead on metadata */ in punch_hole()
1835 for (mp_h = 0; mp_h < mp.mp_aheight - 1; mp_h++) { in punch_hole()
1838 gfs2_metapath_ra(ip->i_gl, start, end); in punch_hole()
1841 if (mp.mp_aheight == ip->i_height) in punch_hole()
1850 ret = gfs2_quota_hold(ip, NO_UID_QUOTA_CHANGE, NO_GID_QUOTA_CHANGE); in punch_hole()
1865 prev_bnr != bh->b_blocknr)) { in punch_hole()
1868 sdp->sd_fsname, in punch_hole()
1869 (unsigned long long)ip->i_no_addr, in punch_hole()
1870 prev_bnr, ip->i_height, strip_h, mp_h); in punch_hole()
1872 prev_bnr = bh->b_blocknr; in punch_hole()
1877 ret = -EIO; in punch_hole()
1890 ret = sweep_bh_for_rgrps(ip, &rd_gh, mp.mp_bh[mp_h], in punch_hole()
1892 mp_h != ip->i_height - 1, in punch_hole()
1917 strip_h--; in punch_hole()
1924 mp_h--; /* search one metadata height down */ in punch_hole()
1930 * next non-null pointer. */ in punch_hole()
1935 /* No more non-null pointers at this height. Back up in punch_hole()
1942 ret = fillup_metapath(ip, &mp, mp_h); in punch_hole()
1946 /* On the first pass, issue read-ahead on metadata. */ in punch_hole()
1947 if (mp.mp_aheight > 1 && strip_h == ip->i_height - 1) { in punch_hole()
1948 unsigned int height = mp.mp_aheight - 1; in punch_hole()
1950 /* No read-ahead for data blocks. */ in punch_hole()
1951 if (mp.mp_aheight - 1 == strip_h) in punch_hole()
1952 height--; in punch_hole()
1954 for (; height >= mp.mp_aheight - ret; height--) { in punch_hole()
1959 gfs2_metapath_ra(ip->i_gl, start, end); in punch_hole()
1964 if (mp.mp_aheight - 1 == strip_h) { in punch_hole()
1968 if (mp.mp_aheight < ip->i_height) /* We have a partial height */ in punch_hole()
1969 mp_h = mp.mp_aheight - 1; in punch_hole()
1971 /* If we find a non-null block pointer, crawl a bit in punch_hole()
1983 if (current->journal_info == NULL) { in punch_hole()
1988 down_write(&ip->i_rw_mutex); in punch_hole()
1991 gfs2_quota_change(ip, -(s64)btotal, ip->i_inode.i_uid, in punch_hole()
1992 ip->i_inode.i_gid); in punch_hole()
1993 ip->i_inode.i_mtime = ip->i_inode.i_ctime = current_time(&ip->i_inode); in punch_hole()
1994 gfs2_trans_add_meta(ip->i_gl, dibh); in punch_hole()
1995 gfs2_dinode_out(ip, dibh->b_data); in punch_hole()
1996 up_write(&ip->i_rw_mutex); in punch_hole()
2003 if (current->journal_info) { in punch_hole()
2004 up_write(&ip->i_rw_mutex); in punch_hole()
2008 gfs2_quota_unhold(ip); in punch_hole()
2014 static int trunc_end(struct gfs2_inode *ip) in trunc_end() argument
2016 struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); in trunc_end()
2024 down_write(&ip->i_rw_mutex); in trunc_end()
2026 error = gfs2_meta_inode_buffer(ip, &dibh); in trunc_end()
2030 if (!i_size_read(&ip->i_inode)) { in trunc_end()
2031 ip->i_height = 0; in trunc_end()
2032 ip->i_goal = ip->i_no_addr; in trunc_end()
2034 gfs2_ordered_del_inode(ip); in trunc_end()
2036 ip->i_inode.i_mtime = ip->i_inode.i_ctime = current_time(&ip->i_inode); in trunc_end()
2037 ip->i_diskflags &= ~GFS2_DIF_TRUNC_IN_PROG; in trunc_end()
2039 gfs2_trans_add_meta(ip->i_gl, dibh); in trunc_end()
2040 gfs2_dinode_out(ip, dibh->b_data); in trunc_end()
2044 up_write(&ip->i_rw_mutex); in trunc_end()
2050 * do_shrink - make a file smaller
2062 struct gfs2_inode *ip = GFS2_I(inode); in do_shrink() local
2068 if (gfs2_is_stuffed(ip)) in do_shrink()
2071 error = punch_hole(ip, newsize, 0); in do_shrink()
2073 error = trunc_end(ip); in do_shrink()
2082 ret = do_shrink(inode, inode->i_size); in gfs2_trim_blocks()
2087 * do_grow - Touch and update inode size
2103 * Returns: 0 on success, or -ve on error
2108 struct gfs2_inode *ip = GFS2_I(inode); in do_grow() local
2115 if (gfs2_is_stuffed(ip) && size > gfs2_max_stuffed_size(ip)) { in do_grow()
2116 error = gfs2_quota_lock_check(ip, &ap); in do_grow()
2120 error = gfs2_inplace_reserve(ip, &ap); in do_grow()
2128 gfs2_is_jdata(ip) ? RES_JDATA : 0) + in do_grow()
2129 (sdp->sd_args.ar_quota == GFS2_QUOTA_OFF ? in do_grow()
2135 error = gfs2_unstuff_dinode(ip, NULL); in do_grow()
2140 error = gfs2_meta_inode_buffer(ip, &dibh); in do_grow()
2145 ip->i_inode.i_mtime = ip->i_inode.i_ctime = current_time(&ip->i_inode); in do_grow()
2146 gfs2_trans_add_meta(ip->i_gl, dibh); in do_grow()
2147 gfs2_dinode_out(ip, dibh->b_data); in do_grow()
2154 gfs2_inplace_release(ip); in do_grow()
2156 gfs2_quota_unlock(ip); in do_grow()
2162 * gfs2_setattr_size - make a file a given size
2175 struct gfs2_inode *ip = GFS2_I(inode); in gfs2_setattr_size() local
2178 BUG_ON(!S_ISREG(inode->i_mode)); in gfs2_setattr_size()
2186 ret = gfs2_rsqa_alloc(ip); in gfs2_setattr_size()
2190 if (newsize >= inode->i_size) { in gfs2_setattr_size()
2197 gfs2_rsqa_delete(ip, NULL); in gfs2_setattr_size()
2201 int gfs2_truncatei_resume(struct gfs2_inode *ip) in gfs2_truncatei_resume() argument
2204 error = punch_hole(ip, i_size_read(&ip->i_inode), 0); in gfs2_truncatei_resume()
2206 error = trunc_end(ip); in gfs2_truncatei_resume()
2210 int gfs2_file_dealloc(struct gfs2_inode *ip) in gfs2_file_dealloc() argument
2212 return punch_hole(ip, 0, 0); in gfs2_file_dealloc()
2216 * gfs2_free_journal_extents - Free cached journal bmap info
2225 while(!list_empty(&jd->extent_list)) { in gfs2_free_journal_extents()
2226 jext = list_entry(jd->extent_list.next, struct gfs2_journal_extent, list); in gfs2_free_journal_extents()
2227 list_del(&jext->list); in gfs2_free_journal_extents()
2233 * gfs2_add_jextent - Add or merge a new extent to extent cache
2237 * @blocks: Size of extent in fs blocks
2239 * Returns: 0 on success or -ENOMEM
2242 static int gfs2_add_jextent(struct gfs2_jdesc *jd, u64 lblock, u64 dblock, u64 blocks) in gfs2_add_jextent() argument
2246 if (!list_empty(&jd->extent_list)) { in gfs2_add_jextent()
2247 jext = list_entry(jd->extent_list.prev, struct gfs2_journal_extent, list); in gfs2_add_jextent()
2248 if ((jext->dblock + jext->blocks) == dblock) { in gfs2_add_jextent()
2249 jext->blocks += blocks; in gfs2_add_jextent()
2256 return -ENOMEM; in gfs2_add_jextent()
2257 jext->dblock = dblock; in gfs2_add_jextent()
2258 jext->lblock = lblock; in gfs2_add_jextent()
2259 jext->blocks = blocks; in gfs2_add_jextent()
2260 list_add_tail(&jext->list, &jd->extent_list); in gfs2_add_jextent()
2261 jd->nr_extents++; in gfs2_add_jextent()
2266 * gfs2_map_journal_extents - Cache journal bmap info
2271 * blocks to all physical blocks for the given journal. This will save
2272 * us time when writing journal blocks. Most journals will have only one
2273 * extent that maps all their logical blocks. That's because gfs2.mkfs
2274 * arranges the journal blocks sequentially to maximize performance.
2289 struct gfs2_inode *ip = GFS2_I(jd->jd_inode); in gfs2_map_journal_extents() local
2291 unsigned int shift = sdp->sd_sb.sb_bsize_shift; in gfs2_map_journal_extents()
2295 lblock_stop = i_size_read(jd->jd_inode) >> shift; in gfs2_map_journal_extents()
2296 size = (lblock_stop - lblock) << shift; in gfs2_map_journal_extents()
2297 jd->nr_extents = 0; in gfs2_map_journal_extents()
2298 WARN_ON(!list_empty(&jd->extent_list)); in gfs2_map_journal_extents()
2304 rc = gfs2_block_map(jd->jd_inode, lblock, &bh, 0); in gfs2_map_journal_extents()
2310 size -= bh.b_size; in gfs2_map_journal_extents()
2311 lblock += (bh.b_size >> ip->i_inode.i_blkbits); in gfs2_map_journal_extents()
2314 fs_info(sdp, "journal %d mapped with %u extents\n", jd->jd_jid, in gfs2_map_journal_extents()
2315 jd->nr_extents); in gfs2_map_journal_extents()
2320 rc, jd->jd_jid, in gfs2_map_journal_extents()
2321 (unsigned long long)(i_size_read(jd->jd_inode) - size), in gfs2_map_journal_extents()
2322 jd->nr_extents); in gfs2_map_journal_extents()
2331 * gfs2_write_alloc_required - figure out if a write will require an allocation
2332 * @ip: the file being written to
2339 int gfs2_write_alloc_required(struct gfs2_inode *ip, u64 offset, in gfs2_write_alloc_required() argument
2342 struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); in gfs2_write_alloc_required()
2351 if (gfs2_is_stuffed(ip)) { in gfs2_write_alloc_required()
2352 if (offset + len > gfs2_max_stuffed_size(ip)) in gfs2_write_alloc_required()
2357 shift = sdp->sd_sb.sb_bsize_shift; in gfs2_write_alloc_required()
2358 BUG_ON(gfs2_is_dir(ip)); in gfs2_write_alloc_required()
2359 end_of_file = (i_size_read(&ip->i_inode) + sdp->sd_sb.sb_bsize - 1) >> shift; in gfs2_write_alloc_required()
2361 lblock_stop = (offset + len + sdp->sd_sb.sb_bsize - 1) >> shift; in gfs2_write_alloc_required()
2362 if (lblock_stop > end_of_file && ip != GFS2_I(sdp->sd_rindex)) in gfs2_write_alloc_required()
2365 size = (lblock_stop - lblock) << shift; in gfs2_write_alloc_required()
2369 gfs2_block_map(&ip->i_inode, lblock, &bh, 0); in gfs2_write_alloc_required()
2372 size -= bh.b_size; in gfs2_write_alloc_required()
2373 lblock += (bh.b_size >> ip->i_inode.i_blkbits); in gfs2_write_alloc_required()
2381 struct gfs2_inode *ip = GFS2_I(inode); in stuffed_zero_range() local
2385 if (offset >= inode->i_size) in stuffed_zero_range()
2387 if (offset + length > inode->i_size) in stuffed_zero_range()
2388 length = inode->i_size - offset; in stuffed_zero_range()
2390 error = gfs2_meta_inode_buffer(ip, &dibh); in stuffed_zero_range()
2393 gfs2_trans_add_meta(ip->i_gl, dibh); in stuffed_zero_range()
2394 memset(dibh->b_data + sizeof(struct gfs2_dinode) + offset, 0, in stuffed_zero_range()
2404 loff_t max_chunk = GFS2_JTRUNC_REVOKES * sdp->sd_vfs->s_blocksize; in gfs2_journaled_truncate_range()
2418 chunk = offs + ((chunk - offs) & PAGE_MASK); in gfs2_journaled_truncate_range()
2422 length -= chunk; in gfs2_journaled_truncate_range()
2424 tr = current->journal_info; in gfs2_journaled_truncate_range()
2425 if (!test_bit(TR_TOUCHED, &tr->tr_flags)) in gfs2_journaled_truncate_range()
2439 struct gfs2_inode *ip = GFS2_I(inode); in __gfs2_punch_hole() local
2443 if (gfs2_is_jdata(ip)) in __gfs2_punch_hole()
2451 if (gfs2_is_stuffed(ip)) { in __gfs2_punch_hole()
2459 start_off = offset & (blocksize - 1); in __gfs2_punch_hole()
2460 end_len = (offset + length) & (blocksize - 1); in __gfs2_punch_hole()
2463 if (length > blocksize - start_off) in __gfs2_punch_hole()
2464 len = blocksize - start_off; in __gfs2_punch_hole()
2473 offset + length - end_len, end_len); in __gfs2_punch_hole()
2479 if (gfs2_is_jdata(ip)) { in __gfs2_punch_hole()
2480 BUG_ON(!current->journal_info); in __gfs2_punch_hole()
2483 truncate_pagecache_range(inode, offset, offset + length - 1); in __gfs2_punch_hole()
2488 if (current->journal_info) in __gfs2_punch_hole()
2491 if (!gfs2_is_stuffed(ip)) in __gfs2_punch_hole()
2492 error = punch_hole(ip, offset, length); in __gfs2_punch_hole()
2495 if (current->journal_info) in __gfs2_punch_hole()