Whamcloud - gitweb
current branches now use lnet from HEAD
[fs/lustre-release.git] / lustre / snapfs / journal_ext3.c
1
2 /*
3  * Snapfs. (C) 2000 Peter J. Braam
4  */
5
6 #define DEBUG_SUBSYSTEM S_SNAP
7
8 #include <linux/module.h>
9 #include <linux/kernel.h>
10 #include <linux/string.h>
11 #include <linux/slab.h>
12 #include <linux/stat.h>
13 #include <linux/unistd.h>
14 #include <linux/jbd.h>
15 #include <linux/ext3_jbd.h>
16 #include <linux/ext3_fs.h>
17 #include <linux/snap.h>
18
19 #include "snapfs_internal.h" 
20
21
22 #define EXT3_EA_TRANS_BLOCKS EXT3_DATA_TRANS_BLOCKS
23
24 /*
25  * must follow the changes of ext3_create_indirect() in fs/ext3/snap.c
26  */
27 #define COW_CREDITS (2 * EXT3_EA_TRANS_BLOCKS + 17 + 2 * EXT3_DATA_TRANS_BLOCKS )
28
29 /* start the filesystem journal operations */
30 static void *snap_e3_trans_start(struct inode *inode, int op)
31 {
32         int jblocks;
33
34         /* XXX needs to be fixed up when we get reiserfs support */
35         switch (op) {
36         case SNAP_OP_CREATE:
37                 jblocks = COW_CREDITS + EXT3_DATA_TRANS_BLOCKS + 3;
38                 break;
39         case SNAP_OP_LINK:
40                 jblocks = COW_CREDITS + EXT3_DATA_TRANS_BLOCKS;
41                 break;
42         case SNAP_OP_UNLINK:
43                 jblocks = COW_CREDITS + EXT3_DELETE_TRANS_BLOCKS;
44                 break;
45         case SNAP_OP_SYMLINK:
46                 jblocks = COW_CREDITS + EXT3_DATA_TRANS_BLOCKS + 5;
47                 break;
48         case SNAP_OP_MKDIR:
49                 jblocks = COW_CREDITS + EXT3_DATA_TRANS_BLOCKS + 4;
50                 break;
51         case SNAP_OP_RMDIR:
52                 jblocks = 2 * COW_CREDITS + EXT3_DELETE_TRANS_BLOCKS;
53                 break;
54         case SNAP_OP_MKNOD:
55                 jblocks = COW_CREDITS + EXT3_DATA_TRANS_BLOCKS + 3;
56                 break;
57         case SNAP_OP_RENAME:
58                 jblocks = 4 * COW_CREDITS + 2 * EXT3_DATA_TRANS_BLOCKS + 2;
59                 break;
60         default:
61                 CDEBUG(D_INODE, "invalid operation %d for journal\n", op);
62                 return NULL;
63         }
64
65         CDEBUG(D_INODE, "creating journal handle (%d blocks)\n", jblocks);
66         return ext3_journal_start(inode, jblocks);
67 }
68
69 static void snap_e3_trans_commit(void *handle)
70 {
71         journal_stop(handle);
72 }
73
74 struct journal_ops snap_ext3_journal_ops = {
75         snap_e3_trans_start,
76         snap_e3_trans_commit
77 };
78