4 #define DEBUG_SUBSYSTEM S_SNAP
6 #include <linux/module.h>
7 #include <linux/kernel.h>
8 #include <linux/string.h>
9 #include <linux/slab.h>
10 #include <linux/stat.h>
11 #include <linux/unistd.h>
13 #include "smfs_internal.h"
15 #define NAME_ALLOC_LEN(len) ((len+16) & ~15)
17 void smfs_clear_dentry(struct dentry *dentry)
19 struct qstr *name = NULL;
22 if (!atomic_dec_and_lock(&dentry->d_count, &dcache_lock))
24 list_del(&dentry->d_hash);
25 INIT_LIST_HEAD(&dentry->d_hash);
26 list_del(&dentry->d_child);
27 if (dentry->d_inode) {
28 dentry->d_inode = NULL;
29 list_del_init(&dentry->d_alias);
32 name = &(dentry->d_name);
33 if (name->len > DNAME_INLINE_LEN-1) {
34 SM_FREE((char *)name->name, NAME_ALLOC_LEN(name->len));
39 int smfs_prepare_dentry(struct dentry *dentry,
40 struct dentry *parent,
45 if (name->len > DNAME_INLINE_LEN-1) {
46 SM_ALLOC(str, NAME_ALLOC_LEN(name->len));
50 str = dentry->d_iname;
52 memcpy(str, name->name, name->len);
55 atomic_set(&dentry->d_count, 1);
56 dentry->d_vfs_flags = 0;
58 dentry->d_inode = NULL;
59 dentry->d_parent = NULL;
61 dentry->d_name.name = str;
62 dentry->d_name.len = name->len;
63 dentry->d_name.hash = name->hash;
65 dentry->d_fsdata = NULL;
66 dentry->d_mounted = 0;
67 INIT_LIST_HEAD(&dentry->d_hash);
68 INIT_LIST_HEAD(&dentry->d_lru);
69 INIT_LIST_HEAD(&dentry->d_subdirs);
70 INIT_LIST_HEAD(&dentry->d_alias);
73 dentry->d_parent = dget(parent);
74 dentry->d_sb = parent->d_sb;
75 list_add(&dentry->d_child, &parent->d_subdirs);
77 INIT_LIST_HEAD(&dentry->d_child);
81 static void prepare_parent_dentry(struct dentry *dentry, struct inode *inode)
83 atomic_set(&dentry->d_count, 1);
84 dentry->d_vfs_flags = 0;
86 dentry->d_inode = inode;
88 dentry->d_fsdata = NULL;
89 dentry->d_mounted = 0;
90 INIT_LIST_HEAD(&dentry->d_hash);
91 INIT_LIST_HEAD(&dentry->d_lru);
92 INIT_LIST_HEAD(&dentry->d_subdirs);
93 INIT_LIST_HEAD(&dentry->d_alias);
96 static int smfs_create(struct inode *dir,
97 struct dentry *dentry,
100 struct inode *cache_dir;
101 struct inode *cache_inode = NULL, *inode;
102 struct dentry parent;
103 struct dentry cache_dentry;
108 cache_dir = I2CI(dir);
112 prepare_parent_dentry(&parent, cache_dir);
113 smfs_prepare_dentry(&cache_dentry, &parent, &dentry->d_name);
115 if (cache_dir && cache_dir->i_op->create)
116 rc = cache_dir->i_op->create(cache_dir, &cache_dentry, mode);
120 cache_inode = cache_dentry.d_inode;
122 inode = iget(dir->i_sb, cache_inode->i_ino);
125 GOTO(exit, rc = -ENOMEM);
127 d_instantiate(dentry, inode);
129 sm_set_inode_ops(cache_inode, inode);
131 smfs_clear_dentry(&cache_dentry);
135 static struct dentry *smfs_lookup(struct inode *dir,
136 struct dentry *dentry)
138 struct inode *cache_dir;
139 struct inode *cache_inode = NULL, *inode;
141 struct dentry cache_dentry;
142 struct dentry *rc = NULL;
146 cache_dir = I2CI(dir);
148 RETURN(ERR_PTR(-ENOENT));
149 prepare_parent_dentry(&tmp, cache_dir);
150 smfs_prepare_dentry(&cache_dentry, &tmp, &dentry->d_name);
152 if(cache_dir && cache_dir->i_op->lookup)
153 rc = cache_dir->i_op->lookup(cache_dir, &cache_dentry);
155 if (rc || !cache_dentry.d_inode ||
156 is_bad_inode(cache_dentry.d_inode) ||
157 IS_ERR(cache_dentry.d_inode)) {
161 cache_inode = cache_dentry.d_inode;
163 inode = iget(dir->i_sb, cache_inode->i_ino);
165 d_add(dentry, inode);
167 smfs_clear_dentry(&cache_dentry);
171 static int smfs_lookup_raw(struct inode *dir, const char *name,
172 int len, ino_t *data)
174 struct inode *cache_dir;
177 cache_dir = I2CI(dir);
182 if (cache_dir->i_op->lookup_raw)
183 rc = cache_dir->i_op->lookup_raw(cache_dir, name, len, data);
188 static int smfs_link(struct dentry * old_dentry,
189 struct inode * dir, struct dentry *dentry)
191 struct inode *cache_old_inode = NULL;
192 struct inode *cache_dir = I2CI(dir);
193 struct inode *inode = NULL;
194 struct dentry cache_dentry;
195 struct dentry cache_old_dentry;
197 struct dentry tmp_old;
200 inode = old_dentry->d_inode;
202 cache_old_inode = I2CI(inode);
204 if (!cache_old_inode || !cache_dir)
207 prepare_parent_dentry(&tmp, cache_dir);
208 smfs_prepare_dentry(&cache_dentry, &tmp, &dentry->d_name);
210 prepare_parent_dentry(&tmp_old, cache_dir);
211 smfs_prepare_dentry(&cache_old_dentry, &tmp_old, &dentry->d_name);
212 d_add(&cache_old_dentry, cache_old_inode);
214 if (cache_dir->i_op->link)
215 rc = cache_dir->i_op->link(&cache_old_dentry, cache_dir, &cache_dentry);
218 atomic_inc(&inode->i_count);
219 duplicate_inode(cache_old_dentry.d_inode, inode);
220 d_instantiate(dentry, inode);
223 smfs_clear_dentry(&cache_dentry);
224 smfs_clear_dentry(&cache_old_dentry);
228 static int smfs_unlink(struct inode * dir,
229 struct dentry *dentry)
231 struct inode *cache_dir = I2CI(dir);
232 struct inode *cache_inode = I2CI(dentry->d_inode);
233 struct dentry cache_dentry;
237 if (!cache_dir || !cache_inode)
240 prepare_parent_dentry(&tmp, cache_dir);
241 smfs_prepare_dentry(&cache_dentry, &tmp, &dentry->d_name);
242 d_add(&cache_dentry, cache_inode);
244 if (cache_dir->i_op->unlink)
245 rc = cache_dir->i_op->unlink(cache_dir, &cache_dentry);
247 duplicate_inode(cache_dentry.d_inode, dentry->d_inode);
248 duplicate_inode(cache_dir, dir);
250 smfs_clear_dentry(&cache_dentry);
254 static int smfs_symlink (struct inode * dir,
255 struct dentry *dentry,
256 const char * symname)
258 struct inode *cache_dir = I2CI(dir);
259 struct inode *cache_inode = NULL;
260 struct inode *inode = NULL;
261 struct dentry cache_dentry;
268 prepare_parent_dentry(&tmp, cache_dir);
269 smfs_prepare_dentry(&cache_dentry, &tmp, &dentry->d_name);
271 if (cache_dir->i_op->symlink)
272 rc = cache_dir->i_op->symlink(cache_dir, &cache_dentry, symname);
274 cache_inode = cache_dentry.d_inode;
276 inode = iget(dir->i_sb, cache_inode->i_ino);
279 d_instantiate(dentry, inode);
283 smfs_clear_dentry(&cache_dentry);
287 static int smfs_mkdir(struct inode * dir,
288 struct dentry * dentry,
291 struct inode *cache_dir = I2CI(dir);
292 struct inode *cache_inode = NULL;
293 struct inode *inode = NULL;
294 struct dentry cache_dentry;
301 prepare_parent_dentry(&tmp, cache_dir);
302 smfs_prepare_dentry(&cache_dentry, &tmp, &dentry->d_name);
304 if (cache_dir->i_op->mkdir)
305 rc = cache_dir->i_op->mkdir(cache_dir, &cache_dentry, mode);
307 cache_inode = cache_dentry.d_inode;
309 inode = iget(dir->i_sb, cache_inode->i_ino);
312 GOTO(exit, rc = -ENOENT);
314 d_instantiate(dentry, inode);
315 duplicate_inode(cache_dir, dir);
317 smfs_clear_dentry(&cache_dentry);
321 static int smfs_rmdir(struct inode * dir,
322 struct dentry *dentry)
324 struct inode *cache_dir = I2CI(dir);
325 struct inode *cache_inode = I2CI(dentry->d_inode);
326 struct dentry cache_dentry;
333 prepare_parent_dentry(&tmp, cache_dir);
334 smfs_prepare_dentry(&cache_dentry, &tmp, &dentry->d_name);
335 d_add(&cache_dentry, cache_inode);
337 if (cache_dir->i_op->rmdir)
338 rc = cache_dir->i_op->rmdir(cache_dir, &cache_dentry);
340 duplicate_inode(cache_dir, dir);
341 duplicate_inode(cache_dentry.d_inode, dentry->d_inode);
343 smfs_clear_dentry(&cache_dentry);
347 static int smfs_mknod(struct inode * dir, struct dentry *dentry,
350 struct inode *cache_dir = I2CI(dir);
351 struct inode *inode = NULL;
352 struct inode *cache_inode = NULL;
353 struct dentry cache_dentry;
360 prepare_parent_dentry(&tmp, cache_dir);
361 smfs_prepare_dentry(&cache_dentry, &tmp, &dentry->d_name);
363 if (cache_dir->i_op->mknod)
364 rc = cache_dir->i_op->mknod(cache_dir, &cache_dentry, mode, rdev);
367 cache_inode = cache_dentry.d_inode;
368 inode = iget(dir->i_sb, cache_inode->i_ino);
369 d_instantiate(dentry, inode);
370 duplicate_inode(cache_dir, dir);
371 duplicate_inode(cache_dentry.d_inode, dentry->d_inode);
373 smfs_clear_dentry(&cache_dentry);
376 static int smfs_rename(struct inode * old_dir, struct dentry *old_dentry,
377 struct inode * new_dir,struct dentry *new_dentry)
379 struct inode *cache_old_dir = I2CI(old_dir);
380 struct inode *cache_new_dir = I2CI(new_dir);
381 struct inode *cache_old_inode = I2CI(old_dentry->d_inode);
382 struct inode *cache_new_inode = NULL;
383 struct inode *new_inode = NULL;
384 struct dentry cache_old_dentry;
385 struct dentry cache_new_dentry;
386 struct dentry tmp_new;
387 struct dentry tmp_old;
390 if (!cache_old_dir || !cache_new_dir || !cache_old_inode)
393 prepare_parent_dentry(&tmp_old, cache_old_dir);
394 smfs_prepare_dentry(&cache_old_dentry, &tmp_old, &old_dentry->d_name);
395 d_add(&cache_old_dentry, cache_old_inode);
397 prepare_parent_dentry(&tmp_new, cache_new_dir);
398 smfs_prepare_dentry(&cache_new_dentry, &tmp_new, &new_dentry->d_name);
400 if (cache_old_dir->i_op->rename)
401 rc = cache_old_dir->i_op->rename(cache_old_dir, &cache_old_dentry,
402 cache_new_dir, &cache_new_dentry);
404 duplicate_inode(cache_old_dir, old_dir);
405 duplicate_inode(cache_new_dir, new_dir);
406 smfs_clear_dentry(&cache_old_dentry);
407 smfs_clear_dentry(&cache_new_dentry);
412 struct inode_operations smfs_dir_iops = {
415 lookup_raw: smfs_lookup_raw, /* BKL held */
416 link: smfs_link, /* BKL held */
417 unlink: smfs_unlink, /* BKL held */
418 symlink: smfs_symlink, /* BKL held */
419 mkdir: smfs_mkdir, /* BKL held */
420 rmdir: smfs_rmdir, /* BKL held */
421 mknod: smfs_mknod, /* BKL held */
422 rename: smfs_rename, /* BKL held */
423 setxattr: smfs_setxattr, /* BKL held */
424 getxattr: smfs_getxattr, /* BKL held */
425 listxattr: smfs_listxattr, /* BKL held */
426 removexattr: smfs_removexattr, /* BKL held */
429 static ssize_t smfs_read_dir(struct file *filp, char *buf,
430 size_t size, loff_t *ppos)
432 struct dentry *dentry = filp->f_dentry;
433 struct inode *cache_inode = NULL;
434 struct file open_file;
435 struct dentry open_dentry;
438 cache_inode = I2CI(dentry->d_inode);
443 smfs_prepare_cachefile(dentry->d_inode, filp, cache_inode,
444 &open_file, &open_dentry);
446 if (cache_inode->i_fop->read)
447 rc = cache_inode->i_fop->read(&open_file, buf, size, ppos);
449 smfs_update_file(filp, &open_file);
453 static int smfs_readdir(struct file * filp,
457 struct dentry *dentry = filp->f_dentry;
458 struct inode *cache_inode = NULL;
459 struct file open_file;
460 struct dentry open_dentry;
463 cache_inode = I2CI(dentry->d_inode);
468 smfs_prepare_cachefile(dentry->d_inode, filp, cache_inode,
469 &open_file, &open_dentry);
471 if (cache_inode->i_fop->readdir)
472 rc = cache_inode->i_fop->readdir(&open_file, dirent, filldir);
474 smfs_update_file(filp, &open_file);
478 struct file_operations smfs_dir_fops = {
480 readdir: smfs_readdir, /* BKL held */
481 ioctl: smfs_ioctl, /* BKL held */
482 fsync: smfs_fsync, /* BKL held */