From a93f57342d4ab3f77a1f8519ef0e659a10c1e4b2 Mon Sep 17 00:00:00 2001
From: braam <braam>
Date: Mon, 28 Jan 2002 19:06:15 +0000
Subject: [PATCH] Changes for file creation and small fixes.

---
 lustre/include/linux/lustre_idl.h   |   3 +
 lustre/include/linux/lustre_light.h |  89 +------------------------
 lustre/include/linux/lustre_mds.h   |  12 ++--
 lustre/lib/mds_updates.c            |  11 +--
 lustre/llite/dir.c                  |  33 +++++----
 lustre/llite/namei.c                | 100 ++++++++++++++++------------
 lustre/llite/super.c                |  53 ++++++++++++++-
 lustre/mdc/mdc_reint.c              |   8 +--
 lustre/mdc/mdc_request.c            |   3 +-
 lustre/mds/handler.c                |  13 +++-
 lustre/mds/mds_reint.c              |  21 ++++++
 lustre/osc/osc_request.c            |  57 +++++++++++++++-
 lustre/ost/ost_handler.c            |   3 +-
 lustre/tests/mdcreq.sh              |   2 -
 lustre/tests/ostreq.sh              |   6 +-
 15 files changed, 245 insertions(+), 169 deletions(-)

diff --git a/lustre/include/linux/lustre_idl.h b/lustre/include/linux/lustre_idl.h
index f1d966d866..e7f74f6d39 100644
--- a/lustre/include/linux/lustre_idl.h
+++ b/lustre/include/linux/lustre_idl.h
@@ -137,6 +137,7 @@ struct obdo {
 #define OBD_MD_FLGENER  (0x00004000UL)
 #define OBD_MD_FLINLINE (0x00008000UL)
 #define OBD_MD_FLOBDMD  (0x00010000UL)
+#define OBD_MD_FLOBJID  (0x00020000UL)
 #define OBD_MD_FLNOTOBD (~(OBD_MD_FLOBDMD | OBD_MD_FLOBDFLG | OBD_MD_FLBLOCKS))
 
 /* request structure for OST's */
@@ -246,6 +247,7 @@ struct mds_req_packed {
         __u32                       ino;
         __u32                       nlink;
         __u32                       generation;
+        __u64                       objid;
 };
 
 struct mds_rep_packed {
@@ -267,6 +269,7 @@ struct mds_rep_packed {
         __u32                       ino;
         __u32                       nlink;
         __u32                       generation;
+        __u64                       objid;
 };
 
 
diff --git a/lustre/include/linux/lustre_light.h b/lustre/include/linux/lustre_light.h
index 77244d243a..fe95c0fba9 100644
--- a/lustre/include/linux/lustre_light.h
+++ b/lustre/include/linux/lustre_light.h
@@ -19,8 +19,7 @@
 
 struct ll_inode_info {
         int              lli_flags;
-        struct list_head lli_inodes;
-        struct list_head lli_pages;
+	__u64            lli_objid; 
         char             lli_inline[OBD_INLINESZ];
 };
 
@@ -69,56 +68,7 @@ static void inline ll_from_inode(struct obdo *oa, struct inode *inode)
         }
 } /* ll_from_inode */
 
-static __inline__ void mds_rep_to_inode(struct inode *dst, struct mds_rep *rep)
-{
-
-        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);
-
-        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)) {
-			obd_rdev rdev = *((obd_rdev *)oa->o_inline);
-			CDEBUG(D_INODE,
-			       "copying device %x from obdo to inode\n", rdev);
-			init_special_inode(inode, inode->i_mode, rdev);
-		} else {
-			CDEBUG(D_INFO, "copying inline from obdo to inode\n");
-			memcpy(oinfo->lli_inline, oa->o_inline, OBD_INLINESZ);
-		}
-                oinfo->lli_flags |= OBD_FL_INLINEDATA;
-        }
-#endif 
-} /* ll_to_inode */
 
 
 
@@ -229,19 +179,6 @@ static inline struct ll_sb_info *ll_i2sbi(struct inode *inode)
         return (struct ll_sb_info *) &(inode->i_sb->u.generic_sbp);
 }
 
