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 void duplicate_inode(struct inode *cache_inode, struct inode *inode)
19 inode->i_mode = cache_inode->i_mode;
20 inode->i_uid = cache_inode->i_uid;
21 inode->i_gid = cache_inode->i_gid;
23 inode->i_nlink = cache_inode->i_nlink;
24 inode->i_size = cache_inode->i_size;
25 inode->i_atime = cache_inode->i_atime;
26 inode->i_ctime = cache_inode->i_ctime;
27 inode->i_mtime = cache_inode->i_mtime;
28 inode->i_blksize = cache_inode->i_blksize; /* This is the optimal IO size
29 * (for stat), not the fs block
31 inode->i_blocks = cache_inode->i_blocks;
32 inode->i_version = cache_inode->i_version;
33 inode->i_state = cache_inode->i_state;
35 static void smfs_read_inode(struct inode *inode)
37 struct super_block *cache_sb;
38 struct inode *cache_inode;
44 CDEBUG(D_INODE, "read_inode ino %lu\n", inode->i_ino);
45 cache_sb = S2CSB(inode->i_sb);
47 cache_inode = iget(cache_sb, inode->i_ino);
48 I2CI(inode) = cache_inode;
50 if(cache_sb && cache_sb->s_op->read_inode)
51 cache_sb->s_op->read_inode(cache_inode);
53 duplicate_inode(cache_inode, inode);
54 sm_set_inode_ops(cache_inode, inode);
56 CDEBUG(D_INODE, "read_inode ino %lu icount %d \n",
57 inode->i_ino, atomic_read(&inode->i_count));
62 /* Although some filesystem(such as ext3) do not have
63 * clear_inode method, but we need it to free the
66 static void smfs_clear_inode(struct inode *inode)
68 struct super_block *cache_sb;
69 struct inode *cache_inode;
75 cache_sb = S2CSB(inode->i_sb);
76 cache_inode = I2CI(inode);
78 /*FIXME: because i_count of cache_inode may not
79 * be 0 or 1 in before smfs_delete inode, So we
80 * need to dec it to 1 before we call delete_inode
81 * of the bellow cache filesystem Check again latter*/
83 if (atomic_read(&cache_inode->i_count) < 1)
86 while (atomic_read(&cache_inode->i_count) != 1) {
87 atomic_dec(&cache_inode->i_count);
94 static void smfs_delete_inode(struct inode *inode)
96 struct inode *cache_inode;
97 struct super_block *cache_sb;
100 cache_inode = I2CI(inode);
101 cache_sb = S2CSB(inode->i_sb);
103 if (!cache_inode || !cache_sb)
106 /*FIXME: because i_count of cache_inode may not
107 * be 0 or 1 in before smfs_delete inode, So we
108 * need to dec it to 1 before we call delete_inode
109 * of the bellow cache filesystem Check again latter*/
111 if (atomic_read(&cache_inode->i_count) < 1)
114 while (atomic_read(&cache_inode->i_count) != 1) {
115 atomic_dec(&cache_inode->i_count);
118 duplicate_inode(inode, cache_inode);
120 list_del(&cache_inode->i_hash);
121 INIT_LIST_HEAD(&cache_inode->i_hash);
122 list_del(&cache_inode->i_list);
123 INIT_LIST_HEAD(&cache_inode->i_list);
125 if (cache_inode->i_data.nrpages)
126 truncate_inode_pages(&cache_inode->i_data, 0);
128 if (cache_sb->s_op->delete_inode)
129 cache_sb->s_op->delete_inode(cache_inode);
131 duplicate_inode(cache_inode, inode);
136 static void smfs_write_inode(struct inode *inode, int wait)
138 struct inode *cache_inode;
139 struct super_block *cache_sb;
142 cache_inode = I2CI(inode);
143 cache_sb = S2CSB(inode->i_sb);
145 if (!cache_inode || !cache_sb)
148 duplicate_inode(inode, cache_inode);
149 if (cache_sb->s_op->write_inode)
150 cache_sb->s_op->write_inode(cache_inode, wait);
152 duplicate_inode(cache_inode, inode);
156 static void smfs_dirty_inode(struct inode *inode)
158 struct inode *cache_inode;
159 struct super_block *cache_sb;
162 cache_inode = I2CI(inode);
163 cache_sb = S2CSB(inode->i_sb);
165 if (!cache_inode || !cache_sb)
168 duplicate_inode(inode, cache_inode);
169 if (cache_sb->s_op->dirty_inode)
170 cache_sb->s_op->dirty_inode(cache_inode);
172 duplicate_inode(cache_inode, inode);
176 static void smfs_put_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)
187 if (cache_sb->s_op->put_inode)
188 cache_sb->s_op->put_inode(cache_inode);
193 static void smfs_write_super(struct super_block *sb)
195 struct super_block *cache_sb;
198 cache_sb = S2CSB(sb);
203 if (cache_sb->s_op->write_super)
204 cache_sb->s_op->write_super(cache_sb);
206 duplicate_sb(cache_sb, sb);
210 static void smfs_write_super_lockfs(struct super_block *sb)
212 struct super_block *cache_sb;
215 cache_sb = S2CSB(sb);
220 if (cache_sb->s_op->write_super_lockfs)
221 cache_sb->s_op->write_super_lockfs(cache_sb);
223 duplicate_sb(cache_sb, sb);
227 static void smfs_unlockfs(struct super_block *sb)
229 struct super_block *cache_sb;
232 cache_sb = S2CSB(sb);
237 if (cache_sb->s_op->unlockfs)
238 cache_sb->s_op->unlockfs(cache_sb);
240 duplicate_sb(cache_sb, sb);
243 static int smfs_statfs(struct super_block * sb, struct statfs * buf)
245 struct super_block *cache_sb;
249 cache_sb = S2CSB(sb);
254 if (cache_sb->s_op->statfs)
255 rc = cache_sb->s_op->statfs(cache_sb, buf);
257 duplicate_sb(cache_sb, sb);
261 static int smfs_remount(struct super_block * sb, int * flags, char * data)
263 struct super_block *cache_sb;
267 cache_sb = S2CSB(sb);
272 if (cache_sb->s_op->remount_fs)
273 rc = cache_sb->s_op->remount_fs(cache_sb, flags, data);
275 duplicate_sb(cache_sb, sb);
278 struct super_operations smfs_super_ops = {
279 read_inode: smfs_read_inode,
280 clear_inode: smfs_clear_inode,
281 put_super: smfs_put_super,
282 delete_inode: smfs_delete_inode,
283 write_inode: smfs_write_inode,
284 dirty_inode: smfs_dirty_inode, /* BKL not held. We take it */
285 put_inode: smfs_put_inode, /* BKL not held. Don't need */
287 write_super: smfs_write_super, /* BKL held */
288 write_super_lockfs: smfs_write_super_lockfs, /* BKL not held. Take it */
289 unlockfs: smfs_unlockfs, /* BKL not held. We take it */
290 statfs: smfs_statfs, /* BKL held */
291 remount_fs: smfs_remount, /* BKL held */