summaryrefslogtreecommitdiff
path: root/libdde_linux26/lib/src/arch/l4/inodes.c
diff options
context:
space:
mode:
Diffstat (limited to 'libdde_linux26/lib/src/arch/l4/inodes.c')
-rw-r--r--libdde_linux26/lib/src/arch/l4/inodes.c311
1 files changed, 311 insertions, 0 deletions
diff --git a/libdde_linux26/lib/src/arch/l4/inodes.c b/libdde_linux26/lib/src/arch/l4/inodes.c
new file mode 100644
index 00000000..9ef02ed5
--- /dev/null
+++ b/libdde_linux26/lib/src/arch/l4/inodes.c
@@ -0,0 +1,311 @@
+/** lib/src/arch/l4/inodes.c
+ *
+ * Assorted dummies implementing inode and superblock access functions,
+ * which are used by the block layer stuff, but not needed in DDE_Linux.
+ */
+
+#include "local.h"
+
+#include <linux/fs.h>
+#include <linux/module.h>
+#include <linux/mount.h>
+
+/*
+ * Linux' global list of all super blocks.
+ */
+LIST_HEAD(super_blocks);
+
+/**********************************
+ * Inode stuff *
+ **********************************/
+
+struct inode* new_inode(struct super_block *sb)
+{
+ if (sb->s_op->alloc_inode)
+ return sb->s_op->alloc_inode(sb);
+
+ return kzalloc(sizeof(struct inode), GFP_KERNEL);
+}
+
+void __mark_inode_dirty(struct inode *inode, int flags)
+{
+ WARN_UNIMPL;
+}
+
+void iput(struct inode *inode)
+{
+ WARN_UNIMPL;
+}
+
+void generic_delete_inode(struct inode *inode)
+{
+ WARN_UNIMPL;
+}
+
+int invalidate_inodes(struct super_block * sb)
+{
+ WARN_UNIMPL;
+ return 0;
+}
+
+void truncate_inode_pages(struct address_space *mapping, loff_t lstart)
+{
+ WARN_UNIMPL;
+}
+
+void touch_atime(struct vfsmount *mnt, struct dentry *dentry)
+{
+ WARN_UNIMPL;
+}
+
+/**********************************
+ * Superblock stuff *
+ **********************************/
+
+struct super_block * get_super(struct block_device *bdev)
+{
+ WARN_UNIMPL;
+ return NULL;
+}
+
+int simple_statfs(struct dentry *dentry, struct kstatfs *buf)
+{
+ WARN_UNIMPL;
+ return 0;
+}
+
+void kill_anon_super(struct super_block *sb)
+{
+ WARN_UNIMPL;
+}
+
+void shrink_dcache_sb(struct super_block * sb)
+{
+ WARN_UNIMPL;
+}
+
+void drop_super(struct super_block *sb)
+{
+ WARN_UNIMPL;
+}
+
+struct inode_operations empty_iops = { };
+struct file_operations empty_fops = { };
+
+/**! Alloc and init a new inode.
+ *
+ * Basically stolen from linux/fs/inode.c:alloc_inode()
+ */
+static struct inode *dde_alloc_inode(struct super_block *sb)
+{
+ struct inode *inode;
+
+ if (sb->s_op->alloc_inode)
+ inode = sb->s_op->alloc_inode(sb);
+ else
+ inode = kzalloc(sizeof(*inode), GFP_KERNEL);
+
+ if (inode) {
+ inode->i_sb = sb;
+ inode->i_blkbits = sb->s_blocksize_bits;
+ inode->i_flags = 0;
+ atomic_set(&inode->i_count, 1);
+ inode->i_op = &empty_iops;
+ inode->i_fop = &empty_fops;
+ inode->i_nlink = 1;
+ atomic_set(&inode->i_writecount, 0);
+ inode->i_size = 0;
+ inode->i_blocks = 0;
+ inode->i_bytes = 0;
+ inode->i_generation = 0;
+ inode->i_pipe = NULL;
+ inode->i_bdev = NULL;
+ inode->i_cdev = NULL;
+ inode->i_rdev = 0;
+ inode->dirtied_when = 0;
+ inode->i_private = NULL;
+ }
+
+ return inode;
+}
+
+
+void __iget(struct inode *inode)
+{
+ atomic_inc(&inode->i_count);
+}
+
+
+static struct inode *dde_new_inode(struct super_block *sb, struct list_head *head,
+ int (*test)(struct inode *, void *),
+ int (*set)(struct inode *, void *), void *data)
+{
+ struct inode *ret = dde_alloc_inode(sb);
+ int err = 0;
+
+ if (set)
+ err = set(ret, data);
+
+ BUG_ON(err);
+
+ __iget(ret);
+ ret->i_state = I_LOCK|I_NEW;
+
+ list_add_tail(&ret->i_sb_list, &sb->s_inodes);
+
+ return ret;
+}
+
+
+struct inode *iget5_locked(struct super_block *sb, unsigned long hashval,
+ int (*test)(struct inode *, void *),
+ int (*set)(struct inode *, void *), void *data)
+{
+ struct inode *inode = NULL;
+ struct list_head *p;
+
+ list_for_each(p, &sb->s_inodes) {
+ struct inode *i = list_entry(p, struct inode, i_sb_list);
+ if (test) {
+ if (!test(i, data)) {
+ DEBUG_MSG("test false");
+ continue;
+ }
+ else {
+ inode = i;
+ break;
+ }
+ }
+ }
+
+ if (inode)
+ return inode;
+
+ return dde_new_inode(sb, &sb->s_inodes, test, set, data);
+}
+
+void unlock_new_inode(struct inode *inode)
+{
+ inode->i_state &= ~(I_LOCK | I_NEW);
+ wake_up_bit(&inode->i_state, __I_LOCK);
+}
+
+struct super_block *sget(struct file_system_type *type,
+ int (*test)(struct super_block *, void*),
+ int (*set)(struct super_block *, void*),
+ void *data)
+{
+ struct super_block *s = NULL;
+ struct list_head *p;
+ int err;
+
+ if (test) {
+ list_for_each(p, &type->fs_supers) {
+ struct super_block *block = list_entry(p,
+ struct super_block,
+ s_instances);
+ if (!test(block, data))
+ continue;
+ return block;
+ }
+ }
+
+ s = kzalloc(sizeof(*s), GFP_KERNEL);
+ BUG_ON(!s);
+
+ INIT_LIST_HEAD(&s->s_dirty);
+ INIT_LIST_HEAD(&s->s_io);
+ INIT_LIST_HEAD(&s->s_files);
+ INIT_LIST_HEAD(&s->s_instances);
+ INIT_HLIST_HEAD(&s->s_anon);
+ INIT_LIST_HEAD(&s->s_inodes);
+ init_rwsem(&s->s_umount);
+ mutex_init(&s->s_lock);
+ lockdep_set_class(&s->s_umount, &type->s_umount_key);
+ /*
+ * The locking rules for s_lock are up to the
+ * filesystem. For example ext3fs has different
+ * lock ordering than usbfs:
+ */
+ lockdep_set_class(&s->s_lock, &type->s_lock_key);
+ down_write(&s->s_umount);
+ s->s_count = S_BIAS;
+ atomic_set(&s->s_active, 1);
+ mutex_init(&s->s_vfs_rename_mutex);
+ mutex_init(&s->s_dquot.dqio_mutex);
+ mutex_init(&s->s_dquot.dqonoff_mutex);
+ init_rwsem(&s->s_dquot.dqptr_sem);
+ init_waitqueue_head(&s->s_wait_unfrozen);
+ s->s_maxbytes = MAX_NON_LFS;
+#if 0
+ s->dq_op = sb_dquot_ops;
+ s->s_qcop = sb_quotactl_ops;
+ s->s_op = &default_op;
+#endif
+ s->s_time_gran = 1000000000;
+
+ err = set(s, data);
+ BUG_ON(err);
+
+ s->s_type = type;
+ strlcpy(s->s_id, type->name, sizeof(s->s_id));
+ list_add_tail(&s->s_list, &super_blocks);
+ list_add(&s->s_instances, &type->fs_supers);
+ __module_get(type->owner);
+ return s;
+}
+
+int set_anon_super(struct super_block *s, void *data)
+{
+ WARN_UNIMPL;
+ return 0;
+}
+
+int get_sb_pseudo(struct file_system_type *fs_type, char *name,
+ const struct super_operations *ops, unsigned long magic,
+ struct vfsmount *mnt)
+{
+ struct super_block *s = sget(fs_type, NULL, set_anon_super, NULL);
+ struct super_operations default_ops = {};
+ struct inode *root = NULL;
+ struct dentry *dentry = NULL;
+ struct qstr d_name = {.name = name, .len = strlen(name)};
+
+ BUG_ON(IS_ERR(s));
+
+ s->s_flags = MS_NOUSER;
+ s->s_maxbytes = ~0ULL;
+ s->s_blocksize = 1024;
+ s->s_blocksize_bits = 10;
+ s->s_magic = magic;
+ s->s_op = ops ? ops : &default_ops;
+ s->s_time_gran = 1;
+ root = new_inode(s);
+
+ BUG_ON(!root);
+
+ root->i_mode = S_IFDIR | S_IRUSR | S_IWUSR;
+ root->i_uid = root->i_gid = 0;
+#if 0
+ root->i_atime = root->i_mtime = root->i_ctime = CURRENT_TIME;
+ dentry = d_alloc(NULL, &d_name);
+ dentry->d_sb = s;
+ dentry->d_parent = dentry;
+ d_instantiate(dentry, root);
+#endif
+ s->s_root = dentry;
+ s->s_flags |= MS_ACTIVE;
+
+ mnt->mnt_sb = s;
+ mnt->mnt_root = dget(s->s_root);
+
+ DEBUG_MSG("root mnt sb @ %p", mnt->mnt_sb);
+
+ return 0;
+}
+
+void inode_init_once(struct inode *inode)
+{
+ WARN_UNIMPL;
+}
+