2 * OBDFS Super operations
4 * Copryright (C) 1996 Peter J. Braam <braam@stelias.com>
9 #include <linux/config.h>
10 #include <linux/module.h>
11 #include <linux/kernel.h>
13 #include <linux/string.h>
14 #include <linux/stat.h>
15 #include <linux/errno.h>
16 #include <linux/locks.h>
17 #include <linux/unistd.h>
19 #include <asm/system.h>
20 #include <asm/uaccess.h>
23 #include <linux/stat.h>
24 #include <asm/uaccess.h>
25 #include <linux/vmalloc.h>
26 #include <asm/segment.h>
28 #include <../obd/linux/sim_obd.h>
31 /* VFS super_block ops */
32 static struct super_block *obdfs_read_super(struct super_block *, void *, int);
33 static void obdfs_read_inode(struct inode *);
34 static int obdfs_notify_change(struct dentry *dentry, struct iattr *attr);
35 static void obdfs_write_inode(struct inode *);
36 static void obdfs_delete_inode(struct inode *);
37 static void obdfs_put_super(struct super_block *);
38 static int obdfs_statfs(struct super_block *sb, struct statfs *buf,
41 /* exported operations */
42 struct super_operations obdfs_super_operations =
44 obdfs_read_inode, /* read_inode */
45 obdfs_write_inode, /* write_inode */
47 obdfs_delete_inode, /* delete_inode */
48 obdfs_notify_change, /* notify_change */
49 obdfs_put_super, /* put_super */
50 NULL, /* write_super */
51 obdfs_statfs, /* statfs */
55 struct obdfs_sb_info obdfs_super_info;
59 static struct super_block * obdfs_read_super(struct super_block *sb,
60 void *data, int silent)
62 struct inode *root = 0;
63 struct obdfs_sb_info *sbi = NULL;
69 sbi = &obdfs_super_info;
71 if ( sbi->osi_super ) {
72 printk("Already mounted\n");
77 error = obd_connect(obd_minor, &sbi->osi_conn_info);
79 printk("OBDFS: cannot connect to 0x%x.\n", obd_minor);
85 sb->u.generic_sbp = sbi;
86 sb->s_blocksize = sbi->osi_conn_info.conn_blocksize;
87 sb->s_blocksize_bits = sbi->osi_conn_info.conn_blocksize_bits;
88 sb->s_magic = OBDFS_SUPER_MAGIC;
89 sb->s_op = &obdfs_super_operations;
92 root = iget(sb, sbi->osi_conn_info.conn_ino);
93 if (!root || is_bad_inode(root)) {
94 printk("OBDFS: bad iget for root\n");
101 printk("obdfs_read_super: rootinode is %ld dev %d\n",
102 root->i_ino, root->i_dev);
103 sb->s_root = d_alloc_root(root, NULL);
112 sbi->osi_super = NULL;
121 static void obdfs_put_super(struct super_block *sb)
123 struct obdfs_sb_info *sbi;
130 /* XXX flush stuff */
131 sbi = sb->u.generic_sbp;
132 sb->u.generic_sbp = NULL;
133 obd_disconnect(sbi->osi_conn_info.conn_id);
134 sbi->osi_super = NULL;
137 printk("OBDFS: Bye bye.\n");
138 memset(sbi, 0, sizeof(* sbi));
144 /* all filling in of inodes postponed until lookup */
145 static void obdfs_read_inode(struct inode *inode)
149 struct obdfs_sb_info *sbi = inode->i_sb->u.generic_sbp;
152 error = obd_getattr(sbi->osi_conn_info.conn_id, inode->i_ino, &attr);
154 printk("obdfs_read_inode: ibd_getattr fails (%d)\n", error);
158 inode_setattr(inode, &attr);
163 static void inode_to_iattr(struct inode *inode, struct iattr *tmp)
165 tmp->ia_mode = inode->i_mode;
166 tmp->ia_uid = inode->i_uid;
167 tmp->ia_gid = inode->i_gid;
168 tmp->ia_size = inode->i_size;
169 tmp->ia_atime = inode->i_atime;
170 tmp->ia_mtime = inode->i_mtime;
171 tmp->ia_ctime = inode->i_ctime;
172 tmp->ia_attr_flags = inode->i_flags;
177 static void obdfs_write_inode(struct inode *inode)
179 struct obdfs_sb_info *sbi;
184 inode_to_iattr(inode, &attr);
185 sbi = inode->i_sb->u.generic_sbp;
186 error = obd_setattr(sbi->osi_conn_info.conn_id, inode->i_ino, &attr);
188 printk("obdfs_write_inode: ibd_setattr fails (%d)\n", error);
195 static void obdfs_delete_inode(struct inode *inode)
197 struct obdfs_sb_info *sbi;
201 sbi = inode->i_sb->u.generic_sbp;
202 error = obd_destroy(sbi->osi_conn_info.conn_id , inode->i_ino);
204 printk("obdfs_delete_node: ibd_destroy fails (%d)\n", error);
211 static int obdfs_notify_change(struct dentry *de, struct iattr *iattr)
213 struct inode *inode = de->d_inode;
214 struct obdfs_sb_info * sbi;
219 sbi = inode->i_sb->u.generic_sbp;
220 error = obd_setattr(sbi->osi_conn_info.conn_id, inode->i_ino, iattr);
222 printk("obdfs_notify_change: obd_setattr fails (%d)\n", error);
225 inode_setattr(inode, iattr);
232 static int obdfs_statfs(struct super_block *sb, struct statfs *buf,
236 struct obdfs_sb_info * sbi;
241 sbi = sb->u.generic_sbp;
242 error = obd_statfs(sbi->osi_conn_info.conn_id, &tmp);
244 printk("obdfs_notify_change: obd_statfs fails (%d)\n", error);
247 copy_to_user(buf, &tmp, (bufsize<sizeof(tmp)) ? bufsize : sizeof(tmp));
254 struct file_system_type obdfs_fs_type = {
255 "obdfs", 0, obdfs_read_super, NULL
260 printk(KERN_INFO "OBDFS v0.1, braam@stelias.com\n");
263 return register_filesystem(&obdfs_fs_type);
268 int init_module(void)
273 void cleanup_module(void)
277 obdfs_sysctl_clean();
278 unregister_filesystem(&obdfs_fs_type);
280 void obdfs_psdev_dec_use_count(void)
285 EXPORT_SYMBOL(obdfs_psdev_dec_use_count);