Whamcloud - gitweb
file llobdstat.pl was initially added on branch b_devel.
[fs/lustre-release.git] / lustre / extN / extN-san.diff
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
3 @@ -2728,3 +2728,85 @@
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.  
6   */
7 +
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
11 + * i inode block
12 + * 1 superblock
13 + * 2 * EXTN_SINGLEDATA_TRANS_BLOCKS for the quote files
14 + * ((1+1+1) * 3 * nblocks) + 1 + 1 + 2 * EXTN_SINGLEDATA_TRANS_BLOCKS
15 + *
16 + * XXX assuming:
17 + * (1) fs logic block size == page size
18 + * (2) extN in writeback mode
19 + */
20 +static inline int extN_san_write_trans_blocks(int nblocks)
21 +{
22 +       int ret;
23 +       
24 +       ret = (1 + 1 + 1) * 3 * nblocks + 1 + 1;
25 +
26 +#ifdef CONFIG_QUOTA
27 +       ret += 2 * EXTN_SINGLEDATA_TRANS_BLOCKS;
28 +#endif
29 +
30 +       return ret;
31 +}
32 +
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.
35 + *
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
40 + *
41 + * return:    0 success, otherwise failed
42 + *            (*blocks) contains physical block number alloced
43 + *
44 + * XXX this assume the fs block size == page size
45 + */
46 +int extN_prep_san_write(struct inode *inode, long *blocks,
47 +                       int nblocks, loff_t newsize)
48 +{
49 +       handle_t *handle;
50 +       struct buffer_head bh_tmp;
51 +       int needed_blocks;
52 +       int i, ret = 0, ret2;
53 +
54 +       needed_blocks = extN_san_write_trans_blocks(nblocks);
55 +
56 +       lock_kernel();
57 +       handle = extN_journal_start(inode, needed_blocks);
58 +       if (IS_ERR(handle)) {
59 +               unlock_kernel();
60 +               return PTR_ERR(handle);
61 +       }
62 +       unlock_kernel();
63 +
64 +       /* alloc blocks one by one */
65 +       for (i = 0; i < nblocks; i++) {
66 +               ret = extN_get_block_handle(handle, inode, blocks[i],
67 +                                               &bh_tmp, 1);
68 +               if (ret)
69 +                       break;
70 +
71 +               blocks[i] = bh_tmp.b_blocknr;
72 +       }
73 +
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);
78 +       }
79 +
80 +       lock_kernel();
81 +       ret2 = extN_journal_stop(handle, inode);
82 +       unlock_kernel();
83 +
84 +       if (!ret)
85 +               ret = ret2;
86 +       return ret;
87 +}
88 +EXPORT_SYMBOL(extN_prep_san_write);