From 0a0313661b2e429621fb29d32917ef935c31b4eb Mon Sep 17 00:00:00 2001 From: braam Date: Sun, 20 Jan 2002 05:03:56 +0000 Subject: [PATCH] Small fixes to get lustre_light mount working over the request handling infrastructure. --- lustre/include/linux/lustre_idl.h | 2 + lustre/include/linux/lustre_light.h | 37 +++++++- lustre/include/linux/lustre_mds.h | 6 ++ lustre/include/linux/obd_class.h | 2 - lustre/include/linux/obd_ext2.h | 3 - lustre/include/linux/obdfs.h | 114 +---------------------- lustre/llite/Makefile.am | 2 + lustre/llite/dir.c | 21 ++--- lustre/llite/file.c | 26 +++--- lustre/llite/namei.c | 101 ++++++++++---------- lustre/llite/rw.c | 181 ++++++++++++++++++------------------ lustre/llite/super.c | 37 ++++---- lustre/llite/symlink.c | 38 ++++---- lustre/llite/sysctl.c | 47 +++++----- lustre/mdc/mdc_request.c | 15 ++- lustre/mds/Makefile.am | 2 +- lustre/mds/handler.c | 1 + lustre/obdclass/Makefile.am | 1 + lustre/obdfilter/Makefile.am | 1 + lustre/obdfs/dir.c | 7 +- lustre/obdfs/rw.c | 71 +++++++------- lustre/obdfs/symlink.c | 6 +- lustre/ost/Makefile.am | 1 + lustre/tests/llmount.sh | 46 +++++++++ lustre/utils/Makefile.am | 2 + 25 files changed, 376 insertions(+), 394 deletions(-) create mode 100755 lustre/tests/llmount.sh diff --git a/lustre/include/linux/lustre_idl.h b/lustre/include/linux/lustre_idl.h index 0a26b20..4713905 100644 --- a/lustre/include/linux/lustre_idl.h +++ b/lustre/include/linux/lustre_idl.h @@ -231,6 +231,7 @@ struct mds_req_packed { __u32 major; __u32 minor; __u32 ino; + __u32 nlink; __u32 generation; __u32 name_offset; __u32 tgt_offset; @@ -253,6 +254,7 @@ struct mds_rep_packed { __u32 major; __u32 minor; __u32 ino; + __u32 nlink; __u32 generation; __u32 name_offset; __u32 tgt_offset; diff --git a/lustre/include/linux/lustre_light.h b/lustre/include/linux/lustre_light.h index d3969bc..1fea41d 100644 --- a/lustre/include/linux/lustre_light.h +++ b/lustre/include/linux/lustre_light.h @@ -69,15 +69,41 @@ static void inline ll_from_inode(struct obdo *oa, struct inode *inode) } } /* ll_from_inode */ -static void inline ll_to_inode(struct inode *inode, struct obdo *oa) +static __inline__ void mds_rep_to_inode(struct inode *dst, struct mds_rep *rep) { - struct ll_inode_info *oinfo = ll_i2info(inode); - CDEBUG(D_INFO, "src obdo %ld valid 0x%08x, dst inode %ld\n", - (long)oa->o_id, oa->o_valid, inode->i_ino); + if ( rep->valid & OBD_MD_FLID ) + dst->i_ino = rep->ino; + if ( rep->valid & OBD_MD_FLATIME ) + dst->i_atime = rep->atime; + if ( rep->valid & OBD_MD_FLMTIME ) + dst->i_mtime = rep->mtime; + if ( rep->valid & OBD_MD_FLCTIME ) + dst->i_ctime = rep->ctime; + if ( rep->valid & OBD_MD_FLSIZE ) + dst->i_size = rep->size; + if ( rep->valid & OBD_MD_FLMODE ) + dst->i_mode = rep->mode; + if ( rep->valid & OBD_MD_FLUID ) + dst->i_uid = rep->uid; + if ( rep->valid & OBD_MD_FLGID ) + dst->i_gid = rep->gid; + if ( rep->valid & OBD_MD_FLFLAGS ) + dst->i_flags = rep->flags; + if ( rep->valid & OBD_MD_FLNLINK ) + dst->i_nlink = rep->nlink; + if ( rep->valid & OBD_MD_FLGENER ) + dst->i_generation = rep->generation; +} + +static void inline ll_to_inode(struct inode *inode, struct mds_rep *rep) +{ + CDEBUG(D_INFO, "src obdo %d valid 0x%08x, dst inode %ld\n", + rep->ino, rep->valid, inode->i_ino); - obdo_to_inode(inode, oa); + mds_rep_to_inode(inode, rep); +#if 0 if (obdo_has_inline(oa)) { if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) || S_ISFIFO(inode->i_mode)) { @@ -91,6 +117,7 @@ static void inline ll_to_inode(struct inode *inode, struct obdo *oa) } oinfo->lli_flags |= OBD_FL_INLINEDATA; } +#endif } /* ll_to_inode */ diff --git a/lustre/include/linux/lustre_mds.h b/lustre/include/linux/lustre_mds.h index 999e00a..c018d75 100644 --- a/lustre/include/linux/lustre_mds.h +++ b/lustre/include/linux/lustre_mds.h @@ -107,6 +107,7 @@ struct mds_req { __u32 major; __u32 minor; __u32 ino; + __u32 nlink; __u32 generation; char *name; char *tgt; @@ -130,6 +131,7 @@ struct mds_rep { __u32 major; __u32 minor; __u32 ino; + __u32 nlink; __u32 generation; char *name; char *tgt; @@ -144,6 +146,10 @@ int mds_unpack_rep(char *buf, int len, struct mds_rep_hdr **hdr, struct mds_rep /* llight/request.c */ +int mdc_getattr(ino_t ino, int type, int valid, + struct mds_rep **mds_reply, struct mds_rep_hdr **hdr); + + /* ioctls for trying requests */ #define IOC_REQUEST_TYPE 'f' diff --git a/lustre/include/linux/obd_class.h b/lustre/include/linux/obd_class.h index d7b3a10..398c7eb 100644 --- a/lustre/include/linux/obd_class.h +++ b/lustre/include/linux/obd_class.h @@ -199,8 +199,6 @@ static __inline__ void obdo_free(struct obdo *oa) kmem_cache_free(obdo_cachep, oa); } - - static __inline__ struct obdo *obdo_fromid(struct obd_conn *conn, obd_id id, obd_mode mode, obd_flag valid) { diff --git a/lustre/include/linux/obd_ext2.h b/lustre/include/linux/obd_ext2.h index 0cf413b..1f15d0f 100644 --- a/lustre/include/linux/obd_ext2.h +++ b/lustre/include/linux/obd_ext2.h @@ -9,8 +9,6 @@ #define OBD_EXT2_RUNIT _IOWR('f', 61, long) -#include - #ifndef OBD_EXT2_DEVICENAME #define OBD_EXT2_DEVICENAME "obdext2" #endif @@ -50,7 +48,6 @@ extern struct super_operations ext2_sops; int obd_remount (struct super_block * sb, int * flags, char * data); struct super_block * ext2_read_super (struct super_block * sb, void * data, int silent); - /* punch.c */ void ext2_truncate (struct inode * inode); int ext2_punch (struct inode * inode, loff_t start, size_t count); diff --git a/lustre/include/linux/obdfs.h b/lustre/include/linux/obdfs.h index 57fc191..4e68938 100644 --- a/lustre/include/linux/obdfs.h +++ b/lustre/include/linux/obdfs.h @@ -15,7 +15,6 @@ #include #include - /* super.c */ struct obdfs_pgrq { struct list_head rq_plist; /* linked list of req's */ @@ -28,23 +27,6 @@ extern struct list_head obdfs_super_list; /* list of all OBDFS superblocks /* dir.c */ -#define EXT2_DIR_PAD 4 -#define EXT2_DIR_ROUND (EXT2_DIR_PAD - 1) -#define EXT2_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT2_DIR_ROUND) & \ - ~EXT2_DIR_ROUND) -#define EXT2_NAME_LEN 255 -#if 0 -struct ext2_dir_entry_2 { - __u32 inode; /* Inode number */ - __u16 rec_len; /* Directory entry length */ - __u8 name_len; /* Name length */ - __u8 file_type; - char name[EXT2_NAME_LEN]; /* File name */ -}; -#endif -int obdfs_check_dir_entry (const char * function, struct inode * dir, - struct ext2_dir_entry_2 * de, struct page * page, - unsigned long offset); extern struct file_operations obdfs_dir_operations; extern struct inode_operations obdfs_dir_inode_operations; @@ -60,98 +42,6 @@ int obdfs_flush_reqs(struct list_head *inode_list, unsigned long check_time); int obdfs_flush_dirty_pages(unsigned long check_time); /* namei.c */ -/* - * Structure of the super block - */ - -#if 0 -struct ext2_super_block { - __u32 s_inodes_count; /* Inodes count */ - __u32 s_blocks_count; /* Blocks count */ - __u32 s_r_blocks_count; /* Reserved blocks count */ - __u32 s_free_blocks_count; /* Free blocks count */ - __u32 s_free_inodes_count; /* Free inodes count */ - __u32 s_first_data_block; /* First Data Block */ - __u32 s_log_block_size; /* Block size */ - __s32 s_log_frag_size; /* Fragment size */ - __u32 s_blocks_per_group; /* # Blocks per group */ - __u32 s_frags_per_group; /* # Fragments per group */ - __u32 s_inodes_per_group; /* # Inodes per group */ - __u32 s_mtime; /* Mount time */ - __u32 s_wtime; /* Write time */ - __u16 s_mnt_count; /* Mount count */ - __s16 s_max_mnt_count; /* Maximal mount count */ - __u16 s_magic; /* Magic signature */ - __u16 s_state; /* File system state */ - __u16 s_errors; /* Behaviour when detecting errors */ - __u16 s_minor_rev_level; /* minor revision level */ - __u32 s_lastcheck; /* time of last check */ - __u32 s_checkinterval; /* max. time between checks */ - __u32 s_creator_os; /* OS */ - __u32 s_rev_level; /* Revision level */ - __u16 s_def_resuid; /* Default uid for reserved blocks */ - __u16 s_def_resgid; /* Default gid for reserved blocks */ - /* - * These fields are for EXT2_DYNAMIC_REV superblocks only. - * - * Note: the difference between the compatible feature set and - * the incompatible feature set is that if there is a bit set - * in the incompatible feature set that the kernel doesn't - * know about, it should refuse to mount the filesystem. - * - * e2fsck's requirements are more strict; if it doesn't know - * about a feature in either the compatible or incompatible - * feature set, it must abort and not try to meddle with - * things it doesn't understand... - */ - __u32 s_first_ino; /* First non-reserved inode */ - __u16 s_inode_size; /* size of inode structure */ - __u16 s_block_group_nr; /* block group # of this superblock */ - __u32 s_feature_compat; /* compatible feature set */ - __u32 s_feature_incompat; /* incompatible feature set */ - __u32 s_feature_ro_compat; /* readonly-compatible feature set */ - __u8 s_uuid[16]; /* 128-bit uuid for volume */ - char s_volume_name[16]; /* volume name */ - char s_last_mounted[64]; /* directory where last mounted */ - __u32 s_algorithm_usage_bitmap; /* For compression */ - /* - * Performance hints. Directory preallocation should only - * happen if the EXT2_COMPAT_PREALLOC flag is on. - */ - __u8 s_prealloc_blocks; /* Nr of blocks to try to preallocate*/ - __u8 s_prealloc_dir_blocks; /* Nr to preallocate for dirs */ - __u16 s_padding1; - __u32 s_reserved[204]; /* Padding to the end of the block */ -}; -#endif - -#define EXT2_SB(sb) (&((sb)->u.ext2_sb)) -/* - * Maximal count of links to a file - */ -#define EXT2_LINK_MAX 32000 -/* - * Ext2 directory file types. Only the low 3 bits are used. The - * other bits are reserved for now. - */ -#define EXT2_FT_UNKNOWN 0 -#define EXT2_FT_REG_FILE 1 -#define EXT2_FT_DIR 2 -#define EXT2_FT_CHRDEV 3 -#define EXT2_FT_BLKDEV 4 -#define EXT2_FT_FIFO 5 -#define EXT2_FT_SOCK 6 -#define EXT2_FT_SYMLINK 7 - -#define EXT2_FT_MAX 8 - -#define EXT2_BTREE_FL 0x00001000 /* btree format dir */ -#define EXT2_RESERVED_FL 0x80000000 /* reserved for ext2 lib */ -#define EXT2_FEATURE_INCOMPAT_FILETYPE 0x0002 -#define EXT2_HAS_COMPAT_FEATURE(sb,mask) \ - ( EXT2_SB(sb)->s_es->s_feature_compat & cpu_to_le32(mask) ) -#define EXT2_HAS_INCOMPAT_FEATURE(sb,mask) \ - ( EXT2_SB(sb)->s_es->s_feature_incompat & cpu_to_le32(mask) ) /* rw.c */ int obdfs_do_writepage(struct page *, int sync); @@ -219,6 +109,7 @@ static void inline obdfs_set_size (struct inode *inode, obd_size size) } /* obdfs_set_size */ +#if 0 /* PAGE CACHE DISABLED */ #define obd_down(mutex) { \ /* CDEBUG(D_INFO, "get lock\n"); */ \ @@ -267,7 +158,8 @@ static inline void obdfs_print_plist(struct inode *inode) CDEBUG(D_INFO, "\n"); /* obd_up(&obdfs_i2sbi(inode)->osi_list_mutex); */ } -#include +#endif + #endif diff --git a/lustre/llite/Makefile.am b/lustre/llite/Makefile.am index cd4d49d..9112d99 100644 --- a/lustre/llite/Makefile.am +++ b/lustre/llite/Makefile.am @@ -3,6 +3,8 @@ # This code is issued under the GNU General Public License. # See the file COPYING in this distribution +DEFS:= + MODULE = llight modulefs_DATA = llight.o EXTRA_PROGRAMS = llight diff --git a/lustre/llite/dir.c b/lustre/llite/dir.c index 05edd4c..12be7a2 100644 --- a/lustre/llite/dir.c +++ b/lustre/llite/dir.c @@ -81,7 +81,6 @@ static int ext2_commit_chunk(struct page *page, unsigned from, unsigned to) static void ext2_check_page(struct page *page) { struct inode *dir = page->mapping->host; - struct super_block *sb = dir->i_sb; unsigned chunk_size = ext2_chunk_size(dir); char *kaddr = page_address(page); // u32 max_inumber = le32_to_cpu(sb->u.ext2_sb.s_es->s_inodes_count); @@ -125,7 +124,7 @@ out: /* Too bad, we had an error */ Ebadsize: - ext2_error(sb, "ext2_check_page", + printk("ext2_check_page" "size of directory #%lu is not a multiple of chunk size", dir->i_ino ); @@ -145,7 +144,7 @@ Espan: //Einumber: // error = "inode out of bounds"; bad_entry: - ext2_error (sb, "ext2_check_page", "bad entry in directory #%lu: %s - " + printk("ext2_check_page: bad entry in directory #%lu: %s - " "offset=%lu, inode=%lu, rec_len=%d, name_len=%d", dir->i_ino, error, (page->index<inode), @@ -153,7 +152,7 @@ bad_entry: goto fail; Eend: p = (ext2_dirent *)(kaddr + offs); - ext2_error (sb, "ext2_check_page", + printk("ext2_check_page" "entry in directory #%lu spans the page boundary" "offset=%lu, inode=%lu", dir->i_ino, (page->index<f_pos; struct inode *inode = filp->f_dentry->d_inode; @@ -380,7 +379,7 @@ struct ext2_dir_entry_2 * ext2_dotdot (struct inode *dir, struct page **p) return de; } -ino_t obdfs_inode_by_name(struct inode * dir, struct dentry *dentry, int *type) +ino_t ll_inode_by_name(struct inode * dir, struct dentry *dentry, int *type) { ino_t res = 0; struct ext2_dir_entry_2 * de; @@ -389,7 +388,7 @@ ino_t obdfs_inode_by_name(struct inode * dir, struct dentry *dentry, int *type) de = ext2_find_entry (dir, dentry, &page); if (de) { res = le32_to_cpu(de->inode); - *type = obdfs_dt2fmt[de->file_type]; + *type = ll_dt2fmt[de->file_type]; kunmap(page); page_cache_release(page); } @@ -486,7 +485,7 @@ got_it: err = ext2_commit_chunk(page, from, to); // change_inode happens with the commit_chunk - // obdfs_change_inode(dir); + // ll_change_inode(dir); /* OFFSET_CACHE */ out_unlock: UnlockPage(page); @@ -619,7 +618,7 @@ not_empty: return 0; } -struct file_operations obdfs_dir_operations = { +struct file_operations ll_dir_operations = { read: generic_read_dir, - readdir: new_obdfs_readdir + readdir: new_ll_readdir }; diff --git a/lustre/llite/file.c b/lustre/llite/file.c index a652e42..45f543d 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -35,12 +35,12 @@ #include #include -#include +#include -extern int obdfs_setattr(struct dentry *de, struct iattr *attr); -void obdfs_change_inode(struct inode *inode); +extern int ll_setattr(struct dentry *de, struct iattr *attr); +void ll_change_inode(struct inode *inode); -static inline void obdfs_remove_suid(struct inode *inode) +static inline void ll_remove_suid(struct inode *inode) { unsigned int mode; @@ -52,7 +52,7 @@ static inline void obdfs_remove_suid(struct inode *inode) if (mode && !capable(CAP_FSETID)) { inode->i_mode &= ~mode; // XXX careful here - we cannot change the size - //obdfs_change_inode(inode); + //ll_change_inode(inode); } } @@ -60,7 +60,7 @@ static inline void obdfs_remove_suid(struct inode *inode) * Write to a file (through the page cache). */ static ssize_t -obdfs_file_write(struct file *file, const char *buf, size_t count, loff_t *ppos) +ll_file_write(struct file *file, const char *buf, size_t count, loff_t *ppos) { ssize_t retval; CDEBUG(D_INFO, "Writing inode %ld, %d bytes, offset %Ld\n", @@ -75,7 +75,7 @@ obdfs_file_write(struct file *file, const char *buf, size_t count, loff_t *ppos) attr.ia_valid = ATTR_MTIME | ATTR_CTIME | ATTR_ATIME; attr.ia_mtime = attr.ia_ctime = attr.ia_atime = CURRENT_TIME; - obdfs_setattr(file->f_dentry, &attr); + ll_setattr(file->f_dentry, &attr); } EXIT; return retval; @@ -84,21 +84,21 @@ obdfs_file_write(struct file *file, const char *buf, size_t count, loff_t *ppos) /* XXX this does not need to do anything for data, it _does_ need to call setattr */ -int obdfs_fsync(struct file *file, struct dentry *dentry, int data) +int ll_fsync(struct file *file, struct dentry *dentry, int data) { return 0; } -struct file_operations obdfs_file_operations = { +struct file_operations ll_file_operations = { read: generic_file_read, - write: obdfs_file_write, + write: ll_file_write, mmap: generic_file_mmap, fsync: NULL }; -struct inode_operations obdfs_file_inode_operations = { - truncate: obdfs_truncate, - setattr: obdfs_setattr +struct inode_operations ll_file_inode_operations = { + truncate: ll_truncate, + setattr: ll_setattr }; diff --git a/lustre/llite/namei.c b/lustre/llite/namei.c index f0e55c6..9dc1050 100644 --- a/lustre/llite/namei.c +++ b/lustre/llite/namei.c @@ -1,5 +1,4 @@ /* - * linux/fs/obdfs/namei.c * * This code is issued under the GNU General Public License. * See the file COPYING in this distribution @@ -31,16 +30,16 @@ #include #include #include -#include -extern struct address_space_operations obdfs_aops; +#include +extern struct address_space_operations ll_aops; /* from super.c */ -extern void obdfs_change_inode(struct inode *inode); -extern int obdfs_setattr(struct dentry *de, struct iattr *attr); +extern void ll_change_inode(struct inode *inode); +extern int ll_setattr(struct dentry *de, struct iattr *attr); /* from dir.c */ extern int ext2_add_link (struct dentry *dentry, struct inode *inode); -ino_t obdfs_inode_by_name(struct inode * dir, struct dentry *dentry, int *typ); +ino_t ll_inode_by_name(struct inode * dir, struct dentry *dentry, int *typ); int ext2_make_empty(struct inode *inode, struct inode *parent); struct ext2_dir_entry_2 * ext2_find_entry (struct inode * dir, struct dentry *dentry, struct page ** res_page); @@ -56,7 +55,7 @@ void ext2_set_link(struct inode *dir, struct ext2_dir_entry_2 *de, static inline void ext2_inc_count(struct inode *inode) { inode->i_nlink++; - obdfs_change_inode(inode); + ll_change_inode(inode); } /* postpone the disk update until the inode really goes away */ @@ -64,7 +63,7 @@ static inline void ext2_dec_count(struct inode *inode) { inode->i_nlink--; if (inode->i_nlink > 0) - obdfs_change_inode(inode); + ll_change_inode(inode); } static inline int ext2_add_nondir(struct dentry *dentry, struct inode *inode) @@ -81,7 +80,7 @@ static inline int ext2_add_nondir(struct dentry *dentry, struct inode *inode) } /* methods */ -static struct dentry *obdfs_lookup(struct inode * dir, struct dentry *dentry) +static struct dentry *ll_lookup(struct inode * dir, struct dentry *dentry) { struct obdo *oa; struct inode * inode = NULL; @@ -92,7 +91,7 @@ static struct dentry *obdfs_lookup(struct inode * dir, struct dentry *dentry) if (dentry->d_name.len > EXT2_NAME_LEN) return ERR_PTR(-ENAMETOOLONG); - ino = obdfs_inode_by_name(dir, dentry, &type); + ino = ll_inode_by_name(dir, dentry, &type); if (!ino) goto negative; @@ -132,7 +131,7 @@ static inline int ext2_match (int len, const char * const name, return !memcmp(name, de->name, len); } -static struct inode *obdfs_new_inode(struct inode *dir, int mode) +static struct inode *ll_new_inode(struct inode *dir, int mode) { struct obdo *oa; struct inode *inode; @@ -189,7 +188,7 @@ static struct inode *obdfs_new_inode(struct inode *dir, int mode) EXIT; return inode; -} /* obdfs_new_inode */ +} /* ll_new_inode */ /* @@ -200,64 +199,64 @@ static struct inode *obdfs_new_inode(struct inode *dir, int mode) * If the create succeeds, we fill in the inode information * with d_instantiate(). */ -static int obdfs_create (struct inode * dir, struct dentry * dentry, int mode) +static int ll_create (struct inode * dir, struct dentry * dentry, int mode) { - struct inode * inode = obdfs_new_inode (dir, mode); + struct inode * inode = ll_new_inode (dir, mode); int err = PTR_ERR(inode); if (!IS_ERR(inode)) { - inode->i_op = &obdfs_file_inode_operations; - inode->i_fop = &obdfs_file_operations; - inode->i_mapping->a_ops = &obdfs_aops; + inode->i_op = &ll_file_inode_operations; + inode->i_fop = &ll_file_operations; + inode->i_mapping->a_ops = &ll_aops; err = ext2_add_nondir(dentry, inode); } return err; -} /* obdfs_create */ +} /* ll_create */ -static int obdfs_mknod (struct inode * dir, struct dentry *dentry, int mode, int rdev) +static int ll_mknod (struct inode * dir, struct dentry *dentry, int mode, int rdev) { - struct inode * inode = obdfs_new_inode (dir, mode); + struct inode * inode = ll_new_inode (dir, mode); int err = PTR_ERR(inode); if (!IS_ERR(inode)) { init_special_inode(inode, mode, rdev); - obdfs_change_inode(inode); + ll_change_inode(inode); err = ext2_add_nondir(dentry, inode); } return err; } -static int obdfs_symlink (struct inode * dir, struct dentry * dentry, +static int ll_symlink (struct inode * dir, struct dentry * dentry, const char * symname) { struct super_block * sb = dir->i_sb; int err = -ENAMETOOLONG; unsigned l = strlen(symname)+1; struct inode * inode; - struct obdfs_inode_info *oinfo; + struct ll_inode_info *oinfo; if (l > sb->s_blocksize) goto out; - inode = obdfs_new_inode (dir, S_IFLNK | S_IRWXUGO); + inode = ll_new_inode (dir, S_IFLNK | S_IRWXUGO); err = PTR_ERR(inode); if (IS_ERR(inode)) goto out; - oinfo = obdfs_i2info(inode); - if (l >= sizeof(oinfo->oi_inline)) { + oinfo = ll_i2info(inode); + if (l >= sizeof(oinfo->lli_inline)) { /* slow symlink */ inode->i_op = &page_symlink_inode_operations; - inode->i_mapping->a_ops = &obdfs_aops; + inode->i_mapping->a_ops = &ll_aops; err = block_symlink(inode, symname, l); if (err) goto out_fail; } else { /* fast symlink */ - inode->i_op = &obdfs_fast_symlink_inode_operations; - memcpy(oinfo->oi_inline, symname, l); + inode->i_op = &ll_fast_symlink_inode_operations; + memcpy(oinfo->lli_inline, symname, l); inode->i_size = l-1; } - obdfs_change_inode(inode); + ll_change_inode(inode); err = ext2_add_nondir(dentry, inode); out: @@ -271,7 +270,7 @@ out_fail: -static int obdfs_link (struct dentry * old_dentry, struct inode * dir, +static int ll_link (struct dentry * old_dentry, struct inode * dir, struct dentry *dentry) { struct inode *inode = old_dentry->d_inode; @@ -290,7 +289,7 @@ static int obdfs_link (struct dentry * old_dentry, struct inode * dir, } -static int obdfs_mkdir(struct inode * dir, struct dentry * dentry, int mode) +static int ll_mkdir(struct inode * dir, struct dentry * dentry, int mode) { struct inode * inode; int err = -EMLINK; @@ -301,14 +300,14 @@ static int obdfs_mkdir(struct inode * dir, struct dentry * dentry, int mode) ext2_inc_count(dir); - inode = obdfs_new_inode (dir, S_IFDIR | mode); + inode = ll_new_inode (dir, S_IFDIR | mode); err = PTR_ERR(inode); if (IS_ERR(inode)) goto out_dir; - inode->i_op = &obdfs_dir_inode_operations; - inode->i_fop = &obdfs_dir_operations; - inode->i_mapping->a_ops = &obdfs_aops; + inode->i_op = &ll_dir_inode_operations; + inode->i_fop = &ll_dir_operations; + inode->i_mapping->a_ops = &ll_aops; ext2_inc_count(inode); @@ -336,7 +335,7 @@ out_dir: goto out; } -static int obdfs_unlink(struct inode * dir, struct dentry *dentry) +static int ll_unlink(struct inode * dir, struct dentry *dentry) { struct inode * inode = dentry->d_inode; struct ext2_dir_entry_2 * de; @@ -359,13 +358,13 @@ out: } -static int obdfs_rmdir (struct inode * dir, struct dentry *dentry) +static int ll_rmdir (struct inode * dir, struct dentry *dentry) { struct inode * inode = dentry->d_inode; int err = -ENOTEMPTY; if (ext2_empty_dir(inode)) { - err = obdfs_unlink(dir, dentry); + err = ll_unlink(dir, dentry); if (!err) { inode->i_size = 0; ext2_dec_count(inode); @@ -375,7 +374,7 @@ static int obdfs_rmdir (struct inode * dir, struct dentry *dentry) return err; } -static int obdfs_rename (struct inode * old_dir, struct dentry * old_dentry, +static int ll_rename (struct inode * old_dir, struct dentry * old_dentry, struct inode * new_dir, struct dentry * new_dentry ) { struct inode * old_inode = old_dentry->d_inode; @@ -453,15 +452,15 @@ out: return err; } -struct inode_operations obdfs_dir_inode_operations = { - create: obdfs_create, - lookup: obdfs_lookup, - link: obdfs_link, - unlink: obdfs_unlink, - symlink: obdfs_symlink, - mkdir: obdfs_mkdir, - rmdir: obdfs_rmdir, - mknod: obdfs_mknod, - rename: obdfs_rename, - setattr: obdfs_setattr +struct inode_operations ll_dir_inode_operations = { + create: ll_create, + lookup: ll_lookup, + link: ll_link, + unlink: ll_unlink, + symlink: ll_symlink, + mkdir: ll_mkdir, + rmdir: ll_rmdir, + mknod: ll_mknod, + rename: ll_rename, + setattr: ll_setattr }; diff --git a/lustre/llite/rw.c b/lustre/llite/rw.c index 501a2df..a20f267 100644 --- a/lustre/llite/rw.c +++ b/lustre/llite/rw.c @@ -33,10 +33,9 @@ #include #include -#include -#include +#include -void obdfs_change_inode(struct inode *inode); +void ll_change_inode(struct inode *inode); static int cache_writes = 0; @@ -97,7 +96,7 @@ inline void set_page_clean(struct page *page) } /* SYNCHRONOUS I/O to object storage for an inode -- object attr will be updated too */ -static int obdfs_brw(int rw, struct inode *inode, struct page *page, int create) +static int ll_brw(int rw, struct inode *inode, struct page *page, int create) { obd_count num_obdo = 1; obd_count bufs_per_obdo = 1; @@ -120,22 +119,22 @@ static int obdfs_brw(int rw, struct inode *inode, struct page *page, int create) return -ENOMEM; } oa->o_valid = OBD_MD_FLNOTOBD; - obdfs_from_inode(oa, inode); + ll_from_inode(oa, inode); err = IOPS(inode, brw)(rw, IID(inode), num_obdo, &oa, &bufs_per_obdo, &page, &count, &offset, &flags); //if ( !err ) - // obdfs_to_inode(inode, oa); /* copy o_blocks to i_blocks */ + // ll_to_inode(inode, oa); /* copy o_blocks to i_blocks */ obdo_free(oa); EXIT; return err; -} /* obdfs_brw */ +} /* ll_brw */ extern void set_page_clean(struct page *); /* SYNCHRONOUS I/O to object storage for an inode -- object attr will be updated too */ -static int obdfs_commit_page(struct page *page, int create, int from, int to) +static int ll_commit_page(struct page *page, int create, int from, int to) { struct inode *inode = page->mapping->host; obd_count num_obdo = 1; @@ -159,7 +158,7 @@ static int obdfs_commit_page(struct page *page, int create, int from, int to) return -ENOMEM; } oa->o_valid = OBD_MD_FLNOTOBD; - obdfs_from_inode(oa, inode); + ll_from_inode(oa, inode); CDEBUG(D_INODE, "commit_page writing (at %d) to %d, count %Ld\n", from, to, count); @@ -172,16 +171,16 @@ static int obdfs_commit_page(struct page *page, int create, int from, int to) } //if ( !err ) - // obdfs_to_inode(inode, oa); /* copy o_blocks to i_blocks */ + // ll_to_inode(inode, oa); /* copy o_blocks to i_blocks */ obdo_free(oa); EXIT; return err; -} /* obdfs_brw */ +} /* ll_brw */ /* returns the page unlocked, but with a reference */ -int obdfs_readpage(struct file *file, struct page *page) +int ll_readpage(struct file *file, struct page *page) { struct inode *inode = page->mapping->host; int rc; @@ -200,7 +199,7 @@ int obdfs_readpage(struct file *file, struct page *page) goto readpage_out; } - rc = obdfs_brw(READ, inode, page, 0); + rc = ll_brw(READ, inode, page, 0); if ( rc ) { EXIT; return rc; @@ -212,9 +211,9 @@ int obdfs_readpage(struct file *file, struct page *page) obd_unlock_page(page); EXIT; return 0; -} /* obdfs_readpage */ +} /* ll_readpage */ -int obdfs_prepare_write(struct file *file, struct page *page, unsigned from, unsigned to) +int ll_prepare_write(struct file *file, struct page *page, unsigned from, unsigned to) { struct inode *inode = page->mapping->host; obd_off offset = ((obd_off)page->index) << PAGE_SHIFT; @@ -232,7 +231,7 @@ int obdfs_prepare_write(struct file *file, struct page *page, unsigned from, uns return 0; } - rc = obdfs_brw(READ, inode, page, 0); + rc = ll_brw(READ, inode, page, 0); if ( !rc ) { SetPageUptodate(page); } @@ -249,64 +248,64 @@ int obdfs_prepare_write(struct file *file, struct page *page, unsigned from, uns -static kmem_cache_t *obdfs_pgrq_cachep = NULL; +static kmem_cache_t *ll_pgrq_cachep = NULL; -int obdfs_init_pgrqcache(void) +int ll_init_pgrqcache(void) { ENTRY; - if (obdfs_pgrq_cachep == NULL) { - CDEBUG(D_CACHE, "allocating obdfs_pgrq_cache\n"); - obdfs_pgrq_cachep = kmem_cache_create("obdfs_pgrq", - sizeof(struct obdfs_pgrq), + if (ll_pgrq_cachep == NULL) { + CDEBUG(D_CACHE, "allocating ll_pgrq_cache\n"); + ll_pgrq_cachep = kmem_cache_create("ll_pgrq", + sizeof(struct ll_pgrq), 0, SLAB_HWCACHE_ALIGN, NULL, NULL); - if (obdfs_pgrq_cachep == NULL) { + if (ll_pgrq_cachep == NULL) { EXIT; return -ENOMEM; } else { CDEBUG(D_CACHE, "allocated cache at %p\n", - obdfs_pgrq_cachep); + ll_pgrq_cachep); } } else { CDEBUG(D_CACHE, "using existing cache at %p\n", - obdfs_pgrq_cachep); + ll_pgrq_cachep); } EXIT; return 0; -} /* obdfs_init_wreqcache */ +} /* ll_init_wreqcache */ -inline void obdfs_pgrq_del(struct obdfs_pgrq *pgrq) +inline void ll_pgrq_del(struct ll_pgrq *pgrq) { - --obdfs_cache_count; + --ll_cache_count; CDEBUG(D_INFO, "deleting page %p from list [count %ld]\n", - pgrq->rq_page, obdfs_cache_count); + pgrq->rq_page, ll_cache_count); list_del(&pgrq->rq_plist); OBDClearCachePage(pgrq->rq_page); - kmem_cache_free(obdfs_pgrq_cachep, pgrq); + kmem_cache_free(ll_pgrq_cachep, pgrq); } -void obdfs_cleanup_pgrqcache(void) +void ll_cleanup_pgrqcache(void) { ENTRY; - if (obdfs_pgrq_cachep != NULL) { - CDEBUG(D_CACHE, "destroying obdfs_pgrqcache at %p, count %ld\n", - obdfs_pgrq_cachep, obdfs_cache_count); - if (kmem_cache_destroy(obdfs_pgrq_cachep)) + if (ll_pgrq_cachep != NULL) { + CDEBUG(D_CACHE, "destroying ll_pgrqcache at %p, count %ld\n", + ll_pgrq_cachep, ll_cache_count); + if (kmem_cache_destroy(ll_pgrq_cachep)) printk(KERN_INFO __FUNCTION__ ": unable to free all of cache\n"); - obdfs_pgrq_cachep = NULL; + ll_pgrq_cachep = NULL; } else printk(KERN_INFO __FUNCTION__ ": called with NULL pointer\n"); EXIT; -} /* obdfs_cleanup_wreqcache */ +} /* ll_cleanup_wreqcache */ /* called with the list lock held */ -static struct page *obdfs_find_page_index(struct inode *inode, +static struct page *ll_find_page_index(struct inode *inode, unsigned long index) { - struct list_head *page_list = obdfs_iplist(inode); + struct list_head *page_list = ll_iplist(inode); struct list_head *tmp; struct page *page; @@ -322,9 +321,9 @@ static struct page *obdfs_find_page_index(struct inode *inode, } tmp = page_list; while ( (tmp = tmp->next) != page_list ) { - struct obdfs_pgrq *pgrq; + struct ll_pgrq *pgrq; - pgrq = list_entry(tmp, struct obdfs_pgrq, rq_plist); + pgrq = list_entry(tmp, struct ll_pgrq, rq_plist); page = pgrq->rq_page; if (index == page->index) { CDEBUG(D_INFO, @@ -337,11 +336,11 @@ static struct page *obdfs_find_page_index(struct inode *inode, EXIT; return NULL; -} /* obdfs_find_page_index */ +} /* ll_find_page_index */ /* call and free pages from Linux page cache: called with io lock on inodes */ -int obdfs_do_vec_wr(struct inode **inodes, obd_count num_io, +int ll_do_vec_wr(struct inode **inodes, obd_count num_io, obd_count num_obdos, struct obdo **obdos, obd_count *oa_bufs, struct page **pages, char **bufs, obd_size *counts, obd_off *offsets, obd_flag *flags) @@ -388,8 +387,8 @@ int obdfs_do_vec_wr(struct inode **inodes, obd_count num_io, --num_obdos; CDEBUG(D_INFO, "free obdo %ld\n",(long)obdos[num_obdos]->o_id); /* copy o_blocks to i_blocks */ - obdfs_set_size (inodes[num_obdos], obdos[num_obdos]->o_size); - //obdfs_to_inode(inodes[num_obdos], obdos[num_obdos]); + ll_set_size (inodes[num_obdos], obdos[num_obdos]->o_size); + //ll_to_inode(inodes[num_obdos], obdos[num_obdos]); obdo_free(obdos[num_obdos]); } CDEBUG(D_INFO, "obdo_free done\n"); @@ -402,12 +401,12 @@ int obdfs_do_vec_wr(struct inode **inodes, obd_count num_io, * Add a page to the write request cache list for later writing. * ASYNCHRONOUS write method. */ -static int obdfs_add_page_to_cache(struct inode *inode, struct page *page) +static int ll_add_page_to_cache(struct inode *inode, struct page *page) { int err = 0; ENTRY; - /* The PG_obdcache bit is cleared by obdfs_pgrq_del() BEFORE the page + /* The PG_obdcache bit is cleared by ll_pgrq_del() BEFORE the page * is written, so at worst we will write the page out twice. * * If the page has the PG_obdcache bit set, then the inode MUST be @@ -418,8 +417,8 @@ static int obdfs_add_page_to_cache(struct inode *inode, struct page *page) * have an inode with dirty pages NOT on the superblock dirty list. */ if (!OBDAddCachePage(page)) { - struct obdfs_pgrq *pgrq; - pgrq = kmem_cache_alloc(obdfs_pgrq_cachep, SLAB_KERNEL); + struct ll_pgrq *pgrq; + pgrq = kmem_cache_alloc(ll_pgrq_cachep, SLAB_KERNEL); if (!pgrq) { OBDClearCachePage(page); EXIT; @@ -433,10 +432,10 @@ static int obdfs_add_page_to_cache(struct inode *inode, struct page *page) pgrq->rq_jiffies = jiffies; get_page(pgrq->rq_page); - obd_down(&obdfs_i2sbi(inode)->osi_list_mutex); - list_add(&pgrq->rq_plist, obdfs_iplist(inode)); - obdfs_cache_count++; - //printk("-- count %d\n", obdfs_cache_count); + obd_down(&ll_i2sbi(inode)->ll_list_mutex); + list_add(&pgrq->rq_plist, ll_iplist(inode)); + ll_cache_count++; + //printk("-- count %d\n", ll_cache_count); /* If inode isn't already on superblock inodes list, add it. * @@ -447,36 +446,36 @@ static int obdfs_add_page_to_cache(struct inode *inode, struct page *page) * again there. Instead we just increment/decrement i_count, * which is mostly what iget/iput do for an inode in memory. */ - if ( list_empty(obdfs_islist(inode)) ) { + if ( list_empty(ll_islist(inode)) ) { atomic_inc(&inode->i_count); CDEBUG(D_INFO, "adding inode %ld to superblock list %p\n", - inode->i_ino, obdfs_slist(inode)); - list_add(obdfs_islist(inode), obdfs_slist(inode)); + inode->i_ino, ll_slist(inode)); + list_add(ll_islist(inode), ll_slist(inode)); } - obd_up(&obdfs_i2sbi(inode)->osi_list_mutex); + obd_up(&ll_i2sbi(inode)->ll_list_mutex); } /* XXX For testing purposes, we can write out the page here. - err = obdfs_flush_reqs(obdfs_slist(inode), ~0UL); + err = ll_flush_reqs(ll_slist(inode), ~0UL); */ EXIT; return err; -} /* obdfs_add_page_to_cache */ +} /* ll_add_page_to_cache */ void rebalance(void) { - if (obdfs_cache_count > 60000) { - printk("-- count %ld\n", obdfs_cache_count); - //obdfs_flush_dirty_pages(~0UL); - printk("-- count %ld\n", obdfs_cache_count); + if (ll_cache_count > 60000) { + printk("-- count %ld\n", ll_cache_count); + //ll_flush_dirty_pages(~0UL); + printk("-- count %ld\n", ll_cache_count); } } /* select between SYNC and ASYNC I/O methods */ -int obdfs_do_writepage(struct page *page, int sync) +int ll_do_writepage(struct page *page, int sync) { struct inode *inode = page->mapping->host; int err; @@ -484,9 +483,9 @@ int obdfs_do_writepage(struct page *page, int sync) ENTRY; /* PDEBUG(page, "WRITEPAGE"); */ if ( sync ) - err = obdfs_brw(WRITE, inode, page, 1); + err = ll_brw(WRITE, inode, page, 1); else { - err = obdfs_add_page_to_cache(inode, page); + err = ll_add_page_to_cache(inode, page); CDEBUG(D_INFO, "DO_WR ino: %ld, page %p, err %d, uptodate %d\n", inode->i_ino, page, err, Page_Uptodate(page)); } @@ -498,19 +497,19 @@ int obdfs_do_writepage(struct page *page, int sync) /* PDEBUG(page,"WRITEPAGE"); */ EXIT; return err; -} /* obdfs_do_writepage */ +} /* ll_do_writepage */ /* returns the page unlocked, but with a reference */ -int obdfs_writepage(struct page *page) +int ll_writepage(struct page *page) { int rc; struct inode *inode = page->mapping->host; ENTRY; printk("---> writepage called ino %ld!\n", inode->i_ino); BUG(); - rc = obdfs_do_writepage(page, 1); + rc = ll_do_writepage(page, 1); if ( !rc ) { set_page_clean(page); } else { @@ -527,12 +526,12 @@ void write_inode_pages(struct inode *inode) while ( (tmp = tmp->next) != &inode->i_mapping->dirty_pages) { struct page *page; page = list_entry(tmp, struct page, list); - obdfs_writepage(page); + ll_writepage(page); } } -int obdfs_commit_write(struct file *file, struct page *page, unsigned from, unsigned to) +int ll_commit_write(struct file *file, struct page *page, unsigned from, unsigned to) { struct inode *inode = page->mapping->host; int rc = 0; @@ -543,11 +542,11 @@ int obdfs_commit_write(struct file *file, struct page *page, unsigned from, unsi if (cache_writes == 0) { - rc = obdfs_commit_page(page, 1, from, to); + rc = ll_commit_page(page, 1, from, to); } if (len > inode->i_size) { - obdfs_set_size(inode, len); + ll_set_size(inode, len); } kunmap(page); @@ -567,7 +566,7 @@ int obdfs_commit_write(struct file *file, struct page *page, unsigned from, unsi * * Return value is the number of bytes written. */ -int obdfs_write_one_page(struct file *file, struct page *page, +int ll_write_one_page(struct file *file, struct page *page, unsigned long offset, unsigned long bytes, const char * buf) { @@ -579,7 +578,7 @@ int obdfs_write_one_page(struct file *file, struct page *page, * get the page before writing over everything anyways. */ if ( !Page_Uptodate(page) && (offset != 0 || bytes != PAGE_SIZE) ) { - err = obdfs_brw(READ, inode, page, 0); + err = ll_brw(READ, inode, page, 0); if ( err ) return err; SetPageUptodate(page); @@ -589,11 +588,11 @@ int obdfs_write_one_page(struct file *file, struct page *page, return -EFAULT; lock_kernel(); - err = obdfs_writepage(page); + err = ll_writepage(page); unlock_kernel(); return (err < 0 ? err : bytes); -} /* obdfs_write_one_page */ +} /* ll_write_one_page */ /* * return an up to date page: @@ -603,7 +602,7 @@ int obdfs_write_one_page(struct file *file, struct page *page, * * modeled on NFS code. */ -struct page *obdfs_getpage(struct inode *inode, unsigned long offset, +struct page *ll_getpage(struct inode *inode, unsigned long offset, int create, int locked) { struct page * page; @@ -642,13 +641,13 @@ struct page *obdfs_getpage(struct inode *inode, unsigned long offset, #ifdef EXT2_OBD_DEBUG - if ((obd_debug_level & D_INFO) && obdfs_find_page_index(inode, index)) { + if ((obd_debug_level & D_INFO) && ll_find_page_index(inode, index)) { CDEBUG(D_INFO, "OVERWRITE: found dirty page %p, index %ld\n", page, page->index); } #endif - err = obdfs_brw(READ, inode, page, create); + err = ll_brw(READ, inode, page, create); if ( err ) { SetPageError(page); @@ -663,16 +662,16 @@ struct page *obdfs_getpage(struct inode *inode, unsigned long offset, /* PDEBUG(page,"GETPAGE - after reading"); */ EXIT; return page; -} /* obdfs_getpage */ +} /* ll_getpage */ -void obdfs_truncate(struct inode *inode) +void ll_truncate(struct inode *inode) { struct obdo *oa; int err; ENTRY; - //obdfs_dequeue_pages(inode); + //ll_dequeue_pages(inode); if (IOPS(inode, punch) == NULL) { printk(KERN_ERR __FUNCTION__ ": no punch method!\n"); @@ -690,12 +689,12 @@ void obdfs_truncate(struct inode *inode) printk(__FUNCTION__ ": obdo_alloc failed - using stack!\n"); obdo.o_valid = OBD_MD_FLNOTOBD; - obdfs_from_inode(&obdo, inode); + ll_from_inode(&obdo, inode); err = IOPS(inode, punch)(IID(inode), &obdo, 0, obdo.o_size); } else { oa->o_valid = OBD_MD_FLNOTOBD; - obdfs_from_inode(oa, inode); + ll_from_inode(oa, inode); CDEBUG(D_INFO, "calling punch for %ld (%Lu bytes at 0)\n", (long)oa->o_id, oa->o_size); @@ -710,13 +709,13 @@ void obdfs_truncate(struct inode *inode) return; } EXIT; -} /* obdfs_truncate */ +} /* ll_truncate */ -struct address_space_operations obdfs_aops = { - readpage: obdfs_readpage, - writepage: obdfs_writepage, +struct address_space_operations ll_aops = { + readpage: ll_readpage, + writepage: ll_writepage, sync_page: block_sync_page, - prepare_write: obdfs_prepare_write, - commit_write: obdfs_commit_write, + prepare_write: ll_prepare_write, + commit_write: ll_commit_write, bmap: NULL }; diff --git a/lustre/llite/super.c b/lustre/llite/super.c index b3f9ba6..66d0a40 100644 --- a/lustre/llite/super.c +++ b/lustre/llite/super.c @@ -1,4 +1,3 @@ - /* * OBDFS Super operations * @@ -36,7 +35,7 @@ #include #include -struct list_head ll_super_list; +//struct list_head ll_super_list; extern struct address_space_operations ll_aops; struct super_operations ll_super_operations; long ll_cache_count = 0; @@ -97,7 +96,8 @@ static struct super_block * ll_read_super(struct super_block *sb, int connected = 0; int devno; int err; - struct obdo *oa; + struct mds_rep *rep; + struct mds_rep_hdr *hdr = NULL; ENTRY; @@ -136,16 +136,18 @@ static struct super_block * ll_read_super(struct super_block *sb, CDEBUG(D_INFO, "\n"); sbi->ll_obd = obddev; sbi->ll_ops = sbi->ll_obd->obd_type->typ_ops; - sbi->ll_conn.oc_dev = obddev; + + CDEBUG(D_INFO, "\n"); err = sbi->ll_ops->o_connect(&sbi->ll_conn); + CDEBUG(D_INFO, "\n"); if ( err ) { printk("OBDFS: cannot connect to %s\n", device); EXIT; goto ERR; } - connected = 1; + CDEBUG(D_INFO, "\n"); /* list of dirty inodes, and a mutex to hold while modifying it */ INIT_LIST_HEAD(&sbi->ll_inodes); @@ -165,18 +167,21 @@ static struct super_block * ll_read_super(struct super_block *sb, /* make root inode */ CDEBUG(D_INFO, "\n"); - oa = obdo_fromid(&sbi->ll_conn, root_ino, S_IFDIR, - OBD_MD_FLNOTOBD | OBD_MD_FLBLOCKS); - CDEBUG(D_INFO, "mode %o\n", oa->o_mode); - if ( IS_ERR(oa) ) { - printk(__FUNCTION__ ": obdo_fromid failed\n"); + err = mdc_getattr(root_ino, S_IFDIR, OBD_MD_FLNOTOBD|OBD_MD_FLBLOCKS, + &rep, &hdr); + if (err) { + printk(__FUNCTION__ ": mds_getattr failed %d\n", err); iput(root); + if (rep) + kfree(rep); EXIT; goto ERR; } + + CDEBUG(D_INFO, "mode %o\n", rep->mode); CDEBUG(D_INFO, "\n"); - root = iget4(sb, root_ino, NULL, oa); - obdo_free(oa); + root = iget4(sb, root_ino, NULL, rep); + kfree(hdr); CDEBUG(D_INFO, "\n"); if (!root) { printk("OBDFS: bad iget4 for root\n"); @@ -187,7 +192,7 @@ static struct super_block * ll_read_super(struct super_block *sb, } sb->s_root = d_alloc_root(root); - list_add(&sbi->ll_list, &ll_super_list); + // list_add(&sbi->ll_list, &ll_super_list); OBD_FREE(device, strlen(device) + 1); if (version) OBD_FREE(version, strlen(version) + 1); @@ -418,10 +423,10 @@ static int ll_statfs(struct super_block *sb, struct statfs *buf) static inline void ll_read_inode2(struct inode *inode, void *opaque) { - struct obdo *oa = opaque; + struct mds_rep *rep = opaque; ENTRY; - ll_to_inode(inode, oa); + ll_to_inode(inode, rep); INIT_LIST_HEAD(ll_iplist(inode)); /* list of dirty pages on inode */ INIT_LIST_HEAD(ll_islist(inode)); /* list of inodes in superblock */ @@ -448,7 +453,7 @@ static inline void ll_read_inode2(struct inode *inode, void *opaque) EXIT; } else { init_special_inode(inode, inode->i_mode, - ((int *)ll_i2info(inode)->oi_inline)[0]); + ((int *)ll_i2info(inode)->lli_inline)[0]); } EXIT; diff --git a/lustre/llite/symlink.c b/lustre/llite/symlink.c index 01484fd..7b414fc 100644 --- a/lustre/llite/symlink.c +++ b/lustre/llite/symlink.c @@ -26,35 +26,35 @@ #include #include #include /* for ENTRY and EXIT only */ -#include +#include -static int obdfs_fast_readlink(struct dentry *dentry, char *buffer, int buflen) +static int ll_fast_readlink(struct dentry *dentry, char *buffer, int buflen) { - char *s = obdfs_i2info(dentry->d_inode)->oi_inline; + char *s = ll_i2info(dentry->d_inode)->lli_inline; return vfs_readlink(dentry, buffer, buflen, s); } -static int obdfs_fast_follow_link(struct dentry *dentry, struct nameidata *nd) +static int ll_fast_follow_link(struct dentry *dentry, struct nameidata *nd) { - char *s = obdfs_i2info(dentry->d_inode)->oi_inline; + char *s = ll_i2info(dentry->d_inode)->lli_inline; return vfs_follow_link(nd, s); } -extern int obdfs_setattr(struct dentry *de, struct iattr *attr); -struct inode_operations obdfs_fast_symlink_inode_operations = { - readlink: obdfs_fast_readlink, - follow_link: obdfs_fast_follow_link, - setattr: obdfs_setattr +extern int ll_setattr(struct dentry *de, struct iattr *attr); +struct inode_operations ll_fast_symlink_inode_operations = { + readlink: ll_fast_readlink, + follow_link: ll_fast_follow_link, + setattr: ll_setattr }; -static int obdfs_readlink(struct dentry *dentry, char *buffer, int buflen) +static int ll_readlink(struct dentry *dentry, char *buffer, int buflen) { struct page *page = NULL; int res; ENTRY; OIDEBUG(dentry->d_inode); - page = obdfs_getpage(dentry->d_inode, 0, 0, 0); + page = ll_getpage(dentry->d_inode, 0, 0, 0); /* PDEBUG(page, "readlink"); */ if (!page) { EXIT; @@ -64,9 +64,9 @@ static int obdfs_readlink(struct dentry *dentry, char *buffer, int buflen) page_cache_release(page); EXIT; return res; -} /* obdfs_readlink */ +} /* ll_readlink */ -static int obdfs_follow_link(struct dentry * dentry, +static int ll_follow_link(struct dentry * dentry, struct nameidata *nd) { struct page *page = NULL; @@ -74,7 +74,7 @@ static int obdfs_follow_link(struct dentry * dentry, ENTRY; OIDEBUG(dentry->d_inode); - page = obdfs_getpage(dentry->d_inode, 0, 0, 0); + page = ll_getpage(dentry->d_inode, 0, 0, 0); /* PDEBUG(page, "follow_link"); */ if (!page) { dput(nd->dentry); @@ -87,8 +87,8 @@ static int obdfs_follow_link(struct dentry * dentry, return res; } -struct inode_operations obdfs_symlink_inode_operations = { - readlink: obdfs_readlink, - follow_link: obdfs_follow_link, - setattr: obdfs_setattr +struct inode_operations ll_symlink_inode_operations = { + readlink: ll_readlink, + follow_link: ll_follow_link, + setattr: ll_setattr }; diff --git a/lustre/llite/sysctl.c b/lustre/llite/sysctl.c index c03b0289..3c4ce1f 100644 --- a/lustre/llite/sysctl.c +++ b/lustre/llite/sysctl.c @@ -17,50 +17,49 @@ #include #include +struct ctl_table_header *ll_table_header = NULL; -struct ctl_table_header *obdfs_table_header = NULL; +int ll_debug_level = 0; +int ll_print_entry = 1; -int obdfs_debug_level = 0; -int obdfs_print_entry = 1; +#define LL_SYSCTL 1 -#define OBDFS_SYSCTL 1 +#define LL_DEBUG 1 /* control debugging */ +#define LL_ENTRY 2 /* control enter/leave pattern */ +#define LL_TIMEOUT 3 /* timeout on upcalls to become intrble */ +#define LL_HARD 4 /* mount type "hard" or "soft" */ +#define LL_VARS 5 +#define LL_INDEX 6 +#define LL_RESET 7 -#define OBDFS_DEBUG 1 /* control debugging */ -#define OBDFS_ENTRY 2 /* control enter/leave pattern */ -#define OBDFS_TIMEOUT 3 /* timeout on upcalls to become intrble */ -#define OBDFS_HARD 4 /* mount type "hard" or "soft" */ -#define OBDFS_VARS 5 -#define OBDFS_INDEX 6 -#define OBDFS_RESET 7 +#define LL_VARS_SLOT 2 -#define OBDFS_VARS_SLOT 2 - -static ctl_table obdfs_table[] = { - {OBDFS_DEBUG, "debug", &obdfs_debug_level, sizeof(int), 0644, NULL, &proc_dointvec}, - {OBDFS_ENTRY, "trace", &obdfs_print_entry, sizeof(int), 0644, NULL, &proc_dointvec}, +static ctl_table ll_table[] = { + {LL_DEBUG, "debug", &ll_debug_level, sizeof(int), 0644, NULL, &proc_dointvec}, + {LL_ENTRY, "trace", &ll_print_entry, sizeof(int), 0644, NULL, &proc_dointvec}, { 0 } }; static ctl_table top_table[] = { - {OBDFS_SYSCTL, "obdfs", NULL, 0, 0555, obdfs_table}, + {LL_SYSCTL, "lustre_light", NULL, 0, 0555, ll_table}, {0} }; -void obdfs_sysctl_init (void) +void ll_sysctl_init (void) { #ifdef CONFIG_SYSCTL - if ( !obdfs_table_header ) - obdfs_table_header = register_sysctl_table(top_table, 0); + if ( !ll_table_header ) + ll_table_header = register_sysctl_table(top_table, 0); #endif } -void obdfs_sysctl_clean (void) +void ll_sysctl_clean (void) { #ifdef CONFIG_SYSCTL - if ( obdfs_table_header ) - unregister_sysctl_table(obdfs_table_header); - obdfs_table_header = NULL; + if ( ll_table_header ) + unregister_sysctl_table(ll_table_header); + ll_table_header = NULL; #endif } diff --git a/lustre/mdc/mdc_request.c b/lustre/mdc/mdc_request.c index 37feabd..07ce317 100644 --- a/lustre/mdc/mdc_request.c +++ b/lustre/mdc/mdc_request.c @@ -95,7 +95,8 @@ void mds_free_req(struct mds_request *request) kfree(request); } -int mdc_getattr(ino_t ino, struct mds_rep **rep) +int mdc_getattr(ino_t ino, int type, int valid, + struct mds_rep **rep, struct mds_rep_hdr **hdr) { struct mds_request *request; int rc; @@ -107,6 +108,8 @@ int mdc_getattr(ino_t ino, struct mds_rep **rep) } request->rq_req->fid1.id = ino; + request->rq_req->fid1.f_type = type; + request->rq_req->valid = valid; rc = mds_queue_wait(request); if (rc) { @@ -116,9 +119,12 @@ int mdc_getattr(ino_t ino, struct mds_rep **rep) printk("mds_getattr: mode: %o\n", request->rq_rep->mode); - if (rep ) { + if (rep) { *rep = request->rq_rep; } + if (hdr) { + *hdr = request->rq_rephdr; + } out: mds_free_req(request); @@ -149,8 +155,10 @@ static int request_ioctl(struct inode *inode, struct file *file, switch (cmd) { case IOC_REQUEST_GETATTR: { + struct mds_rep_hdr *hdr; printk("-- getting attr for ino 2\n"); - err = mdc_getattr(2, NULL); + err = mdc_getattr(2, S_IFDIR, ~0, NULL, &hdr); + kfree(hdr); printk("-- done err %d\n", err); break; } @@ -194,6 +202,5 @@ MODULE_LICENSE("GPL"); EXPORT_SYMBOL(mdc_getattr); - module_init(mds_request_init); module_exit(mds_request_exit); diff --git a/lustre/mds/Makefile.am b/lustre/mds/Makefile.am index c81056b..f93103a 100644 --- a/lustre/mds/Makefile.am +++ b/lustre/mds/Makefile.am @@ -3,7 +3,7 @@ # This code is issued under the GNU General Public License. # See the file COPYING in this distribution -DEFS= +DEFS:= MODULE = mds modulefs_DATA = mds.o diff --git a/lustre/mds/handler.c b/lustre/mds/handler.c index 1e40b3e..d668605 100644 --- a/lustre/mds/handler.c +++ b/lustre/mds/handler.c @@ -172,6 +172,7 @@ int mds_getattr(struct mds_request *req) rep->gid = inode->i_gid; rep->size = inode->i_size; rep->mode = inode->i_mode; + rep->valid = ~0; dput(de); return 0; diff --git a/lustre/obdclass/Makefile.am b/lustre/obdclass/Makefile.am index f92cd00..01eed46 100644 --- a/lustre/obdclass/Makefile.am +++ b/lustre/obdclass/Makefile.am @@ -1,3 +1,4 @@ +DEFS:= MODULE = obdclass modulefs_DATA = obdclass.o EXTRA_PROGRAMS = obdclass diff --git a/lustre/obdfilter/Makefile.am b/lustre/obdfilter/Makefile.am index fc10f59..403f2ad 100644 --- a/lustre/obdfilter/Makefile.am +++ b/lustre/obdfilter/Makefile.am @@ -3,6 +3,7 @@ # This code is issued under the GNU General Public License. # See the file COPYING in this distribution +DEFS:= MODULE = obdfilter modulefs_DATA = obdfilter.o EXTRA_PROGRAMS = obdfilter diff --git a/lustre/obdfs/dir.c b/lustre/obdfs/dir.c index 05edd4c..d72f2e1 100644 --- a/lustre/obdfs/dir.c +++ b/lustre/obdfs/dir.c @@ -81,7 +81,6 @@ static int ext2_commit_chunk(struct page *page, unsigned from, unsigned to) static void ext2_check_page(struct page *page) { struct inode *dir = page->mapping->host; - struct super_block *sb = dir->i_sb; unsigned chunk_size = ext2_chunk_size(dir); char *kaddr = page_address(page); // u32 max_inumber = le32_to_cpu(sb->u.ext2_sb.s_es->s_inodes_count); @@ -125,7 +124,7 @@ out: /* Too bad, we had an error */ Ebadsize: - ext2_error(sb, "ext2_check_page", + printk("ext2_check_page" "size of directory #%lu is not a multiple of chunk size", dir->i_ino ); @@ -145,7 +144,7 @@ Espan: //Einumber: // error = "inode out of bounds"; bad_entry: - ext2_error (sb, "ext2_check_page", "bad entry in directory #%lu: %s - " + printk("ext2_check_page" "bad entry in directory #%lu: %s - " "offset=%lu, inode=%lu, rec_len=%d, name_len=%d", dir->i_ino, error, (page->index<inode), @@ -153,7 +152,7 @@ bad_entry: goto fail; Eend: p = (ext2_dirent *)(kaddr + offs); - ext2_error (sb, "ext2_check_page", + printk("ext2_check_page" "entry in directory #%lu spans the page boundary" "offset=%lu, inode=%lu", dir->i_ino, (page->index<mapping->host; + ENTRY; + printk("---> writepage called ino %ld!\n", inode->i_ino); + BUG(); + rc = obdfs_brw(WRITE, inode, page, 1); + if ( !rc ) { + set_page_clean(page); + } else { + CDEBUG(D_INODE, "--> GRR %d\n", rc); + } + EXIT; + return rc; +} + + +void write_inode_pages(struct inode *inode) +{ + struct list_head *tmp = &inode->i_mapping->dirty_pages; + + while ( (tmp = tmp->next) != &inode->i_mapping->dirty_pages) { + struct page *page; + page = list_entry(tmp, struct page, list); + obdfs_writepage(page); + } +} + /* returns the page unlocked, but with a reference */ int obdfs_readpage(struct file *file, struct page *page) @@ -245,7 +275,7 @@ int obdfs_prepare_write(struct file *file, struct page *page, unsigned from, uns } - +#if 0 @@ -475,6 +505,8 @@ void rebalance(void) } } + + /* select between SYNC and ASYNC I/O methods */ int obdfs_do_writepage(struct page *page, int sync) { @@ -502,35 +534,8 @@ int obdfs_do_writepage(struct page *page, int sync) -/* returns the page unlocked, but with a reference */ -int obdfs_writepage(struct page *page) -{ - int rc; - struct inode *inode = page->mapping->host; - ENTRY; - printk("---> writepage called ino %ld!\n", inode->i_ino); - BUG(); - rc = obdfs_do_writepage(page, 1); - if ( !rc ) { - set_page_clean(page); - } else { - CDEBUG(D_INODE, "--> GRR %d\n", rc); - } - EXIT; - return rc; -} - -void write_inode_pages(struct inode *inode) -{ - struct list_head *tmp = &inode->i_mapping->dirty_pages; - - while ( (tmp = tmp->next) != &inode->i_mapping->dirty_pages) { - struct page *page; - page = list_entry(tmp, struct page, list); - obdfs_writepage(page); - } -} +#endif int obdfs_commit_write(struct file *file, struct page *page, unsigned from, unsigned to) { @@ -640,14 +645,6 @@ struct page *obdfs_getpage(struct inode *inode, unsigned long offset, return page; } - -#ifdef EXT2_OBD_DEBUG - if ((obd_debug_level & D_INFO) && obdfs_find_page_index(inode, index)) { - CDEBUG(D_INFO, "OVERWRITE: found dirty page %p, index %ld\n", - page, page->index); - } -#endif - err = obdfs_brw(READ, inode, page, create); if ( err ) { diff --git a/lustre/obdfs/symlink.c b/lustre/obdfs/symlink.c index 01484fd..b7adb80 100644 --- a/lustre/obdfs/symlink.c +++ b/lustre/obdfs/symlink.c @@ -17,8 +17,10 @@ * * ext2 symlink handling code * - * Modified for OBDFS: - * Copyright (C) 1999 Seagate Technology Inc. (author: braam@stelias.com) + * Modified for OBDFS. + * Re-written Oct 2001. + * + * Copyright (C) 2001 Cluster File Systems, Inc. (author: braam@clusterfs.com) */ #include diff --git a/lustre/ost/Makefile.am b/lustre/ost/Makefile.am index b91c497..2287f0a 100644 --- a/lustre/ost/Makefile.am +++ b/lustre/ost/Makefile.am @@ -3,6 +3,7 @@ # This code is issued under the GNU General Public License. # See the file COPYING in this distribution +DEFS:= MODULE = ost modulefs_DATA = ost.o EXTRA_PROGRAMS = ost diff --git a/lustre/tests/llmount.sh b/lustre/tests/llmount.sh new file mode 100755 index 0000000..bd3e04c --- /dev/null +++ b/lustre/tests/llmount.sh @@ -0,0 +1,46 @@ +#!/bin/sh + +R=/r + +insmod /lib/modules/2.4.17/kernel/drivers/block/loop.o +insmod $R/usr/src/obd/class/obdclass.o +insmod $R/usr/src/obd/ext2obd/obdext2.o +insmod $R/usr/src/obd/ost/ost.o +insmod $R/usr/src/obd/osc/osc.o +insmod $R/usr/src/obd/mds/mds.o +insmod $R/usr/src/obd/mdc/mdc.o +insmod $R/usr/src/obd/llight/llight.o + +dd if=/dev/zero of=/tmp/ost bs=1024 count=10000 +mke2fs -F /tmp/ost +losetup /dev/loop/0 /tmp/ost + +dd if=/dev/zero of=/tmp/mds bs=1024 count=10000 +mke2fs -F /tmp/mds +losetup /dev/loop/1 /tmp/mds + +mknod /dev/obd c 10 241 + +$R/usr/src/obd/utils/obdctl <