X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fobdfs%2Fsuper.c;h=7524d53a9bd9e1ec710a46025ba35698aa6a1ab1;hb=17eaf7c18899a5fc9027b57d84240cbd2349a6db;hp=f7b21a15100c239a5a667ae137e5b0b21020db7e;hpb=8ed4467ccecb3f030f6c69a3e821547c9e1f6712;p=fs%2Flustre-release.git diff --git a/lustre/obdfs/super.c b/lustre/obdfs/super.c index f7b21a1..7524d53 100644 --- a/lustre/obdfs/super.c +++ b/lustre/obdfs/super.c @@ -2,6 +2,9 @@ * OBDFS Super operations * * Copryright (C) 1996 Peter J. Braam + * Copryright (C) 1999 Stelias Computing Inc. + * Copryright (C) 1999 Seagate Technology Inc. + * */ #define EXPORT_SYMTAB @@ -25,18 +28,13 @@ #include #include -#include <../obd/linux/sim_obd.h> -#include - -/* DEBUGGING! */ -#undef MOD_INC_USE_COUNT -#define MOD_INC_USE_COUNT -#undef MOD_DEC_USE_COUNT -#define MOD_DEC_USE_COUNT +#include +#include +#include /* XXX for development/debugging only */ +#include /* VFS super_block ops */ static struct super_block *obdfs_read_super(struct super_block *, void *, int); -static void obdfs_read_inode(struct inode *); static int obdfs_notify_change(struct dentry *dentry, struct iattr *attr); static void obdfs_write_inode(struct inode *); static void obdfs_delete_inode(struct inode *); @@ -67,7 +65,13 @@ static struct super_block * obdfs_read_super(struct super_block *sb, { struct inode *root = 0; struct obdfs_sb_info *sbi = NULL; + struct obd_device *obddev; int error = 0; + unsigned long blocksize; + unsigned long blocksize_bits; + unsigned long root_ino; + int scratch; + ENTRY; MOD_INC_USE_COUNT; @@ -79,23 +83,63 @@ static struct super_block * obdfs_read_super(struct super_block *sb, MOD_DEC_USE_COUNT; return NULL; } + + obddev = &obd_dev[obd_minor]; - error = obd_connect(obd_minor, &sbi->osi_conn_info); + if ( ! (obddev->obd_flags & OBD_ATTACHED) || + ! (obddev->obd_flags & OBD_SET_UP) ) + return NULL; + + sbi->osi_obd = obddev; + sbi->osi_ops = sbi->osi_obd->obd_type->typ_ops; + + error = sbi->osi_ops->o_connect(sbi->osi_obd, &sbi->osi_conn_info); if ( error ) { printk("OBDFS: cannot connect to 0x%x.\n", obd_minor); goto error; } + sbi->osi_super = sb; + error = sbi->osi_ops->o_get_info(sbi->osi_conn_info.conn_id, + strlen("blocksize"), + "blocksize", + &scratch, (void *)&blocksize); + if ( error ) { + printk("Getinfo call to drive failed (blocksize)\n"); + goto error; + } + + error = sbi->osi_ops->o_get_info(sbi->osi_conn_info.conn_id, + strlen("blocksize_bits"), + "blocksize_bits", + &scratch, (void *)&blocksize_bits); + if ( error ) { + printk("Getinfo call to drive failed (blocksize_bits)\n"); + goto error; + } + + error = sbi->osi_ops->o_get_info(sbi->osi_conn_info.conn_id, + strlen("root_ino"), + "root_ino", + &scratch, (void *)&root_ino); + if ( error ) { + printk("Getinfo call to drive failed (root_ino)\n"); + goto error; + } + + + lock_super(sb); sb->u.generic_sbp = sbi; - sb->s_blocksize = sbi->osi_conn_info.conn_blocksize; - sb->s_blocksize_bits = sbi->osi_conn_info.conn_blocksize_bits; + + sb->s_blocksize = blocksize; + sb->s_blocksize_bits = (unsigned char)blocksize_bits; sb->s_magic = OBDFS_SUPER_MAGIC; sb->s_op = &obdfs_super_operations; /* make root inode */ - root = iget(sb, sbi->osi_conn_info.conn_ino); + root = iget(sb, root_ino); if (!root || is_bad_inode(root)) { printk("OBDFS: bad iget for root\n"); sb->s_dev = 0; @@ -103,10 +147,12 @@ static struct super_block * obdfs_read_super(struct super_block *sb, unlock_super(sb); goto error; } + - printk("obdfs_read_super: rootinode is %ld dev %d\n", - root->i_ino, root->i_dev); - sb->s_root = d_alloc_root(root, NULL); + printk("obdfs_read_super: sbdev %d, rootinode is %ld dev %d, blocksize %ld, " + "blocksize bits %ld\n", + sb->s_dev, root->i_ino, root->i_dev, blocksize, blocksize_bits); + sb->s_root = d_alloc_root(root); unlock_super(sb); EXIT; return sb; @@ -136,7 +182,7 @@ static void obdfs_put_super(struct super_block *sb) /* XXX flush stuff */ sbi = sb->u.generic_sbp; sb->u.generic_sbp = NULL; - obd_disconnect(sbi->osi_conn_info.conn_id); + sbi->osi_ops->o_disconnect(sbi->osi_conn_info.conn_id); sbi->osi_super = NULL; @@ -147,51 +193,37 @@ static void obdfs_put_super(struct super_block *sb) EXIT; } +extern struct inode_operations obdfs_inode_ops; + /* all filling in of inodes postponed until lookup */ -static void obdfs_read_inode(struct inode *inode) +void obdfs_read_inode(struct inode *inode) { - struct iattr attr; int error; struct obdfs_sb_info *sbi = inode->i_sb->u.generic_sbp; ENTRY; - error = obd_getattr(sbi->osi_conn_info.conn_id, inode->i_ino, &attr); + error = sbi->osi_ops->o_getattr(sbi->osi_conn_info.conn_id, + inode->i_ino, inode); if (error) { - printk("obdfs_read_inode: ibd_getattr fails (%d)\n", error); + printk("obdfs_read_inode: obd_getattr fails (%d)\n", error); return; } - inode_setattr(inode, &attr); - inode->i_op = NULL; + IDEBUG(inode); + inode->i_op = &obdfs_inode_ops; return; } -static void inode_to_iattr(struct inode *inode, struct iattr *tmp) -{ - tmp->ia_mode = inode->i_mode; - tmp->ia_uid = inode->i_uid; - tmp->ia_gid = inode->i_gid; - tmp->ia_size = inode->i_size; - tmp->ia_atime = inode->i_atime; - tmp->ia_mtime = inode->i_mtime; - tmp->ia_ctime = inode->i_ctime; - tmp->ia_attr_flags = inode->i_flags; - - tmp->ia_valid = ~0; -} - static void obdfs_write_inode(struct inode *inode) { struct obdfs_sb_info *sbi; - struct iattr attr; int error; - ENTRY; - inode_to_iattr(inode, &attr); sbi = inode->i_sb->u.generic_sbp; - error = obd_setattr(sbi->osi_conn_info.conn_id, inode->i_ino, &attr); + error = sbi->osi_ops->o_setattr(sbi->osi_conn_info.conn_id, + inode->i_ino, inode); if (error) { - printk("obdfs_write_inode: ibd_setattr fails (%d)\n", error); + printk("obdfs_write_inode: obd_setattr fails (%d)\n", error); return; } @@ -205,7 +237,8 @@ static void obdfs_delete_inode(struct inode *inode) ENTRY; sbi = inode->i_sb->u.generic_sbp; - error = obd_destroy(sbi->osi_conn_info.conn_id , inode->i_ino); + error = sbi->osi_ops->o_destroy(sbi->osi_conn_info.conn_id, + inode->i_ino); if (error) { printk("obdfs_delete_node: ibd_destroy fails (%d)\n", error); return; @@ -217,18 +250,21 @@ static void obdfs_delete_inode(struct inode *inode) static int obdfs_notify_change(struct dentry *de, struct iattr *iattr) { struct inode *inode = de->d_inode; + struct iattr saved_copy; struct obdfs_sb_info * sbi; int error; ENTRY; + inode_to_iattr(inode, &saved_copy); sbi = inode->i_sb->u.generic_sbp; - error = obd_setattr(sbi->osi_conn_info.conn_id, inode->i_ino, iattr); + inode_setattr(inode, iattr); + error = sbi->osi_ops->o_setattr(sbi->osi_conn_info.conn_id, + inode->i_ino, inode); if ( error ) { + inode_setattr(inode, &saved_copy); printk("obdfs_notify_change: obd_setattr fails (%d)\n", error); return error; - } else { - inode_setattr(inode, iattr); } EXIT; return error; @@ -245,7 +281,7 @@ static int obdfs_statfs(struct super_block *sb, struct statfs *buf, ENTRY; sbi = sb->u.generic_sbp; - error = obd_statfs(sbi->osi_conn_info.conn_id, &tmp); + error = sbi->osi_ops->o_statfs(sbi->osi_conn_info.conn_id, &tmp); if ( error ) { printk("obdfs_notify_change: obd_statfs fails (%d)\n", error); return error; @@ -266,6 +302,10 @@ int init_obdfs(void) printk(KERN_INFO "OBDFS v0.1, braam@stelias.com\n"); obdfs_sysctl_init(); + + obd_sbi = &obdfs_super_info; + obd_fso = &obdfs_file_ops; + return register_filesystem(&obdfs_fs_type); } @@ -281,6 +321,7 @@ void cleanup_module(void) ENTRY; obdfs_sysctl_clean(); + unregister_filesystem(&obdfs_fs_type); } void obdfs_psdev_dec_use_count(void) {