patch-2.4.15 linux/fs/intermezzo/inode.c
Next file: linux/fs/intermezzo/journal.c
Previous file: linux/fs/intermezzo/file.c
Back to the patch index
Back to the overall index
- Lines: 167
- Date:
Sun Nov 11 10:20:21 2001
- Orig file:
v2.4.14/linux/fs/intermezzo/inode.c
- Orig date:
Wed Dec 31 16:00:00 1969
diff -u --recursive --new-file v2.4.14/linux/fs/intermezzo/inode.c linux/fs/intermezzo/inode.c
@@ -0,0 +1,166 @@
+/*
+ * Super block/filesystem wide operations
+ *
+ * Copryright (C) 1996 Peter J. Braam <braam@maths.ox.ac.uk> and
+ * Michael Callahan <callahan@maths.ox.ac.uk>
+ *
+ * Rewritten for Linux 2.1. Peter Braam <braam@cs.cmu.edu>
+ * Copyright (C) Carnegie Mellon University
+ */
+
+#define __NO_VERSION__
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/string.h>
+#include <linux/stat.h>
+#include <linux/errno.h>
+#include <linux/locks.h>
+#include <linux/unistd.h>
+
+#include <asm/system.h>
+#include <asm/uaccess.h>
+
+#include <linux/fs.h>
+#include <linux/stat.h>
+#include <linux/errno.h>
+#include <linux/locks.h>
+#include <linux/string.h>
+#include <asm/uaccess.h>
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
+#include <asm/segment.h>
+
+#include <linux/intermezzo_fs.h>
+#include <linux/intermezzo_upcall.h>
+#include <linux/intermezzo_psdev.h>
+
+extern int presto_remount(struct super_block *, int *, char *);
+
+int presto_excluded_gid = PRESTO_EXCL_GID;
+
+extern int presto_prep(struct dentry *, struct presto_cache **,
+ struct presto_file_set **);
+extern void presto_free_cache(struct presto_cache *);
+
+
+void presto_set_ops(struct inode *inode, struct filter_fs *filter)
+{
+ ENTRY;
+ if (inode->i_gid == presto_excluded_gid ) {
+ EXIT;
+ CDEBUG(D_INODE, "excluded methods for %ld at %p, %p\n",
+ inode->i_ino, inode->i_op, inode->i_fop);
+ return;
+ }
+ if (S_ISREG(inode->i_mode)) {
+ if ( !filter_c2cfiops(filter) ) {
+ filter_setup_file_ops(filter,
+ inode, &presto_file_iops,
+ &presto_file_fops);
+ }
+ inode->i_op = filter_c2ufiops(filter);
+ inode->i_fop = filter_c2uffops(filter);
+ CDEBUG(D_INODE, "set file methods for %ld to %p\n",
+ inode->i_ino, inode->i_op);
+ } else if (S_ISDIR(inode->i_mode)) {
+ inode->i_op = filter_c2udiops(filter);
+ inode->i_fop = filter_c2udfops(filter);
+ CDEBUG(D_INODE, "set dir methods for %ld to %p lookup %p\n",
+ inode->i_ino, inode->i_op, inode->i_op->lookup);
+ } else if (S_ISLNK(inode->i_mode)) {
+ if ( !filter_c2csiops(filter)) {
+ filter_setup_symlink_ops(filter,
+ inode,
+ &presto_sym_iops,
+ &presto_sym_fops);
+ }
+ inode->i_op = filter_c2usiops(filter);
+ inode->i_fop = filter_c2usfops(filter);
+ CDEBUG(D_INODE, "set link methods for %ld to %p\n",
+ inode->i_ino, inode->i_op);
+ }
+ EXIT;
+}
+
+void presto_read_inode(struct inode *inode)
+{
+ struct presto_cache *cache;
+
+ cache = presto_get_cache(inode);
+ if ( !cache ) {
+ printk("PRESTO: BAD, BAD: cannot find cache\n");
+ make_bad_inode(inode);
+ return ;
+ }
+
+ filter_c2csops(cache->cache_filter)->read_inode(inode);
+
+ CDEBUG(D_INODE, "presto_read_inode: ino %ld, gid %d\n",
+ inode->i_ino, inode->i_gid);
+
+ // if (inode->i_gid == presto_excluded_gid)
+ // return;
+
+ presto_set_ops(inode, cache->cache_filter);
+ /* XXX handle special inodes here or not - probably not? */
+}
+
+void presto_put_super(struct super_block *sb)
+{
+ struct presto_cache *cache;
+ struct upc_comm *psdev;
+ struct super_operations *sops;
+ struct list_head *lh;
+
+ ENTRY;
+ cache = presto_find_cache(sb->s_dev);
+ if (!cache) {
+ EXIT;
+ goto exit;
+ }
+ psdev = &upc_comms[presto_c2m(cache)];
+
+ sops = filter_c2csops(cache->cache_filter);
+ if (sops->put_super)
+ sops->put_super(sb);
+
+ /* free any remaining async upcalls when the filesystem is unmounted */
+ lh = psdev->uc_pending.next;
+ while ( lh != &psdev->uc_pending) {
+ struct upc_req *req;
+ req = list_entry(lh, struct upc_req, rq_chain);
+
+ /* assignment must be here: we are about to free &lh */
+ lh = lh->next;
+ if ( ! (req->rq_flags & REQ_ASYNC) )
+ continue;
+ list_del(&(req->rq_chain));
+ PRESTO_FREE(req->rq_data, req->rq_bufsize);
+ PRESTO_FREE(req, sizeof(struct upc_req));
+ }
+
+ presto_free_cache(cache);
+
+exit:
+ CDEBUG(D_MALLOC, "after umount: kmem %ld, vmem %ld\n",
+ presto_kmemory, presto_vmemory);
+ MOD_DEC_USE_COUNT;
+ return ;
+}
+
+
+/* symlinks can be chowned */
+struct inode_operations presto_sym_iops = {
+ setattr: presto_setattr
+};
+
+/* NULL for now */
+struct file_operations presto_sym_fops;
+
+struct super_operations presto_super_ops = {
+ read_inode: presto_read_inode,
+ put_super: presto_put_super,
+ remount_fs: presto_remount
+};
+MODULE_LICENSE("GPL");
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)