6 #define DEBUG_SUBSYSTEM S_SM
8 #include <linux/kmod.h>
9 #include <linux/init.h>
11 #include <linux/slab.h>
12 #include <linux/string.h>
13 #include <linux/lustre_idl.h>
14 #include "smfs_internal.h"
16 static void duplicate_inode(struct inode *dst_inode,
17 struct inode *src_inode)
19 dst_inode->i_mode = src_inode->i_mode;
20 dst_inode->i_uid = src_inode->i_uid;
21 dst_inode->i_gid = src_inode->i_gid;
22 dst_inode->i_nlink = src_inode->i_nlink;
23 dst_inode->i_size = src_inode->i_size;
24 dst_inode->i_atime = src_inode->i_atime;
25 dst_inode->i_ctime = src_inode->i_ctime;
26 dst_inode->i_mtime = src_inode->i_mtime;
27 dst_inode->i_blksize = src_inode->i_blksize;
28 dst_inode->i_blocks = src_inode->i_blocks;
29 dst_inode->i_version = src_inode->i_version;
30 dst_inode->i_state = src_inode->i_state;
33 void post_smfs_inode(struct inode *inode,
34 struct inode *cache_inode)
36 if (inode && cache_inode) {
37 duplicate_inode(inode, cache_inode);
38 /*Here we must release the cache_inode,
39 *Otherwise we will have no chance to
42 cache_inode->i_state &=~I_LOCK;
45 void pre_smfs_inode(struct inode *inode,
46 struct inode *cache_inode)
48 if (inode && cache_inode) {
49 duplicate_inode(cache_inode, inode);
53 static void smfs_read_inode(struct inode *inode)
55 struct super_block *cache_sb;
56 struct inode *cache_inode;
62 CDEBUG(D_INODE, "read_inode ino %lu\n", inode->i_ino);
63 cache_sb = S2CSB(inode->i_sb);
65 cache_inode = iget(cache_sb, inode->i_ino);
66 I2CI(inode) = cache_inode;
68 if(cache_sb && cache_sb->s_op->read_inode)
69 cache_sb->s_op->read_inode(cache_inode);
71 post_smfs_inode(inode, cache_inode);
72 sm_set_inode_ops(cache_inode, inode);
74 CDEBUG(D_INODE, "read_inode ino %lu icount %d \n",
75 inode->i_ino, atomic_read(&inode->i_count));
81 /* Although some filesystem(such as ext3) do not have
82 * clear_inode method, but we need it to free the
85 static void smfs_clear_inode(struct inode *inode)
87 struct super_block *cache_sb;
88 struct inode *cache_inode;
94 cache_sb = S2CSB(inode->i_sb);
95 cache_inode = I2CI(inode);
97 /*FIXME: because i_count of cache_inode may not
98 * be 0 or 1 in before smfs_delete inode, So we
99 * need to dec it to 1 before we call delete_inode
100 * of the bellow cache filesystem Check again latter*/
102 if (atomic_read(&cache_inode->i_count) < 1)
105 while (atomic_read(&cache_inode->i_count) != 1) {
106 atomic_dec(&cache_inode->i_count);
113 static void smfs_delete_inode(struct inode *inode)
115 struct inode *cache_inode;
116 struct super_block *cache_sb;
119 cache_inode = I2CI(inode);
120 cache_sb = S2CSB(inode->i_sb);
122 if (!cache_inode || !cache_sb)
125 /*FIXME: because i_count of cache_inode may not
126 * be 0 or 1 in before smfs_delete inode, So we
127 * need to dec it to 1 before we call delete_inode
128 * of the bellow cache filesystem Check again latter*/
130 if (atomic_read(&cache_inode->i_count) < 1)
133 while (atomic_read(&cache_inode->i_count) != 1) {
134 atomic_dec(&cache_inode->i_count);
137 pre_smfs_inode(inode, cache_inode);
139 list_del(&cache_inode->i_hash);
140 INIT_LIST_HEAD(&cache_inode->i_hash);
141 list_del(&cache_inode->i_list);
142 INIT_LIST_HEAD(&cache_inode->i_list);
144 if (cache_inode->i_data.nrpages)
145 truncate_inode_pages(&cache_inode->i_data, 0);
147 if (cache_sb->s_op->delete_inode)
148 cache_sb->s_op->delete_inode(cache_inode);
150 post_smfs_inode(inode, cache_inode);
155 static void smfs_write_inode(struct inode *inode, int wait)
157 struct inode *cache_inode;
158 struct super_block *cache_sb;
161 cache_inode = I2CI(inode);
162 cache_sb = S2CSB(inode->i_sb);
164 if (!cache_inode || !cache_sb)
167 pre_smfs_inode(inode, cache_inode);
169 if (cache_sb->s_op->write_inode)
170 cache_sb->s_op->write_inode(cache_inode, wait);
172 post_smfs_inode(inode, cache_inode);
176 static void smfs_dirty_inode(struct inode *inode)
178 struct inode *cache_inode;
179 struct super_block *cache_sb;
182 cache_inode = I2CI(inode);
183 cache_sb = S2CSB(inode->i_sb);
185 if (!cache_inode || !cache_sb)
188 pre_smfs_inode(inode, cache_inode);
189 if (cache_sb->s_op->dirty_inode)
190 cache_sb->s_op->dirty_inode(cache_inode);
192 post_smfs_inode(inode, cache_inode);
196 static void smfs_put_inode(struct inode *inode)
198 struct inode *cache_inode;
199 struct super_block *cache_sb;
202 cache_inode = I2CI(inode);
203 cache_sb = S2CSB(inode->i_sb);
205 if (!cache_inode || !cache_sb)
207 if (cache_sb->s_op->put_inode)
208 cache_sb->s_op->put_inode(cache_inode);
213 static void smfs_write_super(struct super_block *sb)
215 struct super_block *cache_sb;
218 cache_sb = S2CSB(sb);
223 if (cache_sb->s_op->write_super)
224 cache_sb->s_op->write_super(cache_sb);
226 duplicate_sb(cache_sb, sb);
230 static void smfs_write_super_lockfs(struct super_block *sb)
232 struct super_block *cache_sb;
235 cache_sb = S2CSB(sb);
240 if (cache_sb->s_op->write_super_lockfs)
241 cache_sb->s_op->write_super_lockfs(cache_sb);
243 duplicate_sb(cache_sb, sb);
247 static void smfs_unlockfs(struct super_block *sb)
249 struct super_block *cache_sb;
252 cache_sb = S2CSB(sb);
257 if (cache_sb->s_op->unlockfs)
258 cache_sb->s_op->unlockfs(cache_sb);
260 duplicate_sb(cache_sb, sb);
263 static int smfs_statfs(struct super_block * sb, struct statfs * buf)
265 struct super_block *cache_sb;
269 cache_sb = S2CSB(sb);
274 if (cache_sb->s_op->statfs)
275 rc = cache_sb->s_op->statfs(cache_sb, buf);
277 duplicate_sb(cache_sb, sb);
281 static int smfs_remount(struct super_block * sb, int * flags, char * data)
283 struct super_block *cache_sb;
287 cache_sb = S2CSB(sb);
292 if (cache_sb->s_op->remount_fs)
293 rc = cache_sb->s_op->remount_fs(cache_sb, flags, data);
295 duplicate_sb(cache_sb, sb);
298 struct super_operations smfs_super_ops = {
299 read_inode: smfs_read_inode,
300 clear_inode: smfs_clear_inode,
301 put_super: smfs_put_super,
302 delete_inode: smfs_delete_inode,
303 write_inode: smfs_write_inode,
304 dirty_inode: smfs_dirty_inode, /* BKL not held. We take it */
305 put_inode: smfs_put_inode, /* BKL not held. Don't need */
307 write_super: smfs_write_super, /* BKL held */
308 write_super_lockfs: smfs_write_super_lockfs, /* BKL not held. Take it */
309 unlockfs: smfs_unlockfs, /* BKL not held. We take it */
310 statfs: smfs_statfs, /* BKL held */
311 remount_fs: smfs_remount, /* BKL held */