Lines Matching refs:ip
56 static int gfs2_unstuffer_page(struct gfs2_inode *ip, struct buffer_head *dibh, in gfs2_unstuffer_page() argument
59 struct inode *inode = &ip->i_inode; in gfs2_unstuffer_page()
94 if (!gfs2_is_jdata(ip)) in gfs2_unstuffer_page()
96 if (!gfs2_is_writeback(ip)) in gfs2_unstuffer_page()
97 gfs2_trans_add_data(ip->i_gl, bh); in gfs2_unstuffer_page()
118 int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page) in gfs2_unstuff_dinode() argument
123 int isdir = gfs2_is_dir(ip); in gfs2_unstuff_dinode()
126 down_write(&ip->i_rw_mutex); in gfs2_unstuff_dinode()
128 error = gfs2_meta_inode_buffer(ip, &dibh); in gfs2_unstuff_dinode()
132 if (i_size_read(&ip->i_inode)) { in gfs2_unstuff_dinode()
137 error = gfs2_alloc_blocks(ip, &block, &n, 0, NULL); in gfs2_unstuff_dinode()
141 gfs2_trans_add_unrevoke(GFS2_SB(&ip->i_inode), block, 1); in gfs2_unstuff_dinode()
142 error = gfs2_dir_get_new_buffer(ip, block, &bh); in gfs2_unstuff_dinode()
149 error = gfs2_unstuffer_page(ip, dibh, block, page); in gfs2_unstuff_dinode()
157 gfs2_trans_add_meta(ip->i_gl, dibh); in gfs2_unstuff_dinode()
161 if (i_size_read(&ip->i_inode)) { in gfs2_unstuff_dinode()
163 gfs2_add_inode_blocks(&ip->i_inode, 1); in gfs2_unstuff_dinode()
164 di->di_blocks = cpu_to_be64(gfs2_get_inode_blocks(&ip->i_inode)); in gfs2_unstuff_dinode()
167 ip->i_height = 1; in gfs2_unstuff_dinode()
173 up_write(&ip->i_rw_mutex); in gfs2_unstuff_dinode()
314 static int lookup_metapath(struct gfs2_inode *ip, struct metapath *mp) in lookup_metapath() argument
316 unsigned int end_of_metadata = ip->i_height - 1; in lookup_metapath()
328 ret = gfs2_meta_indirect_buffer(ip, x+1, dblock, &mp->mp_bh[x+1]); in lookup_metapath()
333 return ip->i_height; in lookup_metapath()
383 static inline void bmap_lock(struct gfs2_inode *ip, int create) in bmap_lock() argument
386 down_write(&ip->i_rw_mutex); in bmap_lock()
388 down_read(&ip->i_rw_mutex); in bmap_lock()
391 static inline void bmap_unlock(struct gfs2_inode *ip, int create) in bmap_unlock() argument
394 up_write(&ip->i_rw_mutex); in bmap_unlock()
396 up_read(&ip->i_rw_mutex); in bmap_unlock()
454 struct gfs2_inode *ip = GFS2_I(inode); in gfs2_bmap_alloc() local
472 gfs2_trans_add_meta(ip->i_gl, dibh); in gfs2_bmap_alloc()
488 if (height == ip->i_height) { in gfs2_bmap_alloc()
495 iblks = height - ip->i_height; in gfs2_bmap_alloc()
508 error = gfs2_alloc_blocks(ip, &bn, &n, 0, NULL); in gfs2_bmap_alloc()
512 if (state != ALLOC_DATA || gfs2_is_jdata(ip)) in gfs2_bmap_alloc()
522 for (; i - 1 < height - ip->i_height && n > 0; i++, n--) in gfs2_bmap_alloc()
523 gfs2_indirect_init(mp, ip->i_gl, i, 0, bn++); in gfs2_bmap_alloc()
524 if (i - 1 == height - ip->i_height) { in gfs2_bmap_alloc()
549 gfs2_trans_add_meta(ip->i_gl, mp->mp_bh[i-1]); in gfs2_bmap_alloc()
551 gfs2_indirect_init(mp, ip->i_gl, i, in gfs2_bmap_alloc()
561 gfs2_trans_add_meta(ip->i_gl, mp->mp_bh[end_of_metadata]); in gfs2_bmap_alloc()
580 ip->i_height = height; in gfs2_bmap_alloc()
581 gfs2_add_inode_blocks(&ip->i_inode, alloced); in gfs2_bmap_alloc()
582 gfs2_dinode_out(ip, mp->mp_bh[0]->b_data); in gfs2_bmap_alloc()
606 struct gfs2_inode *ip = GFS2_I(inode); in gfs2_block_map() local
623 bmap_lock(ip, create); in gfs2_block_map()
627 trace_gfs2_bmap(ip, bh_map, lblock, create, 1); in gfs2_block_map()
628 if (gfs2_is_dir(ip)) { in gfs2_block_map()
633 ret = gfs2_meta_inode_buffer(ip, &mp.mp_bh[0]); in gfs2_block_map()
637 height = ip->i_height; in gfs2_block_map()
643 if (height > ip->i_height || gfs2_is_stuffed(ip)) in gfs2_block_map()
645 ret = lookup_metapath(ip, &mp); in gfs2_block_map()
648 if (ret != ip->i_height) in gfs2_block_map()
650 ptr = metapointer(ip->i_height - 1, &mp); in gfs2_block_map()
654 bh = mp.mp_bh[ip->i_height - 1]; in gfs2_block_map()
662 trace_gfs2_bmap(ip, bh_map, lblock, create, ret); in gfs2_block_map()
663 bmap_unlock(ip, create); in gfs2_block_map()
669 BUG_ON(gfs2_is_stuffed(ip)); in gfs2_block_map()
716 static int do_strip(struct gfs2_inode *ip, struct buffer_head *dibh, in do_strip() argument
720 struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); in do_strip()
746 metadata = (height != ip->i_height - 1); in do_strip()
749 else if (ip->i_depth) in do_strip()
766 gfs2_rlist_add(ip, &rlist, bstart); in do_strip()
774 gfs2_rlist_add(ip, &rlist, bstart); in do_strip()
790 if (gfs2_rs_active(ip->i_res)) /* needs to be done with the rgrp glock held */ in do_strip()
791 gfs2_rs_deltree(ip->i_res); in do_strip()
799 down_write(&ip->i_rw_mutex); in do_strip()
801 gfs2_trans_add_meta(ip->i_gl, dibh); in do_strip()
802 gfs2_trans_add_meta(ip->i_gl, bh); in do_strip()
818 __gfs2_free_blocks(ip, bstart, blen, metadata); in do_strip()
827 gfs2_add_inode_blocks(&ip->i_inode, -1); in do_strip()
830 __gfs2_free_blocks(ip, bstart, blen, metadata); in do_strip()
835 gfs2_quota_change(ip, -(s64)btotal, ip->i_inode.i_uid, in do_strip()
836 ip->i_inode.i_gid); in do_strip()
838 ip->i_inode.i_mtime = ip->i_inode.i_ctime = CURRENT_TIME; in do_strip()
840 gfs2_dinode_out(ip, dibh->b_data); in do_strip()
842 up_write(&ip->i_rw_mutex); in do_strip()
870 static int recursive_scan(struct gfs2_inode *ip, struct buffer_head *dibh, in recursive_scan() argument
874 struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); in recursive_scan()
882 error = gfs2_meta_inode_buffer(ip, &bh); in recursive_scan()
890 error = gfs2_meta_indirect_buffer(ip, height, block, &bh); in recursive_scan()
900 error = do_strip(ip, dibh, bh, top, bottom, height, sm); in recursive_scan()
904 if (height < ip->i_height - 1) { in recursive_scan()
906 gfs2_metapath_ra(ip->i_gl, bh, top); in recursive_scan()
914 error = recursive_scan(ip, dibh, mp, height + 1, bn, in recursive_scan()
934 struct gfs2_inode *ip = GFS2_I(inode); in gfs2_block_truncate_page() local
985 if (!gfs2_is_writeback(ip)) in gfs2_block_truncate_page()
986 gfs2_trans_add_data(ip->i_gl, bh); in gfs2_block_truncate_page()
1033 struct gfs2_inode *ip = GFS2_I(inode); in trunc_start() local
1037 int journaled = gfs2_is_jdata(ip); in trunc_start()
1047 error = gfs2_meta_inode_buffer(ip, &dibh); in trunc_start()
1051 gfs2_trans_add_meta(ip->i_gl, dibh); in trunc_start()
1053 if (gfs2_is_stuffed(ip)) { in trunc_start()
1061 ip->i_diskflags |= GFS2_DIF_TRUNC_IN_PROG; in trunc_start()
1065 ip->i_inode.i_mtime = ip->i_inode.i_ctime = CURRENT_TIME; in trunc_start()
1066 gfs2_dinode_out(ip, dibh->b_data); in trunc_start()
1085 static int trunc_dealloc(struct gfs2_inode *ip, u64 size) in trunc_dealloc() argument
1087 struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); in trunc_dealloc()
1088 unsigned int height = ip->i_height; in trunc_dealloc()
1098 find_metapath(sdp, lblock, &mp, ip->i_height); in trunc_dealloc()
1103 error = gfs2_quota_hold(ip, NO_UID_QUOTA_CHANGE, NO_GID_QUOTA_CHANGE); in trunc_dealloc()
1112 error = recursive_scan(ip, NULL, &mp, 0, 0, 1, &sm); in trunc_dealloc()
1117 gfs2_quota_unhold(ip); in trunc_dealloc()
1122 static int trunc_end(struct gfs2_inode *ip) in trunc_end() argument
1124 struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); in trunc_end()
1132 down_write(&ip->i_rw_mutex); in trunc_end()
1134 error = gfs2_meta_inode_buffer(ip, &dibh); in trunc_end()
1138 if (!i_size_read(&ip->i_inode)) { in trunc_end()
1139 ip->i_height = 0; in trunc_end()
1140 ip->i_goal = ip->i_no_addr; in trunc_end()
1142 gfs2_ordered_del_inode(ip); in trunc_end()
1144 ip->i_inode.i_mtime = ip->i_inode.i_ctime = CURRENT_TIME; in trunc_end()
1145 ip->i_diskflags &= ~GFS2_DIF_TRUNC_IN_PROG; in trunc_end()
1147 gfs2_trans_add_meta(ip->i_gl, dibh); in trunc_end()
1148 gfs2_dinode_out(ip, dibh->b_data); in trunc_end()
1152 up_write(&ip->i_rw_mutex); in trunc_end()
1171 struct gfs2_inode *ip = GFS2_I(inode); in do_shrink() local
1177 if (gfs2_is_stuffed(ip)) in do_shrink()
1180 error = trunc_dealloc(ip, newsize); in do_shrink()
1182 error = trunc_end(ip); in do_shrink()
1218 struct gfs2_inode *ip = GFS2_I(inode); in do_grow() local
1225 if (gfs2_is_stuffed(ip) && in do_grow()
1227 error = gfs2_quota_lock_check(ip, &ap); in do_grow()
1231 error = gfs2_inplace_reserve(ip, &ap); in do_grow()
1244 error = gfs2_unstuff_dinode(ip, NULL); in do_grow()
1249 error = gfs2_meta_inode_buffer(ip, &dibh); in do_grow()
1254 ip->i_inode.i_mtime = ip->i_inode.i_ctime = CURRENT_TIME; in do_grow()
1255 gfs2_trans_add_meta(ip->i_gl, dibh); in do_grow()
1256 gfs2_dinode_out(ip, dibh->b_data); in do_grow()
1263 gfs2_inplace_release(ip); in do_grow()
1265 gfs2_quota_unlock(ip); in do_grow()
1284 struct gfs2_inode *ip = GFS2_I(inode); in gfs2_setattr_size() local
1300 ret = gfs2_rs_alloc(ip); in gfs2_setattr_size()
1310 gfs2_rs_deltree(ip->i_res); in gfs2_setattr_size()
1317 int gfs2_truncatei_resume(struct gfs2_inode *ip) in gfs2_truncatei_resume() argument
1320 error = trunc_dealloc(ip, i_size_read(&ip->i_inode)); in gfs2_truncatei_resume()
1322 error = trunc_end(ip); in gfs2_truncatei_resume()
1326 int gfs2_file_dealloc(struct gfs2_inode *ip) in gfs2_file_dealloc() argument
1328 return trunc_dealloc(ip, 0); in gfs2_file_dealloc()
1405 struct gfs2_inode *ip = GFS2_I(jd->jd_inode); in gfs2_map_journal_extents() local
1427 lblock += (bh.b_size >> ip->i_inode.i_blkbits); in gfs2_map_journal_extents()
1455 int gfs2_write_alloc_required(struct gfs2_inode *ip, u64 offset, in gfs2_write_alloc_required() argument
1458 struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); in gfs2_write_alloc_required()
1467 if (gfs2_is_stuffed(ip)) { in gfs2_write_alloc_required()
1475 BUG_ON(gfs2_is_dir(ip)); in gfs2_write_alloc_required()
1476 end_of_file = (i_size_read(&ip->i_inode) + sdp->sd_sb.sb_bsize - 1) >> shift; in gfs2_write_alloc_required()
1486 gfs2_block_map(&ip->i_inode, lblock, &bh, 0); in gfs2_write_alloc_required()
1490 lblock += (bh.b_size >> ip->i_inode.i_blkbits); in gfs2_write_alloc_required()