From 851d24d58eea7e9664546a8be8dd41959e4aa353 Mon Sep 17 00:00:00 2001 From: braam Date: Tue, 2 Nov 1999 19:12:28 +0000 Subject: [PATCH] Cleanup : no more "sim" now "ext2" can mount multiple devices obdcontrol improved more work on snap (doesn't compile yet) check in just before we are again overhauling the interface. --- lustre/include/linux/obd_class.h | 2 +- lustre/include/linux/obd_sim.h | 6 +- lustre/include/linux/obd_snap.h | 4 +- lustre/include/linux/obd_support.h | 10 +-- lustre/include/linux/obdfs.h | 25 +++++- lustre/obdclass/class_obd.c | 8 +- lustre/obdclass/cleanup.sh | 2 +- lustre/obdclass/genops.c | 2 +- lustre/obdclass/obdcontrol | 55 +++++++++---- lustre/obdclass/setup.sh | 4 +- lustre/obdfs/namei.c | 56 ++++--------- lustre/obdfs/rw.c | 27 ++---- lustre/obdfs/super.c | 165 ++++++++++++++++++++++++++----------- lustre/scripts/maketags.sh | 3 + 14 files changed, 223 insertions(+), 146 deletions(-) create mode 100755 lustre/scripts/maketags.sh diff --git a/lustre/include/linux/obd_class.h b/lustre/include/linux/obd_class.h index 3115054..c779efa 100644 --- a/lustre/include/linux/obd_class.h +++ b/lustre/include/linux/obd_class.h @@ -40,7 +40,7 @@ struct obd_device { unsigned long obd_gen_prealloc_quota; struct list_head obd_gen_clients; union { - struct sim_obd sim; + struct ext2_obd ext2; struct raid1_obd raid1; struct snap_obd snap; struct rpc_obd rpc; diff --git a/lustre/include/linux/obd_sim.h b/lustre/include/linux/obd_sim.h index b973e0b..6943898 100644 --- a/lustre/include/linux/obd_sim.h +++ b/lustre/include/linux/obd_sim.h @@ -1,8 +1,8 @@ #ifndef _OBD_SIM #define _OBD_SIM -struct sim_obd { - struct super_block * sim_sb; +struct ext2_obd { + struct super_block * ext2_sb; }; @@ -11,7 +11,7 @@ extern struct obdfs_sb_info *obd_sbi; extern struct file_operations *obd_fso; /* obd_sim.c */ -extern struct obd_ops sim_obd_ops; +extern struct obd_ops ext2_obd_ops; inline long ext2_block_map (struct inode * inode, long block); /* balloc.c */ diff --git a/lustre/include/linux/obd_snap.h b/lustre/include/linux/obd_snap.h index e2a0352..ddb2d8c 100644 --- a/lustre/include/linux/obd_snap.h +++ b/lustre/include/linux/obd_snap.h @@ -6,8 +6,8 @@ #define SNAP_MAX 8 /* must fit in "u" area of struct inode */ struct snap_obd_data { int snap_dev; /* which device contains the data */ - unsigned int snap_no; /* which snapshot are we accessing */ - unsigned int snap_count; /* how many snapshots exist */ + unsigned int snap_no; /* which snapshot are we accessing */ + unsigned int snap_count; /* how many snapshots exist */ time_t snap_times[SNAP_MAX]; }; diff --git a/lustre/include/linux/obd_support.h b/lustre/include/linux/obd_support.h index db2081a..01d69f7 100644 --- a/lustre/include/linux/obd_support.h +++ b/lustre/include/linux/obd_support.h @@ -4,7 +4,7 @@ #include #include -#define SIM_OBD_DEBUG +#define EXT2_OBD_DEBUG #define MIN(a,b) (((a)<(b)) ? (a): (b)) @@ -20,7 +20,7 @@ extern int obd_print_entry; /* debugging masks */ #define D_PSDEV 1 /* debug information from psdev.c */ #define D_INODE 2 -#define D_UNUSED2 4 +#define D_SUPER 4 #define D_UNUSED3 8 #define D_UNUSED4 16 #define D_WARNING 32 /* misc warnings */ @@ -32,7 +32,7 @@ extern int obd_print_entry; #define D_BLOCKS 2048 /* ext2 block allocation */ #define D_RPC 4096 /* ext2 block allocation */ -#ifdef SIM_OBD_DEBUG +#ifdef EXT2_OBD_DEBUG #define CDEBUG(mask, format, a...) \ do { \ if (obd_debug_level & mask) { \ @@ -48,13 +48,13 @@ extern int obd_print_entry; if (obd_print_entry) \ printk("Process %d leaving %s [%d]\n", current->pid, __FUNCTION__, __LINE__) -#else /* SIM_OBD_DEBUG */ +#else /* EXT2_OBD_DEBUG */ # define CDEBUG ; # define ENTRY ; # define EXIT ; -#endif /* SIM_OBD_DEBUG */ +#endif /* EXT2_OBD_DEBUG */ #define CMD(cmd) (( cmd == READ ) ? "read" : "write") diff --git a/lustre/include/linux/obdfs.h b/lustre/include/linux/obdfs.h index 3af1251..67b229d 100644 --- a/lustre/include/linux/obdfs.h +++ b/lustre/include/linux/obdfs.h @@ -47,7 +47,9 @@ struct obdfs_sb_info { struct obd_conn_info osi_conn_info; struct super_block *osi_super; struct obd_device *osi_obd; - struct obd_ops *osi_ops; + struct obd_ops *osi_ops; + ino_t osi_rootino; /* which root inode */ + int osi_minor; /* minor of /dev/obdX */ }; void obdfs_sysctl_init(void); @@ -60,13 +62,32 @@ extern struct inode_operations obdfs_inode_ops; static inline struct obd_ops *iops(struct inode *i) { - struct obdfs_sb_info *sbi = (struct obdfs_sb_info *) i->i_sb->u.generic_sbp; + struct obdfs_sb_info *sbi = (struct obdfs_sb_info *) &i->i_sb->u.generic_sbp; return sbi->osi_ops; } +static inline int iid(struct inode *i) +{ + struct obdfs_sb_info *sbi = (struct obdfs_sb_info *) &i->i_sb->u.generic_sbp; + return sbi->osi_conn_info.conn_id; +} + #define NOLOCK 0 #define LOCKED 1 +#ifdef OPS +#warning "*** WARNING redefining OPS" +#else +#define OPS(sb,op) ((struct obdfs_sb_info *)(& ## sb ## ->u.generic_sbp))->osi_ops->o_ ## op +#define IOPS(inode,op) ((struct obdfs_sb_info *)(& ## inode->i_sb ## ->u.generic_sbp))->osi_ops->o_ ## op +#endif + +#ifdef ID +#warning "*** WARNING redefining ID" +#else +#define ID(sb) (((struct obdfs_sb_info *)( & ## sb ## ->u.generic_sbp))->osi_conn_info.conn_id) +#define IID(inode) (((struct obdfs_sb_info *)( & ## inode->i_sb ## ->u.generic_sbp))->osi_conn_info.conn_id) +#endif #define OBDFS_SUPER_MAGIC 0x4711 diff --git a/lustre/obdclass/class_obd.c b/lustre/obdclass/class_obd.c index 6973101..95bdef8 100644 --- a/lustre/obdclass/class_obd.c +++ b/lustre/obdclass/class_obd.c @@ -395,11 +395,11 @@ static int obd_class_ioctl (struct inode * inode, struct file * filp, if (!obddev->obd_type) return -ENODEV; - if (!obddev->u.sim.sim_sb || !obddev->u.sim.sim_sb->s_dev) { + if (!obddev->u.ext2.ext2_sb || !obddev->u.ext2.ext2_sb->s_dev) { CDEBUG(D_IOCTL, "fatal: device not initialized.\n"); err = -EINVAL; } else { - if ((err = fsync_dev(obddev->u.sim.sim_sb->s_dev))) + if ((err = fsync_dev(obddev->u.ext2.ext2_sb->s_dev))) CDEBUG(D_IOCTL, "sync: fsync_dev failure\n"); else CDEBUG(D_IOCTL, "sync: success\n"); @@ -420,7 +420,7 @@ static int obd_class_ioctl (struct inode * inode, struct file * filp, return -ENODEV; - if (!obddev->u.sim.sim_sb) { + if (!obddev->u.ext2.ext2_sb) { CDEBUG(D_IOCTL, "fatal: device not initialized.\n"); return put_user(-EINVAL, (int *) arg); } @@ -596,7 +596,7 @@ static int obd_class_ioctl (struct inode * inode, struct file * filp, copy_from_user(&prealloc, (int *)arg, sizeof(struct oic_prealloc_s)); - if (!obddev->u.sim.sim_sb || !obddev->u.sim.sim_sb->s_dev) { + if (!obddev->u.ext2.ext2_sb || !obddev->u.ext2.ext2_sb->s_dev) { CDEBUG(D_IOCTL, "fatal: device not initialized.\n"); return -EINVAL; } diff --git a/lustre/obdclass/cleanup.sh b/lustre/obdclass/cleanup.sh index 70a01dc..462440c 100644 --- a/lustre/obdclass/cleanup.sh +++ b/lustre/obdclass/cleanup.sh @@ -8,6 +8,6 @@ cleanup quit EOF -rmmod obdsim +rmmod obdext2 rmmod obdclass diff --git a/lustre/obdclass/genops.c b/lustre/obdclass/genops.c index 982fc35..fcc0d06 100644 --- a/lustre/obdclass/genops.c +++ b/lustre/obdclass/genops.c @@ -1,5 +1,5 @@ /* - * linux/fs/sim_obd/sim_obd.c + * linux/fs/ext2_obd/sim_obd.c * * These are the only exported functions; they provide the simulated object- * oriented disk. diff --git a/lustre/obdclass/obdcontrol b/lustre/obdclass/obdcontrol index 07458c0..e4497cc 100755 --- a/lustre/obdclass/obdcontrol +++ b/lustre/obdclass/obdcontrol @@ -72,15 +72,9 @@ use Term::ReadLine; use IO::Handle; -my ($device, $filesystem, $file); -# startup options (I'll replace these when I have some to replace with) -GetOptions("f!" => \$file, "device=s" => \$device, "fs=s" => $filesystem) || die "Getoptions"; - -# genuine new simulated OBD device -$device = "/dev/obd0" unless $device; -# object store in the ext2 formatted block device -$filesystem = "/dev/loop0" unless $filesystem; +my ($file); +GetOptions("f!" => \$file, "device=s" => \$::device, "fs=s" => $::filesystem) || die "Getoptions"; # get a console for the app @@ -90,7 +84,9 @@ my $command; my $arg; my %commands = - ('create' => {func => "Create", doc => "create: creates a new inode"}, + ('device' => {func => "Device", doc => "device : open another OBD device"}, + 'filesystem' => {func => "Filesystem", doc => "filesystem : partition for direct OBD device"}, + 'create' => {func => "Create", doc => "create: creates a new inode"}, 'attach' => {func => "Attach", doc => "format type [adapter bus tid lun]"}, 'format' => {func => "Format", doc => "format type adapter bus tid lun size"}, 'partition' => {func => "Partition", doc => "partition type adapter bus tid lun partition size"}, @@ -118,16 +114,13 @@ my %commands = # my @jcm_cmd_list = keys %commands; -#------------------------------------------------------------------------------ -# Open the device, as we need an FD for the ioctl -sysopen(DEV_OBD, $device, 0) || die "Cannot open $device"; +my $term, $attribs; -if (!defined($::st = stat($filesystem))) { - die "Unable to stat $filesystem.\n"; -} -my $term, $attribs; +# Get going.... +Device($::device); +Filesystem($::filesystem); if ( $file ) { while ( ) { print $_; @@ -143,6 +136,7 @@ if ( $file ) { # make sure stdout is not buffered STDOUT->autoflush(1); + # Get on with the show process_line(); } @@ -201,6 +195,31 @@ sub execute_line { return (&{$commands{$cmd}->{func}}(@arg)); } +# set the object store in the ext2 formatted block device +sub Filesystem { + my $filesystem = shift; + $filesystem = "/dev/loop0" unless $filesystem; + + $::filesystem = $filesystem; + if (!defined($::st = stat($filesystem))) { + die "Unable to stat $filesystem.\n"; + } +} + +# select the OBD device we talk to +sub Device { + my $device = shift; + + if (! $device ) { + $device = "/dev/obd0"; + } + $::device = $device; + # Open the device, as we need an FD for the ioctl + sysopen(DEV_OBD, $device, 0) || die "Cannot open $device"; + +} + + sub Attach { my $err = 0; @@ -273,9 +292,9 @@ sub Setup { my $data; my $datalen = 0; - $type = "sim_obd" unless $type; + $type = "ext2_obd" unless $type; - if ( $type eq "sim_obd" ) { + if ( $type eq "ext2_obd" ) { my $dev = shift; $dev = $::st->rdev() unless $dev; $data = pack("i", $dev); diff --git a/lustre/obdclass/setup.sh b/lustre/obdclass/setup.sh index e88faee..24abc26 100755 --- a/lustre/obdclass/setup.sh +++ b/lustre/obdclass/setup.sh @@ -3,10 +3,10 @@ insmod loop losetup /dev/loop0 /tmp/fs insmod obdclass.o -insmod obdsim.o +insmod ../ext2obd/obdext2.o insmod ../obdfs/obdfs.o ./obdcontrol -f << EOF -attach sim_obd +attach ext2_obd setup quit EOF diff --git a/lustre/obdfs/namei.c b/lustre/obdfs/namei.c index 6bb405a..01d5066 100644 --- a/lustre/obdfs/namei.c +++ b/lustre/obdfs/namei.c @@ -455,16 +455,14 @@ int obdfs_create (struct inode * dir, struct dentry * dentry, int mode) struct page *page; struct ext2_dir_entry_2 * de; int err = -EIO; - struct obdfs_sb_info *sbi; ino_t ino; ENTRY; - sbi = dir->i_sb->u.generic_sbp; /* * N.B. Several error exits in ext2_new_inode don't set err. */ - ino = sbi->osi_ops->o_create(sbi->osi_conn_info.conn_id, 0, &err); + ino = iops(dir)->o_create(iid(dir), 0, &err); if ( err ) return err; err = -EIO; @@ -489,8 +487,7 @@ int obdfs_create (struct inode * dir, struct dentry * dentry, int mode) de->inode = cpu_to_le32(inode->i_ino); ext2_set_de_type(dir->i_sb, de, S_IFREG); dir->i_version = ++event; - sbi->osi_ops->o_brw(WRITE, sbi->osi_conn_info.conn_id, - dir, page, 0); + iops(dir)->o_brw(WRITE, iid(dir), dir, page, 0); UnlockPage(page); #if 0 if (IS_SYNC(dir)) { @@ -510,17 +507,15 @@ int obdfs_mknod (struct inode * dir, struct dentry *dentry, int mode, int rdev) struct page *page; struct ext2_dir_entry_2 * de; int err = -EIO; - struct obdfs_sb_info *sbi; ino_t ino; ENTRY; - sbi = dir->i_sb->u.generic_sbp; /* * N.B. Several error exits in ext2_new_inode don't set err. */ - ino = sbi->osi_ops->o_create(sbi->osi_conn_info.conn_id, 0, &err); + ino = iops(dir)->o_create(iid(dir), 0, &err); if ( ino == -1 ) return -1; inode = iget(dir->i_sb, ino); @@ -536,8 +531,7 @@ int obdfs_mknod (struct inode * dir, struct dentry *dentry, int mode, int rdev) dir->i_version = ++event; ext2_set_de_type(dir->i_sb, de, inode->i_mode); mark_inode_dirty(inode); - sbi->osi_ops->o_brw(WRITE, sbi->osi_conn_info.conn_id, - dir, page, 0); + iops(dir)->o_brw(WRITE, iid(dir), dir, page, 0); UnlockPage(page); #if 0 @@ -564,19 +558,17 @@ int obdfs_mkdir(struct inode * dir, struct dentry * dentry, int mode) struct inode * child; struct page *page, *child_page; struct ext2_dir_entry_2 * de; - struct obdfs_sb_info *sbi; int err; ino_t ino; ENTRY; - sbi = dir->i_sb->u.generic_sbp; err = -EMLINK; if (dir->i_nlink >= EXT2_LINK_MAX) goto out; err = -EIO; - ino = iops(dir)->o_create(sbi->osi_conn_info.conn_id, 0, &err); + ino = iops(dir)->o_create(iid(dir), 0, &err); if ( ino == -1 ) return -1; child = iget(dir->i_sb, ino); @@ -611,7 +603,7 @@ int obdfs_mkdir(struct inode * dir, struct dentry * dentry, int mode) strcpy (de->name, ".."); ext2_set_de_type(dir->i_sb, de, S_IFDIR); - iops(dir)->o_brw(WRITE, sbi->osi_conn_info.conn_id, child, child_page, 1); + iops(dir)->o_brw(WRITE, iid(dir), child, child_page, 1); UnlockPage(child_page); page_cache_release(child_page); @@ -640,7 +632,7 @@ int obdfs_mkdir(struct inode * dir, struct dentry * dentry, int mode) dir->i_nlink++; dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL; mark_inode_dirty(dir); - iops(dir)->o_brw(WRITE, sbi->osi_conn_info.conn_id, dir, page, 1); + iops(dir)->o_brw(WRITE, iid(dir), dir, page, 1); UnlockPage(page); page_cache_release(page); d_instantiate(dentry, child); @@ -731,10 +723,8 @@ int obdfs_rmdir (struct inode * dir, struct dentry *dentry) struct inode * inode; struct page *page; struct ext2_dir_entry_2 * de; - struct obdfs_sb_info *sbi; ENTRY; - sbi = dir->i_sb->u.generic_sbp; retval = -ENOENT; page = obdfs_find_entry (dir, dentry->d_name.name, dentry->d_name.len, &de, LOCKED); @@ -756,7 +746,7 @@ int obdfs_rmdir (struct inode * dir, struct dentry *dentry) dir->i_version = ++event; if (retval) goto end_rmdir; - sbi->osi_ops->o_brw(WRITE, sbi->osi_conn_info.conn_id, dir, page, 0); + iops(dir)->o_brw(WRITE, iid(dir), dir, page, 0); UnlockPage(page); #if 0 if (IS_SYNC(dir)) { @@ -791,10 +781,8 @@ int obdfs_unlink(struct inode * dir, struct dentry *dentry) struct inode * inode; struct page *page; struct ext2_dir_entry_2 * de; - struct obdfs_sb_info *sbi; ENTRY; - sbi = dir->i_sb->u.generic_sbp; retval = -ENOENT; page = obdfs_find_entry (dir, dentry->d_name.name, dentry->d_name.len, &de, LOCKED); @@ -818,7 +806,7 @@ int obdfs_unlink(struct inode * dir, struct dentry *dentry) if (retval) goto end_unlink; dir->i_version = ++event; - sbi->osi_ops->o_brw(WRITE, sbi->osi_conn_info.conn_id, dir, page, 0); + iops(dir)->o_brw(WRITE, iid(dir), dir, page, 0); UnlockPage(page); #if 0 if (IS_SYNC(dir)) { @@ -850,16 +838,14 @@ int obdfs_symlink (struct inode * dir, struct dentry *dentry, const char * symna char * link; int i, l, err = -EIO; char c; - struct obdfs_sb_info *sbi; ino_t ino; ENTRY; - sbi = dir->i_sb->u.generic_sbp; /* * N.B. Several error exits in ext2_new_inode don't set err. */ - ino = sbi->osi_ops->o_create(sbi->osi_conn_info.conn_id, 0, &err); + ino = iops(dir)->o_create(iid(dir), 0, &err); if ( ino == -1 ) return -1; inode = iget(dir->i_sb, ino); @@ -894,8 +880,7 @@ int obdfs_symlink (struct inode * dir, struct dentry *dentry, const char * symna link[i++] = c; link[i] = 0; if (name_page) { - sbi->osi_ops->o_brw(WRITE, sbi->osi_conn_info.conn_id, - inode, name_page, 1); + iops(inode)->o_brw(WRITE, iid(inode), inode, name_page, 1); PDEBUG(name_page, "symlink"); UnlockPage(name_page); page_cache_release(name_page); @@ -909,8 +894,7 @@ int obdfs_symlink (struct inode * dir, struct dentry *dentry, const char * symna de->inode = cpu_to_le32(inode->i_ino); ext2_set_de_type(dir->i_sb, de, S_IFLNK); dir->i_version = ++event; - sbi->osi_ops->o_brw(WRITE, sbi->osi_conn_info.conn_id, - dir, page, 1); + iops(dir)->o_brw(WRITE, iid(dir), dir, page, 1); UnlockPage(page); #if 0 if (IS_SYNC(dir)) { @@ -937,10 +921,8 @@ int obdfs_link (struct dentry * old_dentry, struct ext2_dir_entry_2 * de; struct page *page; int err; - struct obdfs_sb_info *sbi; ENTRY; - sbi = dir->i_sb->u.generic_sbp; if (S_ISDIR(inode->i_mode)) return -EPERM; @@ -955,8 +937,7 @@ int obdfs_link (struct dentry * old_dentry, de->inode = cpu_to_le32(inode->i_ino); ext2_set_de_type(dir->i_sb, de, inode->i_mode); dir->i_version = ++event; - sbi->osi_ops->o_brw(WRITE, sbi->osi_conn_info.conn_id, - dir, page, 0); + iops(dir)->o_brw(WRITE, iid(dir), dir, page, 0); UnlockPage(page); #if 0 @@ -989,10 +970,8 @@ int obdfs_rename (struct inode * old_dir, struct dentry *old_dentry, struct page * old_page, * new_page, * dir_page; struct ext2_dir_entry_2 * old_de, * new_de; int retval; - struct obdfs_sb_info *sbi; ENTRY; - sbi = old_dir->i_sb->u.generic_sbp; new_page = dir_page = NULL; @@ -1076,8 +1055,7 @@ int obdfs_rename (struct inode * old_dir, struct dentry *old_dentry, mark_inode_dirty(old_dir); if (dir_page) { PARENT_INO(page_address(dir_page)) = le32_to_cpu(new_dir->i_ino); - sbi->osi_ops->o_brw(WRITE, sbi->osi_conn_info.conn_id, - old_inode, dir_page, 0); + iops(old_inode)->o_brw(WRITE, iid(old_inode), old_inode, dir_page, 0); old_dir->i_nlink--; mark_inode_dirty(old_dir); if (new_inode) { @@ -1096,8 +1074,7 @@ int obdfs_rename (struct inode * old_dir, struct dentry *old_dentry, page_cache_release(old_page); old_page = obdfs_getpage(old_dir, offset, 0, LOCKED); CDEBUG(D_INODE, "old_page at %p\n", old_page); - sbi->osi_ops->o_brw(WRITE, sbi->osi_conn_info.conn_id, - old_dir, old_page, 0); + iops(old_dir)->o_brw(WRITE, iid(old_dir), old_dir, old_page,0); } #if 0 if (IS_SYNC(old_dir)) { @@ -1105,8 +1082,7 @@ int obdfs_rename (struct inode * old_dir, struct dentry *old_dentry, wait_on_buffer (old_bh); } #endif - sbi->osi_ops->o_brw(WRITE, sbi->osi_conn_info.conn_id, - new_dir, new_page, 0); + iops(new_dir)->o_brw(WRITE, iid(new_dir), new_dir, new_page, 0); #if 0 if (IS_SYNC(new_dir)) { ll_rw_block (WRITE, 1, &new_bh); diff --git a/lustre/obdfs/rw.c b/lustre/obdfs/rw.c index 1e2b2a2..1957c44 100644 --- a/lustre/obdfs/rw.c +++ b/lustre/obdfs/rw.c @@ -39,17 +39,14 @@ int console_loglevel; /* returns the page unlocked, but with a reference */ int obdfs_readpage(struct file *file, struct page *page) { - struct obdfs_sb_info *sbi; - struct super_block *sb = file->f_dentry->d_inode->i_sb; + struct inode *inode = file->f_dentry->d_inode; int rc; ENTRY; /* XXX flush stuff */ - sbi = sb->u.generic_sbp; PDEBUG(page, "READ"); - rc = sbi->osi_ops->o_brw(READ, sbi->osi_conn_info.conn_id, - file->f_dentry->d_inode, page, 0); + rc = iops(inode)->o_brw(READ, iid(inode),inode, page, 0); if (rc == PAGE_SIZE ) { SetPageUptodate(page); UnlockPage(page); @@ -73,14 +70,11 @@ int obdfs_readpage(struct file *file, struct page *page) int obdfs_write_one_page(struct file *file, struct page *page, unsigned long offset, unsigned long bytes, const char * buf) { long status; - struct obdfs_sb_info *sbi = file->f_dentry->d_inode->i_sb->u.generic_sbp; + struct inode *inode = file->f_dentry->d_inode; ENTRY; if ( !Page_Uptodate(page) ) { - status = sbi->osi_ops->o_brw(READ, - sbi->osi_conn_info.conn_id, - file->f_dentry->d_inode, - page, 1); + status = iops(inode)->o_brw(READ, iid(inode), inode, page, 1); if (status == PAGE_SIZE ) { SetPageUptodate(page); } else { @@ -109,15 +103,14 @@ int obdfs_write_one_page(struct file *file, struct page *page, unsigned long off /* returns the page unlocked, but with a reference */ int obdfs_writepage(struct file *file, struct page *page) { - struct obdfs_sb_info *sbi = file->f_dentry->d_inode->i_sb->u.generic_sbp; + struct inode *inode = file->f_dentry->d_inode; int rc; ENTRY; PDEBUG(page, "WRITEPAGE"); /* XXX flush stuff */ - rc = sbi->osi_ops->o_brw(WRITE, sbi->osi_conn_info.conn_id, - file->f_dentry->d_inode, page, 1); + rc = iops(inode)->o_brw(WRITE, iid(inode), inode, page, 1); SetPageUptodate(page); PDEBUG(page,"WRITEPAGE"); @@ -146,14 +139,11 @@ struct page *obdfs_getpage(struct inode *inode, unsigned long offset, int create struct page *page_cache; struct page ** hash; struct page * page; - struct obdfs_sb_info *sbi; - struct super_block *sb = inode->i_sb; int rc; ENTRY; offset = offset & PAGE_CACHE_MASK; - sbi = sb->u.generic_sbp; CDEBUG(D_INODE, "\n"); page = NULL; @@ -202,8 +192,7 @@ struct page *obdfs_getpage(struct inode *inode, unsigned long offset, int create - rc = sbi->osi_ops->o_brw(READ, sbi->osi_conn_info.conn_id, - inode, page, create); + rc = iops(inode)->o_brw(READ, iid(inode), inode, page, create); if ( rc != PAGE_SIZE ) { SetPageError(page); UnlockPage(page); @@ -222,7 +211,7 @@ struct page *obdfs_getpage(struct inode *inode, unsigned long offset, int create struct file_operations obdfs_file_ops = { NULL, /* lseek - default */ generic_file_read, /* read */ - obdfs_file_write, /* write - bad */ + obdfs_file_write, /* write - bad */ obdfs_readdir, /* readdir */ NULL, /* poll - default */ NULL, /* ioctl */ diff --git a/lustre/obdfs/super.c b/lustre/obdfs/super.c index 7524d53..96b82fc 100644 --- a/lustre/obdfs/super.c +++ b/lustre/obdfs/super.c @@ -30,7 +30,6 @@ #include #include -#include /* XXX for development/debugging only */ #include /* VFS super_block ops */ @@ -56,17 +55,87 @@ struct super_operations obdfs_super_operations = NULL /* remount_fs */ }; -struct obdfs_sb_info obdfs_super_info; -int obd_minor = 0; -int obd_root_ino = 2; +static char *obdfs_read_opt(const char *opt, char *data) +{ + char *value; + char *retval; + + CDEBUG(D_SUPER, "option: %s, data %s\n", opt, data); + if ( strncmp(opt, data, strlen(opt)) ) + return NULL; + + if ( (value = strchr(data, '=')) == NULL ) + return NULL; + + value++; + OBD_ALLOC(retval, char *, strlen(value) + 1); + if ( !retval ) { + printk("OBDFS: Out of memory!\n"); + return NULL; + } + + memcpy(retval, value, strlen(value)+1); + CDEBUG(D_SUPER, "Assigned option: %s, value %s\n", opt, retval); + return retval; +} + +void obdfs_options(char *options, char **dev, char **vers) +{ + char *this_char; + + if (!options) + goto out; + + for (this_char = strtok (options, ","); + this_char != NULL; + this_char = strtok (NULL, ",")) { + CDEBUG(D_SUPER, "this_char %s\n", this_char); + if ( (!*dev && (*dev = obdfs_read_opt("device", this_char))) || + (!*vers && (*vers = obdfs_read_opt("version", this_char))) ) + continue; + + } + + out: + if (!*dev) { + *dev = "/dev/obd0"; + } +} + +static int obdfs_getdev(char *devpath, int *dev) +{ + struct dentry *dentry; + kdev_t devno; + + dentry = lookup_dentry(devpath, NULL, 0); + if (IS_ERR(dentry)) + return PTR_ERR(dentry); + + if (!S_ISCHR(dentry->d_inode->i_mode)) + return -ENODEV; + + devno = dentry->d_inode->i_rdev; + if ( MAJOR(devno) != OBD_PSDEV_MAJOR ) + return -ENODEV; + + if ( MINOR(devno) >= MAX_OBD_DEVICES ) + return -ENODEV; + + *dev = devno; + return 0; +} static struct super_block * obdfs_read_super(struct super_block *sb, void *data, int silent) { struct inode *root = 0; - struct obdfs_sb_info *sbi = NULL; + struct obdfs_sb_info *sbi = (struct obdfs_sb_info *)(&sb->u.generic_sbp); struct obd_device *obddev; int error = 0; + char *device = NULL; + char *version = NULL; + int devno; + int err; unsigned long blocksize; unsigned long blocksize_bits; unsigned long root_ino; @@ -75,30 +144,53 @@ static struct super_block * obdfs_read_super(struct super_block *sb, ENTRY; MOD_INC_USE_COUNT; + + memset(sbi, 0, sizeof(*sbi)); + + obdfs_options(data, &device, &version); + if ( !device ) { + printk("No device\n"); + MOD_DEC_USE_COUNT; + return NULL; + } - sbi = &obdfs_super_info; + if ( (err = obdfs_getdev(device, &devno)) ) { + printk("Cannot get devno of %s, error %d\n", device, err); + MOD_DEC_USE_COUNT; + return NULL; + } - if ( sbi->osi_super ) { - printk("Already mounted\n"); + if ( MAJOR(devno) != OBD_PSDEV_MAJOR ) { + printk("Wrong major number!\n"); MOD_DEC_USE_COUNT; return NULL; } - - obddev = &obd_dev[obd_minor]; + + if ( MINOR(devno) >= MAX_OBD_DEVICES ) { + printk("Minor of %s too high (%d)\n", device, MINOR(devno)); + MOD_DEC_USE_COUNT; + return NULL; + } + + obddev = &obd_dev[MINOR(devno)]; if ( ! (obddev->obd_flags & OBD_ATTACHED) || - ! (obddev->obd_flags & OBD_SET_UP) ) + ! (obddev->obd_flags & OBD_SET_UP) ){ + MOD_DEC_USE_COUNT; 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); + printk("OBDFS: cannot connect to %s\n", device); goto error; } + + sbi->osi_super = sb; error = sbi->osi_ops->o_get_info(sbi->osi_conn_info.conn_id, @@ -131,7 +223,6 @@ static struct super_block * obdfs_read_super(struct super_block *sb, lock_super(sb); - sb->u.generic_sbp = sbi; sb->s_blocksize = blocksize; sb->s_blocksize_bits = (unsigned char)blocksize_bits; @@ -149,9 +240,10 @@ static struct super_block * obdfs_read_super(struct super_block *sb, } - 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); + printk("obdfs_read_super: sbdev %d, rootino: %ld, dev %s, " + "minor: %d, blocksize: %ld, blocksize bits %ld\n", + sb->s_dev, root->i_ino, device, MINOR(devno), + blocksize, blocksize_bits); sb->s_root = d_alloc_root(root); unlock_super(sb); EXIT; @@ -180,14 +272,13 @@ static void obdfs_put_super(struct super_block *sb) sb->s_dev = 0; /* XXX flush stuff */ - sbi = sb->u.generic_sbp; - sb->u.generic_sbp = NULL; - sbi->osi_ops->o_disconnect(sbi->osi_conn_info.conn_id); - sbi->osi_super = NULL; + sbi = (struct obdfs_sb_info *) &sb->u.generic_sbp; + + OPS(sb,disconnect)(ID(sb)); + memset(sbi, 0, sizeof(* sbi)); printk("OBDFS: Bye bye.\n"); - memset(sbi, 0, sizeof(* sbi)); MOD_DEC_USE_COUNT; EXIT; @@ -199,11 +290,9 @@ extern struct inode_operations obdfs_inode_ops; void obdfs_read_inode(struct inode *inode) { int error; - struct obdfs_sb_info *sbi = inode->i_sb->u.generic_sbp; ENTRY; - error = sbi->osi_ops->o_getattr(sbi->osi_conn_info.conn_id, - inode->i_ino, inode); + error = IOPS(inode, getattr)(IID(inode), inode->i_ino, inode); if (error) { printk("obdfs_read_inode: obd_getattr fails (%d)\n", error); return; @@ -216,12 +305,9 @@ void obdfs_read_inode(struct inode *inode) static void obdfs_write_inode(struct inode *inode) { - struct obdfs_sb_info *sbi; int error; - sbi = inode->i_sb->u.generic_sbp; - error = sbi->osi_ops->o_setattr(sbi->osi_conn_info.conn_id, - inode->i_ino, inode); + error = IOPS(inode, setattr)(IID(inode), inode->i_ino, inode); if (error) { printk("obdfs_write_inode: obd_setattr fails (%d)\n", error); return; @@ -232,13 +318,10 @@ static void obdfs_write_inode(struct inode *inode) static void obdfs_delete_inode(struct inode *inode) { - struct obdfs_sb_info *sbi; int error; ENTRY; - sbi = inode->i_sb->u.generic_sbp; - error = sbi->osi_ops->o_destroy(sbi->osi_conn_info.conn_id, - inode->i_ino); + error = IOPS(inode, destroy)(IID(inode), inode->i_ino); if (error) { printk("obdfs_delete_node: ibd_destroy fails (%d)\n", error); return; @@ -251,16 +334,13 @@ 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; inode_setattr(inode, iattr); - error = sbi->osi_ops->o_setattr(sbi->osi_conn_info.conn_id, - inode->i_ino, inode); + error = IOPS(inode, setattr)(IID(inode), inode->i_ino, inode); if ( error ) { inode_setattr(inode, &saved_copy); printk("obdfs_notify_change: obd_setattr fails (%d)\n", error); @@ -275,13 +355,11 @@ static int obdfs_statfs(struct super_block *sb, struct statfs *buf, int bufsize) { struct statfs tmp; - struct obdfs_sb_info * sbi; int error; ENTRY; - sbi = sb->u.generic_sbp; - error = sbi->osi_ops->o_statfs(sbi->osi_conn_info.conn_id, &tmp); + error = OPS(sb,statfs)(ID(sb), &tmp); if ( error ) { printk("obdfs_notify_change: obd_statfs fails (%d)\n", error); return error; @@ -303,9 +381,6 @@ int init_obdfs(void) obdfs_sysctl_init(); - obd_sbi = &obdfs_super_info; - obd_fso = &obdfs_file_ops; - return register_filesystem(&obdfs_fs_type); } @@ -323,11 +398,5 @@ void cleanup_module(void) obdfs_sysctl_clean(); unregister_filesystem(&obdfs_fs_type); } -void obdfs_psdev_dec_use_count(void) -{ - MOD_DEC_USE_COUNT; -} - -EXPORT_SYMBOL(obdfs_psdev_dec_use_count); #endif diff --git a/lustre/scripts/maketags.sh b/lustre/scripts/maketags.sh new file mode 100755 index 0000000..58da5d1 --- /dev/null +++ b/lustre/scripts/maketags.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +rm -f TAGS ; find . -name '*.h' -or -name '*.c' | xargs etags -- 1.8.3.1