| Alex Zeffertt | 1107ba8 | 2009-01-07 18:07:11 -0800 | [diff] [blame] | 1 | /* | 
|  | 2 | *  xenfs.c - a filesystem for passing info between the a domain and | 
|  | 3 | *  the hypervisor. | 
|  | 4 | * | 
|  | 5 | * 2008-10-07  Alex Zeffertt    Replaced /proc/xen/xenbus with xenfs filesystem | 
|  | 6 | *                              and /proc/xen compatibility mount point. | 
|  | 7 | *                              Turned xenfs into a loadable module. | 
|  | 8 | */ | 
|  | 9 |  | 
|  | 10 | #include <linux/kernel.h> | 
|  | 11 | #include <linux/errno.h> | 
|  | 12 | #include <linux/module.h> | 
|  | 13 | #include <linux/fs.h> | 
|  | 14 | #include <linux/magic.h> | 
|  | 15 |  | 
|  | 16 | #include "xenfs.h" | 
|  | 17 |  | 
|  | 18 | #include <asm/xen/hypervisor.h> | 
|  | 19 |  | 
|  | 20 | MODULE_DESCRIPTION("Xen filesystem"); | 
|  | 21 | MODULE_LICENSE("GPL"); | 
|  | 22 |  | 
|  | 23 | static int xenfs_fill_super(struct super_block *sb, void *data, int silent) | 
|  | 24 | { | 
|  | 25 | static struct tree_descr xenfs_files[] = { | 
|  | 26 | [2] = {"xenbus", &xenbus_file_ops, S_IRUSR|S_IWUSR}, | 
|  | 27 | {""}, | 
|  | 28 | }; | 
|  | 29 |  | 
|  | 30 | return simple_fill_super(sb, XENFS_SUPER_MAGIC, xenfs_files); | 
|  | 31 | } | 
|  | 32 |  | 
|  | 33 | static int xenfs_get_sb(struct file_system_type *fs_type, | 
|  | 34 | int flags, const char *dev_name, | 
|  | 35 | void *data, struct vfsmount *mnt) | 
|  | 36 | { | 
|  | 37 | return get_sb_single(fs_type, flags, data, xenfs_fill_super, mnt); | 
|  | 38 | } | 
|  | 39 |  | 
|  | 40 | static struct file_system_type xenfs_type = { | 
|  | 41 | .owner =	THIS_MODULE, | 
|  | 42 | .name =		"xenfs", | 
|  | 43 | .get_sb =	xenfs_get_sb, | 
|  | 44 | .kill_sb =	kill_litter_super, | 
|  | 45 | }; | 
|  | 46 |  | 
|  | 47 | static int __init xenfs_init(void) | 
|  | 48 | { | 
|  | 49 | if (xen_pv_domain()) | 
|  | 50 | return register_filesystem(&xenfs_type); | 
|  | 51 |  | 
|  | 52 | printk(KERN_INFO "XENFS: not registering filesystem on non-xen platform\n"); | 
|  | 53 | return 0; | 
|  | 54 | } | 
|  | 55 |  | 
|  | 56 | static void __exit xenfs_exit(void) | 
|  | 57 | { | 
|  | 58 | if (xen_pv_domain()) | 
|  | 59 | unregister_filesystem(&xenfs_type); | 
|  | 60 | } | 
|  | 61 |  | 
|  | 62 | module_init(xenfs_init); | 
|  | 63 | module_exit(xenfs_exit); | 
|  | 64 |  |