Lines Matching refs:inode

17 static inline void dirty_indirect(struct buffer_head *bh, struct inode *inode)
19 mark_buffer_dirty_inode(bh, inode);
20 if (IS_SYNC(inode))
24 static int block_to_path(struct inode *inode, long block, int offsets[DEPTH])
26 struct super_block *sb = inode->i_sb;
86 static Indirect *get_branch(struct inode *inode,
92 struct super_block *sb = inode->i_sb;
97 add_chain(chain, NULL, SYSV_I(inode)->i_data + *offsets);
126 static int alloc_branch(struct inode *inode,
131 int blocksize = inode->i_sb->s_blocksize;
135 branch[0].key = sysv_new_block(inode->i_sb);
140 branch[n].key = sysv_new_block(inode->i_sb);
147 parent = block_to_cpu(SYSV_SB(inode->i_sb), branch[n-1].key);
148 bh = sb_getblk(inode->i_sb, parent);
150 sysv_free_block(inode->i_sb, branch[n].key);
160 dirty_indirect(bh, inode);
169 sysv_free_block(inode->i_sb, branch[i].key);
173 static inline int splice_branch(struct inode *inode,
187 inode_set_ctime_current(inode);
191 dirty_indirect(where->bh, inode);
193 if (IS_SYNC(inode))
194 sysv_sync_inode(inode);
196 mark_inode_dirty(inode);
204 sysv_free_block(inode->i_sb, where[i].key);
208 static int get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create)
213 struct super_block *sb = inode->i_sb;
216 int depth = block_to_path(inode, iblock, offsets);
222 partial = get_branch(inode, depth, offsets, chain, &err);
254 err = alloc_branch(inode, left, offsets+(partial-chain), partial);
258 if (splice_branch(inode, chain, partial, left) < 0)
280 static Indirect *find_shared(struct inode *inode,
292 partial = get_branch(inode, k, offsets, chain, &err);
310 * of branch is all ours and does not grow immediately from the inode
329 static inline void free_data(struct inode *inode, sysv_zone_t *p, sysv_zone_t *q)
335 sysv_free_block(inode->i_sb, nr);
336 mark_inode_dirty(inode);
341 static void free_branches(struct inode *inode, sysv_zone_t *p, sysv_zone_t *q, int depth)
344 struct super_block *sb = inode->i_sb;
357 free_branches(inode, (sysv_zone_t*)bh->b_data,
361 mark_inode_dirty(inode);
364 free_data(inode, p, q);
367 void sysv_truncate (struct inode * inode)
369 sysv_zone_t *i_data = SYSV_I(inode)->i_data;
378 if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
379 S_ISLNK(inode->i_mode)))
382 blocksize = inode->i_sb->s_blocksize;
383 iblock = (inode->i_size + blocksize-1)
384 >> inode->i_sb->s_blocksize_bits;
386 block_truncate_page(inode->i_mapping, inode->i_size, get_block);
388 n = block_to_path(inode, iblock, offsets);
393 free_data(inode, i_data+offsets[0], i_data + DIRECT);
397 partial = find_shared(inode, n, offsets, chain, &nr);
401 mark_inode_dirty(inode);
403 dirty_indirect(partial->bh, inode);
404 free_branches(inode, &nr, &nr+1, (chain+n-1) - partial);
408 free_branches(inode, partial->p + 1, block_end(partial->bh),
410 dirty_indirect(partial->bh, inode);
420 mark_inode_dirty(inode);
421 free_branches(inode, &nr, &nr+1, n);
425 inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode));
426 if (IS_SYNC(inode))
427 sysv_sync_inode (inode);
429 mark_inode_dirty(inode);
476 struct inode *inode = mapping->host;
478 if (to > inode->i_size) {
479 truncate_pagecache(inode, inode->i_size);
480 sysv_truncate(inode);