diff options
Diffstat (limited to 'drivers/gator/driver/gator_fs.c')
-rw-r--r-- | drivers/gator/driver/gator_fs.c | 284 |
1 files changed, 0 insertions, 284 deletions
diff --git a/drivers/gator/driver/gator_fs.c b/drivers/gator/driver/gator_fs.c deleted file mode 100644 index 8277c3aac3e..00000000000 --- a/drivers/gator/driver/gator_fs.c +++ /dev/null @@ -1,284 +0,0 @@ -/** - * @file gatorfs.c - * - * @remark Copyright 2002 OProfile authors - * @remark Read the file COPYING - * - * @author John Levon - * - * A simple filesystem for configuration and - * access of oprofile. - */ - -#include <linux/init.h> -#include <linux/module.h> -#include <linux/fs.h> -#include <linux/pagemap.h> -#include <asm/uaccess.h> - -#define gatorfs_MAGIC 0x24051020 -#define TMPBUFSIZE 50 -DEFINE_SPINLOCK(gatorfs_lock); - -static struct inode *gatorfs_get_inode(struct super_block *sb, int mode) -{ - struct inode *inode = new_inode(sb); - - if (inode) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37) - inode->i_ino = get_next_ino(); -#endif - inode->i_mode = mode; - inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; - } - return inode; -} - -static const struct super_operations s_ops = { - .statfs = simple_statfs, - .drop_inode = generic_delete_inode, -}; - -ssize_t gatorfs_str_to_user(char const *str, char __user *buf, size_t count, loff_t *offset) -{ - return simple_read_from_buffer(buf, count, offset, str, strlen(str)); -} - -ssize_t gatorfs_ulong_to_user(unsigned long val, char __user *buf, size_t count, loff_t *offset) -{ - char tmpbuf[TMPBUFSIZE]; - size_t maxlen = snprintf(tmpbuf, TMPBUFSIZE, "%lu\n", val); - if (maxlen > TMPBUFSIZE) - maxlen = TMPBUFSIZE; - return simple_read_from_buffer(buf, count, offset, tmpbuf, maxlen); -} - -int gatorfs_ulong_from_user(unsigned long *val, char const __user *buf, size_t count) -{ - char tmpbuf[TMPBUFSIZE]; - unsigned long flags; - - if (!count) - return 0; - - if (count > TMPBUFSIZE - 1) - return -EINVAL; - - memset(tmpbuf, 0x0, TMPBUFSIZE); - - if (copy_from_user(tmpbuf, buf, count)) - return -EFAULT; - - spin_lock_irqsave(&gatorfs_lock, flags); - *val = simple_strtoul(tmpbuf, NULL, 0); - spin_unlock_irqrestore(&gatorfs_lock, flags); - return 0; -} - -static ssize_t ulong_read_file(struct file *file, char __user *buf, size_t count, loff_t *offset) -{ - unsigned long *val = file->private_data; - return gatorfs_ulong_to_user(*val, buf, count, offset); -} - -static ssize_t ulong_write_file(struct file *file, char const __user *buf, size_t count, loff_t *offset) -{ - unsigned long *value = file->private_data; - int retval; - - if (*offset) - return -EINVAL; - - retval = gatorfs_ulong_from_user(value, buf, count); - - if (retval) - return retval; - return count; -} - -static int default_open(struct inode *inode, struct file *filp) -{ - if (inode->i_private) - filp->private_data = inode->i_private; - return 0; -} - -static const struct file_operations ulong_fops = { - .read = ulong_read_file, - .write = ulong_write_file, - .open = default_open, -}; - -static const struct file_operations ulong_ro_fops = { - .read = ulong_read_file, - .open = default_open, -}; - -static struct dentry *__gatorfs_create_file(struct super_block *sb, - struct dentry *root, char const *name, const struct file_operations *fops, - int perm) -{ - struct dentry *dentry; - struct inode *inode; - - dentry = d_alloc_name(root, name); - if (!dentry) - return NULL; - inode = gatorfs_get_inode(sb, S_IFREG | perm); - if (!inode) { - dput(dentry); - return NULL; - } - inode->i_fop = fops; - d_add(dentry, inode); - return dentry; -} - -int gatorfs_create_ulong(struct super_block *sb, struct dentry *root, - char const *name, unsigned long *val) -{ - struct dentry *d = __gatorfs_create_file(sb, root, name, - &ulong_fops, 0644); - if (!d) - return -EFAULT; - - d->d_inode->i_private = val; - return 0; -} - -int gatorfs_create_ro_ulong(struct super_block *sb, struct dentry *root, - char const *name, unsigned long *val) -{ - struct dentry *d = __gatorfs_create_file(sb, root, name, - &ulong_ro_fops, 0444); - if (!d) - return -EFAULT; - - d->d_inode->i_private = val; - return 0; -} - -static ssize_t atomic_read_file(struct file *file, char __user *buf, size_t count, loff_t *offset) -{ - atomic_t *val = file->private_data; - return gatorfs_ulong_to_user(atomic_read(val), buf, count, offset); -} - -static const struct file_operations atomic_ro_fops = { - .read = atomic_read_file, - .open = default_open, -}; - -int gatorfs_create_ro_atomic(struct super_block *sb, struct dentry *root, - char const *name, atomic_t *val) -{ - struct dentry *d = __gatorfs_create_file(sb, root, name, - &atomic_ro_fops, 0444); - if (!d) - return -EFAULT; - - d->d_inode->i_private = val; - return 0; -} - -int gatorfs_create_file(struct super_block *sb, struct dentry *root, - char const *name, const struct file_operations *fops) -{ - if (!__gatorfs_create_file(sb, root, name, fops, 0644)) - return -EFAULT; - return 0; -} - -int gatorfs_create_file_perm(struct super_block *sb, struct dentry *root, - char const *name, const struct file_operations *fops, int perm) -{ - if (!__gatorfs_create_file(sb, root, name, fops, perm)) - return -EFAULT; - return 0; -} - -struct dentry *gatorfs_mkdir(struct super_block *sb, - struct dentry *root, char const *name) -{ - struct dentry *dentry; - struct inode *inode; - - dentry = d_alloc_name(root, name); - if (!dentry) - return NULL; - inode = gatorfs_get_inode(sb, S_IFDIR | 0755); - if (!inode) { - dput(dentry); - return NULL; - } - inode->i_op = &simple_dir_inode_operations; - inode->i_fop = &simple_dir_operations; - d_add(dentry, inode); - return dentry; -} - -static int gatorfs_fill_super(struct super_block *sb, void *data, int silent) -{ - struct inode *root_inode; - struct dentry *root_dentry; - - sb->s_blocksize = PAGE_CACHE_SIZE; - sb->s_blocksize_bits = PAGE_CACHE_SHIFT; - sb->s_magic = gatorfs_MAGIC; - sb->s_op = &s_ops; - sb->s_time_gran = 1; - - root_inode = gatorfs_get_inode(sb, S_IFDIR | 0755); - if (!root_inode) - return -ENOMEM; - root_inode->i_op = &simple_dir_inode_operations; - root_inode->i_fop = &simple_dir_operations; - root_dentry = d_alloc_root(root_inode); - if (!root_dentry) { - iput(root_inode); - return -ENOMEM; - } - - sb->s_root = root_dentry; - - gator_op_create_files(sb, root_dentry); - - // FIXME: verify kill_litter_super removes our dentries - return 0; -} - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 39) -static int gatorfs_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data, struct vfsmount *mnt) -{ - return get_sb_single(fs_type, flags, data, gatorfs_fill_super, mnt); -} -#else -static struct dentry *gatorfs_mount(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) -{ - return mount_nodev(fs_type, flags, data, gatorfs_fill_super); -} -#endif - -static struct file_system_type gatorfs_type = { - .owner = THIS_MODULE, - .name = "gatorfs", -#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 39) - .get_sb = gatorfs_get_sb, -#else - .mount = gatorfs_mount, -#endif - - .kill_sb = kill_litter_super, -}; - -int __init gatorfs_register(void) -{ - return register_filesystem(&gatorfs_type); -} - -void gatorfs_unregister(void) -{ - unregister_filesystem(&gatorfs_type); -} |