1 --- lustre/extN/inode.orig.c 2002-12-29 18:48:56.000000000 +0800
2 +++ lustre/extN/inode.c 2002-12-29 19:17:24.000000000 +0800
4 * here, in extN_aops_journal_start() to ensure that the forthcoming "see if we
5 * need to extend" test in extN_prepare_write() succeeds.
8 +/* for each block: 1 ind + 1 dind + 1 tind
9 + * for each block: 3 bitmap blocks
10 + * for each block: 3 group descriptor blocks
13 + * 2 * EXTN_SINGLEDATA_TRANS_BLOCKS for the quote files
14 + * ((1+1+1) * 3 * nblocks) + 1 + 1 + 2 * EXTN_SINGLEDATA_TRANS_BLOCKS
17 + * (1) fs logic block size == page size
18 + * (2) extN in writeback mode
20 +static inline int extN_san_write_trans_blocks(int nblocks)
24 + ret = (1 + 1 + 1) * 3 * nblocks + 1 + 1;
27 + ret += 2 * EXTN_SINGLEDATA_TRANS_BLOCKS;
33 +/* Alloc blocks for an inode, while don't create any buffer/page
34 + * for data I/O; set the inode size if file is extended.
36 + * @inode: target inode
37 + * @blocks: array of logic block number
38 + * @nblocks: how many blocks need be alloced
39 + * @newsize: new filesize we should set
41 + * return: 0 success, otherwise failed
42 + * (*blocks) contains physical block number alloced
44 + * XXX this assume the fs block size == page size
46 +int extN_prep_san_write(struct inode *inode, long *blocks,
47 + int nblocks, loff_t newsize)
50 + struct buffer_head bh_tmp;
52 + int i, ret = 0, ret2;
54 + needed_blocks = extN_san_write_trans_blocks(nblocks);
57 + handle = extN_journal_start(inode, needed_blocks);
58 + if (IS_ERR(handle)) {
60 + return PTR_ERR(handle);
64 + /* alloc blocks one by one */
65 + for (i = 0; i < nblocks; i++) {
66 + ret = extN_get_block_handle(handle, inode, blocks[i],
71 + blocks[i] = bh_tmp.b_blocknr;
74 + /* set inode size if needed */
75 + if (!ret && (newsize > inode->i_size)) {
76 + inode->i_size = newsize;
77 + extN_mark_inode_dirty(handle, inode);
81 + ret2 = extN_journal_stop(handle, inode);
88 +EXPORT_SYMBOL(extN_prep_san_write);