-static inline struct list_head *ll_iplist(struct inode *inode) 
-{
-        struct ll_inode_info *info = ll_i2info(inode);
-
-        return &info->lli_pages;
-}
-
-static inline struct list_head *ll_islist(struct inode *inode) 
-{
-        struct ll_inode_info *info = ll_i2info(inode);
-
-        return &info->lli_inodes;
-}
 
 static inline struct list_head *ll_slist(struct inode *inode) 
 {
@@ -284,29 +221,5 @@ static void inline ll_set_size (struct inode *inode, obd_size size)
 #define OBDAddCachePage(page)   test_and_set_bit(PG_obdcache, &(page)->flags)
 #define OBDClearCachePage(page) clear_bit(PG_obdcache, &(page)->flags)
 
-static inline void ll_print_plist(struct inode *inode) 
-{
-        struct list_head *page_list = ll_iplist(inode);
-        struct list_head *tmp;
-
-        CDEBUG(D_INFO, "inode %ld: page", inode->i_ino);
-        /* obd_down(&ll_i2sbi(inode)->ll_list_mutex); */
-        if (list_empty(page_list)) {
-                CDEBUG(D_INFO, " list empty\n");
-                obd_up(&ll_i2sbi(inode)->ll_list_mutex);
-                return;
-        }
-
-        tmp = page_list;
-        while ( (tmp = tmp->next) != page_list) {
-                struct ll_pgrq *pgrq;
-                pgrq = list_entry(tmp, struct ll_pgrq, rq_plist);
-                CDEBUG(D_INFO, " %p", pgrq->rq_page);
-        }
-        CDEBUG(D_INFO, "\n");
-        /* obd_up(&ll_i2sbi(inode)->ll_list_mutex); */
-}
-#include <linux/obdo.h>
-
 #endif
 
diff --git a/lustre/include/linux/lustre_mds.h b/lustre/include/linux/lustre_mds.h
index 1ee99b5e12..a7fb923b70 100644
--- a/lustre/include/linux/lustre_mds.h
+++ b/lustre/include/linux/lustre_mds.h
@@ -99,6 +99,7 @@ struct mds_req {
         __u32                       ino;
         __u32                       nlink;
         __u32                       generation;
+        __u64                       objid;
 };
 
 /* more or less identical to the packed structure, except for the pointers */
@@ -121,6 +122,7 @@ struct mds_rep {
         __u32                       ino;
         __u32                       nlink;
         __u32                       generation;
+        __u64                       objid;
 };
 
 struct mds_update_record { 
@@ -154,12 +156,11 @@ int mds_reint_rec(struct mds_update_record *r, struct mds_request *req);
 int mds_update_unpack(char *buf, int len, struct mds_update_record *r); 
 
 void mds_setattr_pack(struct mds_rec_setattr *rec, struct inode *inode, struct iattr *iattr);
-void mds_create_pack(struct mds_rec_create *rec, struct inode *inode, char *name, __u32 mode, __u64 id, __u32 uid, __u32 gid, __u64 time);
+void mds_create_pack(struct mds_rec_create *rec, struct inode *inode, const char *name, int namelen, __u32 mode, __u64 id, __u32 uid, __u32 gid, __u64 time);
 
 /* mds/handler.c */
 struct dentry *mds_fid2dentry(struct mds_obd *mds, struct ll_fid *fid, struct vfsmount **mnt);
 
-
 /* llight/request.c */
 int mdc_getattr(ino_t ino, int type, int valid, 
 		struct mds_rep  **mds_reply, struct mds_rep_hdr **hdr);
@@ -167,12 +168,11 @@ int mdc_setattr(struct inode *inode, struct iattr *iattr,
 		struct mds_rep  **mds_reply, struct mds_rep_hdr **hdr);
 int mdc_readpage(ino_t ino, int type, __u64 offset, char *addr, 
                  struct mds_rep  **rep, struct mds_rep_hdr **hdr);
-int mdc_create(struct inode *dir, char *name, int mode, __u64 id, 
-               __u32 uid, __u32 gid, __u64 time, 
+int mdc_create(struct inode *dir, const char *name, 
+               int namelen, int mode, __u64 id, __u32 uid, 
+               __u32 gid, __u64 time, 
                struct mds_rep **rep, struct mds_rep_hdr **hdr);
 
-
-
 /* ioctls for trying requests */
 #define IOC_REQUEST_TYPE                   'f'
 #define IOC_REQUEST_MIN_NR                 30
diff --git a/lustre/lib/mds_updates.c b/lustre/lib/mds_updates.c
index 802e909088..ad48e5c3c2 100644
--- a/lustre/lib/mds_updates.c
+++ b/lustre/lib/mds_updates.c
@@ -35,12 +35,12 @@
 
 /* packing of MDS records */
 
-void mds_create_pack(struct mds_rec_create *rec, struct inode *inode, char *name, __u32 mode, __u64 id, __u32 uid, __u32 gid, __u64 time)
+void mds_create_pack(struct mds_rec_create *rec, struct inode *inode, const char *name, int namelen, __u32 mode, __u64 id, __u32 uid, __u32 gid, __u64 time)
 {
 	char *tmp = (char *)rec + sizeof(*rec); 
 	/* XXX do something about time, uid, gid */
 	rec->cr_reclen = 
-		HTON__u32(sizeof(*rec)) + size_round(strlen(name) + 1);
+		HTON__u32(sizeof(*rec) + size_round(namelen + 1));
 	rec->cr_opcode = HTON__u32(REINT_CREATE);
 
 	ll_inode2fid(&rec->cr_fid, inode); 
@@ -49,8 +49,9 @@ void mds_create_pack(struct mds_rec_create *rec, struct inode *inode, char *name
 	rec->cr_uid = HTON__u32(uid);
 	rec->cr_gid = HTON__u32(gid);
 	rec->cr_time = HTON__u64(time);
-	rec->cr_namelen = strlen(name);
-	LOGL(name, rec->cr_namelen + 1, tmp); 
+	rec->cr_namelen = namelen;
+	LOGL(name, namelen, tmp); 
+	*tmp = '\0';
 }
 
 
@@ -79,7 +80,7 @@ static int mds_update_hdr_unpack(char *buf, int len, struct mds_update_record *r
 	
 	r->ur_reclen = NTOH__u32(hdr->ur_reclen);
 	if (len < sizeof(*hdr) || len != r->ur_reclen) { 
-		printk(__FUNCTION__ "invalid buffer length\n"); 
+		printk(__FUNCTION__ ": invalid buffer length\n"); 
 		return -EFAULT;
 	}
 	r->ur_opcode = NTOH__u32(hdr->ur_opcode); 
diff --git a/lustre/llite/dir.c b/lustre/llite/dir.c
index ebc68e973e..9265dacb20 100644
--- a/lustre/llite/dir.c
+++ b/lustre/llite/dir.c
@@ -1,5 +1,4 @@
 /*
- *  linux/fs/ext2/dir.c
  *
  * Copyright (C) 1992, 1993, 1994, 1995
  * Remy Card (card@masi.ibp.fr)
@@ -9,6 +8,7 @@
  *  from
  *
  *  linux/fs/minix/dir.c
+ *  linux/fs/ext2/dir.c
  *
  *  Copyright (C) 1991, 1992  Linus Torvalds
  *
@@ -17,13 +17,18 @@
  *  Big-endian to little-endian byte-swapping/bitmaps by
  *        David S. Miller (davem@caip.rutgers.edu), 1995
  *
- * All code that works with directory layout had been switched to pagecache
- * and moved here. AV
+ *  All code that works with directory layout had been switched to pagecache
+ *  and moved here. AV
+ *   
+ *  Adapted for Lustre Light
+ *  Copyright (C) 2002, Cluster File Systems, Inc.
+ * 
  */
 
 #include <linux/fs.h>
 #include <linux/ext2_fs.h>
 #include <linux/pagemap.h>
+#include <linux/mm.h>
 #include <linux/obd_support.h>
 #include <linux/locks.h>
 
@@ -32,9 +37,6 @@ typedef struct ext2_dir_entry_2 ext2_dirent;
 #define PageChecked(page)        test_bit(PG_checked, &(page)->flags)
 #define SetPageChecked(page)     set_bit(PG_checked, &(page)->flags)
 
-
-
-
 int waitfor_one_page(struct page *page)
 {
 	int error = 0;
@@ -70,14 +72,19 @@ static inline unsigned long dir_pages(struct inode *inode)
 	return (inode->i_size+PAGE_CACHE_SIZE-1)>>PAGE_CACHE_SHIFT;
 }
 
+extern void set_page_clean(struct page *page); 
+
 static int ext2_commit_chunk(struct page *page, unsigned from, unsigned to)
 {
 	struct inode *dir = page->mapping->host;
 	int err = 0;
 	dir->i_version = ++event;
-	page->mapping->a_ops->commit_write(NULL, page, from, to);
-	if (IS_SYNC(dir))
-		err = waitfor_one_page(page);
+	SetPageUptodate(page);
+	set_page_clean(page);
+
+	//page->mapping->a_ops->commit_write(NULL, page, from, to);
+	//if (IS_SYNC(dir))
+	//	err = waitfor_one_page(page);
 	return err;
 }
 
@@ -421,7 +428,7 @@ void ext2_set_link(struct inode *dir, struct ext2_dir_entry_2 *de,
 /*
  *	Parent is locked.
  */
-int ext2_add_link (struct dentry *dentry, struct inode *inode)
+int ll_add_link (struct dentry *dentry, struct inode *inode)
 {
 	struct inode *dir = dentry->d_parent->d_inode;
 	const char *name = dentry->d_name.name;
@@ -470,9 +477,9 @@ got_it:
 	from = (char*)de - (char*)page_address(page);
 	to = from + rec_len;
 	lock_page(page);
-	err = page->mapping->a_ops->prepare_write(NULL, page, from, to);
-	if (err)
-		goto out_unlock;
+	//err = page->mapping->a_ops->prepare_write(NULL, page, from, to);
+	//if (err)
+	//	goto out_unlock;
 	if (de->inode) {
 		ext2_dirent *de1 = (ext2_dirent *) ((char *) de + name_len);
 		de1->rec_len = cpu_to_le16(rec_len - name_len);
diff --git a/lustre/llite/namei.c b/lustre/llite/namei.c
index 408ff335db..097f4866c1 100644
--- a/lustre/llite/namei.c
+++ b/lustre/llite/namei.c
@@ -38,7 +38,7 @@ 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);
+extern int ll_add_link (struct dentry *dentry, struct inode *inode);
 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,
@@ -66,7 +66,7 @@ static inline void ext2_dec_count(struct inode *inode)
 static inline int ext2_add_nondir(struct dentry *dentry, struct inode *inode)
 {
 	int err;
-	err = ext2_add_link(dentry, inode);
+	err = ll_add_link(dentry, inode);
 	if (!err) {
 		d_instantiate(dentry, inode);
 		return 0;
@@ -130,52 +130,47 @@ static inline int ext2_match (int len, const char * const name,
         return !memcmp(name, de->name, len);
 }
 
-static struct inode *ll_new_inode(struct inode *dir, int mode)
+static struct inode *ll_create_node(struct inode *dir, const char *name, 
+				    int namelen, int mode, __u64 id)
 {
-        struct obdo *oa;
         struct inode *inode;
+	struct mds_rep *rep;
+	struct mds_rep_hdr *hdr;
         int err;
 
         ENTRY;
 
-        oa = obdo_alloc();
-        if (!oa) {
+     	err = mdc_create(dir, name, namelen, mode, id,
+			 current->uid, current->gid, CURRENT_TIME, 
+			 &rep, &hdr); 
+	if (err) { 
                 EXIT;
-                return ERR_PTR(-ENOMEM);
-        }
-
-        /* Send a hint to the create method on the type of file to create */
-        oa->o_mode = mode;
-        oa->o_valid |= OBD_MD_FLMODE;
-	CDEBUG(D_INODE, "\n");
-        err = obd_create(IID(dir), oa);
-	CDEBUG(D_INODE, "\n");
-
-        if ( err ) {
-                printk("new_inode - fatal: err %d\n", err);
-                obdo_free(oa);
-                EXIT;
-                return ERR_PTR(err);
-        }
-	CDEBUG(D_INODE, "obdo mode %o\n", oa->o_mode);
-
-        inode = iget4(dir->i_sb, (ino_t)oa->o_id, NULL, oa);
-	CDEBUG(D_INODE, "\n");
-        obdo_free(oa);
-
-        if (!inode) {
-                printk("new_inode -fatal:  %ld\n", (long)oa->o_id);
-                obd_destroy(IID(dir), oa);
+		return ERR_PTR(err);
+	}
+	if ( hdr->status) {
+		EXIT;
+		return ERR_PTR(hdr->status);
+	}
+	rep->valid = OBD_MD_FLNOTOBD;
+
+	rep->objid = id; 
+	rep->nlink = 1;
+	rep->mode = mode;
+	printk("-- new_inode: objid %lld, ino %d, mode %o\n", 
+	       rep->objid, rep->ino, rep->mode); 
+
+        inode = iget4(dir->i_sb, rep->ino, NULL, rep);
+        if (IS_ERR(inode)) {
+                printk(__FUNCTION__ ": new_inode -fatal:  %ld\n", 
+		       PTR_ERR(inode));
                 EXIT;
                 return ERR_PTR(-EIO);
         }
 
         if (!list_empty(&inode->i_dentry)) {
-                printk("new_inode -fatal: aliases %ld, ct %d lnk %d\n", 
-		       (long)oa->o_id,
-		       atomic_read(&inode->i_count), 
+                printk("new_inode -fatal: aliases %d, ct %d lnk %d\n", 
+		       rep->ino, atomic_read(&inode->i_count), 
 		       inode->i_nlink);
-                obd_destroy(IID(dir), oa);
                 iput(inode);
                 EXIT;
                 return ERR_PTR(-EIO);
@@ -196,21 +191,38 @@ static struct inode *ll_new_inode(struct inode *dir, int mode)
  */
 static int ll_create (struct inode * dir, struct dentry * dentry, int mode)
 {
-	struct inode * inode = ll_new_inode (dir, mode);
-	int err = PTR_ERR(inode);
+	int err; 
+	struct obdo oa;
+	struct inode * inode;
+
+	err = obd_create(IID(dir), &oa);  
+	if (err) { 
+		EXIT; 
+		return err;
+	}
+
+	mode = mode | S_IFREG;
+	printk("ll_create: name %s mode %o\n", dentry->d_name.name, mode);
+	inode = ll_create_node(dir, dentry->d_name.name, 
+			       dentry->d_name.len, 
+			       mode, oa.o_id);
+	err = PTR_ERR(inode);
 	if (!IS_ERR(inode)) {
+		// XXX clean up the object
 		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);
 	}
+	EXIT;
 	return err;
 } /* ll_create */
 
 
 static int ll_mknod (struct inode * dir, struct dentry *dentry, int mode, int rdev)
 {
-	struct inode * inode = ll_new_inode (dir, mode);
+	struct inode * inode = ll_create_node(dir, dentry->d_name.name, 
+					      dentry->d_name.len, mode, 0);
 	int err = PTR_ERR(inode);
 	if (!IS_ERR(inode)) {
 		init_special_inode(inode, mode, rdev);
@@ -231,7 +243,9 @@ static int ll_symlink (struct inode * dir, struct dentry * dentry,
 	if (l > sb->s_blocksize)
 		goto out;
 
-	inode = ll_new_inode (dir, S_IFLNK | S_IRWXUGO);
+	inode = ll_create_node(dir, dentry->d_name.name, 
+			       dentry->d_name.len, 
+			       S_IFLNK | S_IRWXUGO, 0);
 	err = PTR_ERR(inode);
 	if (IS_ERR(inode))
 		goto out;
@@ -293,7 +307,9 @@ static int ll_mkdir(struct inode * dir, struct dentry * dentry, int mode)
 
 	ext2_inc_count(dir);
 
-	inode = ll_new_inode (dir, S_IFDIR | mode);
+	inode = ll_create_node (dir, dentry->d_name.name, 
+				dentry->d_name.len,
+				S_IFDIR | mode, 0);
 	err = PTR_ERR(inode);
 	if (IS_ERR(inode))
 		goto out_dir;
@@ -308,7 +324,7 @@ static int ll_mkdir(struct inode * dir, struct dentry * dentry, int mode)
 	if (err)
 		goto out_fail;
 
-	err = ext2_add_link(dentry, inode);
+	err = ll_add_link(dentry, inode);
 	if (err)
 		goto out_fail;
 
@@ -414,7 +430,7 @@ static int ll_rename (struct inode * old_dir, struct dentry * old_dentry,
 				goto out_dir;
 		}
 		ext2_inc_count(old_inode);
-		err = ext2_add_link(new_dentry, old_inode);
+		err = ll_add_link(new_dentry, old_inode);
 		if (err) {
 			ext2_dec_count(old_inode);
 			goto out_dir;
diff --git a/lustre/llite/super.c b/lustre/llite/super.c
index 357be67b77..3b33fa40a2 100644
--- a/lustre/llite/super.c
+++ b/lustre/llite/super.c
@@ -274,6 +274,56 @@ static int ll_statfs(struct super_block *sb, struct statfs *buf)
         return err; 
 }
 
+static void inline ll_to_inode(struct inode *dst, struct mds_rep *rep)
+{
+	struct ll_inode_info *ii = 
+		(struct ll_inode_info *) &dst->u.generic_ip;
+
+	/* core attributes first */
+        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;
+
+	/* this will become more elaborate for striping etc */ 
+	if (rep->valid & OBD_MD_FLOBJID) 
+		ii->lli_objid = rep->objid;
+#if 0
+
+        if (obdo_has_inline(oa)) {
+		if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) ||
+		    S_ISFIFO(inode->i_mode)) {
+			obd_rdev rdev = *((obd_rdev *)oa->o_inline);
+			CDEBUG(D_INODE,
+			       "copying device %x from obdo to inode\n", rdev);
+			init_special_inode(inode, inode->i_mode, rdev);
+		} else {
+			CDEBUG(D_INFO, "copying inline from obdo to inode\n");
+			memcpy(oinfo->lli_inline, oa->o_inline, OBD_INLINESZ);
+		}
+                oinfo->lli_flags |= OBD_FL_INLINEDATA;
+        }
+#endif 
+} /* ll_to_inode */
+
 static inline void ll_read_inode2(struct inode *inode, void *opaque)
 {
 	struct mds_rep *rep = opaque; 
@@ -281,9 +331,6 @@ static inline void ll_read_inode2(struct inode *inode, void *opaque)
 	ENTRY;
 	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 */
-
         /* OIDEBUG(inode); */
 
         if (S_ISREG(inode->i_mode)) {
diff --git a/lustre/mdc/mdc_reint.c b/lustre/mdc/mdc_reint.c
index 734ccadb42..9f67163fdb 100644
--- a/lustre/mdc/mdc_reint.c
+++ b/lustre/mdc/mdc_reint.c
@@ -64,8 +64,8 @@ int mdc_setattr(struct inode *inode, struct iattr *iattr,
 	return rc;
 }
 
-int mdc_create(struct inode *dir, char *name, int mode, __u64 id, 
-	       __u32 uid, __u32 gid, __u64 time, 
+int mdc_create(struct inode *dir, const char *name, int namelen, 
+	       int mode, __u64 id, __u32 uid, __u32 gid, __u64 time, 
 		struct mds_rep **rep, struct mds_rep_hdr **hdr)
 {
 	int rc; 
@@ -73,7 +73,7 @@ int mdc_create(struct inode *dir, char *name, int mode, __u64 id,
 	struct mds_rec_create *rec;
 
 	request = mds_prep_req(MDS_REINT, 0, NULL, 
-			       sizeof(*rec) + size_round(strlen(name)), 
+			       sizeof(*rec) + size_round(namelen + 1), 
 			       NULL);
 	if (!request) { 
 		printk("mdc_create: cannot pack\n");
@@ -81,7 +81,7 @@ int mdc_create(struct inode *dir, char *name, int mode, __u64 id,
 	}
 
 	rec = mds_req_tgt(request->rq_req);
-	mds_create_pack(rec, dir, name, mode, id, uid, gid, time); 
+	mds_create_pack(rec, dir, name, namelen, mode, id, uid, gid, time); 
 
 	rc = mdc_reint(request);
 
diff --git a/lustre/mdc/mdc_request.c b/lustre/mdc/mdc_request.c
index 1eee16c861..688196ead2 100644
--- a/lustre/mdc/mdc_request.c
+++ b/lustre/mdc/mdc_request.c
@@ -276,7 +276,8 @@ static int request_ioctl(struct inode *inode, struct file *file,
 		iattr.ia_atime = 0;
 		iattr.ia_valid = ATTR_MODE | ATTR_ATIME;
 
-		err = mdc_create(&inode, "foofile", 0100707, 47114711, 
+		err = mdc_create(&inode, "foofile", strlen("foofile"), 
+				 0100707, 47114711, 
 				 11, 47, 0, NULL, &hdr);
 		printk("-- done err %d\n", err);
 		if (!err) { 
diff --git a/lustre/mds/handler.c b/lustre/mds/handler.c
index c66f26cca4..fe93fd7638 100644
--- a/lustre/mds/handler.c
+++ b/lustre/mds/handler.c
@@ -75,9 +75,12 @@ int mds_sendpage(struct mds_request *req, struct file *file,
 		    __u64 offset, struct niobuf *dst)
 {
 	int rc; 
-
+	mm_segment_t oldfs = get_fs();
+	/* dst->addr is a user address, but in a different task! */
+	set_fs(KERNEL_DS); 
 	rc = generic_file_read(file, (char *)(long)dst->addr, 
 			      PAGE_SIZE, &offset); 
+	set_fs(oldfs);
 
 	if (rc != PAGE_SIZE) 
 		return -EIO;
@@ -193,6 +196,11 @@ struct dentry *mds_fid2dentry(struct mds_obd *mds, struct ll_fid *fid, struct vf
 	return result;
 }
 
+static inline void mds_get_objid(struct inode *inode, __u64 *id)
+{
+	memcpy(id, &inode->u.ext2_i.i_data, sizeof(*id));
+}
+
 int mds_getattr(struct mds_request *req)
 {
 	struct dentry *de = mds_fid2dentry(req->rq_obd, &req->rq_req->fid1, 
@@ -228,8 +236,9 @@ int mds_getattr(struct mds_request *req)
 	rep->gid = inode->i_gid;
 	rep->size = inode->i_size;
 	rep->mode = inode->i_mode;
+	rep->nlink = inode->i_nlink;
 	rep->valid = ~0;
-
+	mds_get_objid(inode, &rep->objid);
 	dput(de); 
 	return 0;
 }
diff --git a/lustre/mds/mds_reint.c b/lustre/mds/mds_reint.c
index d51e6698c4..eea758eafe 100644
--- a/lustre/mds/mds_reint.c
+++ b/lustre/mds/mds_reint.c
@@ -52,12 +52,23 @@ static int mds_reint_setattr(struct mds_update_record *rec, struct mds_request *
 	return 0;
 }
 
+/* 
+   XXX nasty hack: store the object id in the first two
+   direct block spots 
+*/
+static inline void mds_store_objid(struct inode *inode, __u64 *id)
+{
+	memcpy(&inode->u.ext2_i.i_data, id, sizeof(*id));
+}
+
+
 static int mds_reint_create(struct mds_update_record *rec, 
 			    struct mds_request *req)
 {
 	struct vfsmount *mnt;
 	int type = rec->ur_mode & S_IFMT;
 	struct dentry *de;
+	struct mds_rep *rep = req->rq_rep;
 	struct dentry *dchild; 
 	int rc;
 
@@ -88,6 +99,16 @@ static int mds_reint_create(struct mds_update_record *rec,
 	switch (type) {
 	case S_IFREG: { 
 		rc = vfs_create(de->d_inode, dchild, rec->ur_mode);
+		
+		if (!rc) { 
+			mds_store_objid(dchild->d_inode, &rec->ur_id); 
+			dchild->d_inode->i_atime = rec->ur_time;
+			dchild->d_inode->i_ctime = rec->ur_time;
+			dchild->d_inode->i_mtime = rec->ur_time;
+			dchild->d_inode->i_uid = rec->ur_uid;
+			dchild->d_inode->i_gid = rec->ur_gid;
+			rep->ino = dchild->d_inode->i_ino;
+		}
 		break;
 	}
 	case S_IFDIR: { 
diff --git a/lustre/osc/osc_request.c b/lustre/osc/osc_request.c
index ae127295f9..da8a9adad6 100644
--- a/lustre/osc/osc_request.c
+++ b/lustre/osc/osc_request.c
@@ -128,6 +128,30 @@ int osc_connect(struct obd_conn *conn)
 	return rc;
 }
 
+int osc_disconnect(struct obd_conn *conn)
+{
+	struct ost_request *request;
+	int rc; 
+	ENTRY;
+	
+	request = osc_prep_req(sizeof(*request), OST_DISCONNECT);
+	if (!request) { 
+		printk("osc_connect: cannot pack req!\n"); 
+		return -ENOMEM;
+	}
+
+	rc = osc_queue_wait(conn, request);
+	if (rc) { 
+		EXIT;
+		goto out;
+	}
+ out:
+	osc_free_req(request);
+	EXIT;
+	return rc;
+}
+
+
 int osc_getattr(struct obd_conn *conn, struct obdo *oa)
 {
 	struct ost_request *request;
@@ -158,6 +182,35 @@ int osc_getattr(struct obd_conn *conn, struct obdo *oa)
 	return 0;
 }
 
+int osc_create(struct obd_conn *conn, struct obdo *oa)
+{
+	struct ost_request *request;
+	int rc; 
+
+	if (!oa) { 
+		printk(__FUNCTION__ ": oa NULL\n"); 
+	}
+	request = osc_prep_req(sizeof(*request), OST_CREATE);
+	if (!request) { 
+		printk("osc_connect: cannot pack req!\n"); 
+		return -ENOMEM;
+	}
+	
+	memcpy(&request->rq_req->oa, oa, sizeof(*oa));
+	request->rq_req->oa.o_valid = ~0;
+	
+	rc = osc_queue_wait(conn, request);
+	if (rc) { 
+		EXIT;
+		goto out;
+	}
+	memcpy(oa, &request->rq_rep->oa, sizeof(*oa));
+
+ out:
+	osc_free_req(request);
+	return 0;
+}
+
 
 /* mount the file system (secretly) */
 static int osc_setup(struct obd_device *obddev, obd_count len,
@@ -207,8 +260,10 @@ static int osc_cleanup(struct obd_device * obddev)
 struct obd_ops osc_obd_ops = { 
 	o_setup:   osc_setup,
 	o_cleanup: osc_cleanup, 
+	o_create: osc_create,
 	o_getattr: osc_getattr,
-	o_connect: osc_connect
+	o_connect: osc_connect,
+	o_disconnect: osc_disconnect
 };
 
 static int __init osc_init(void)
diff --git a/lustre/ost/ost_handler.c b/lustre/ost/ost_handler.c
index 4e7b04fddd..3da3ec35df 100644
--- a/lustre/ost/ost_handler.c
+++ b/lustre/ost/ost_handler.c
@@ -1,5 +1,6 @@
 /*
- *  linux/mds/handler.c
+ *  ost/ost_handler.c
+ *  Storage Target Handling functions
  *  
  *  Lustre Object Server Module (OST)
  * 
diff --git a/lustre/tests/mdcreq.sh b/lustre/tests/mdcreq.sh
index 4625991433..411a147d81 100644
--- a/lustre/tests/mdcreq.sh
+++ b/lustre/tests/mdcreq.sh
@@ -2,8 +2,6 @@
 
 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
diff --git a/lustre/tests/ostreq.sh b/lustre/tests/ostreq.sh
index 634f4436b1..bebc73a20f 100644
--- a/lustre/tests/ostreq.sh
+++ b/lustre/tests/ostreq.sh
@@ -2,11 +2,15 @@
 
 R=/r
 
-insmod /lib/modules/2.4.17/kernel/drivers/block/loop.o
+# 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/fs bs=1024 count=10000
 mke2fs -F /tmp/fs
-- 
GitLab