Whamcloud - gitweb
fairly massive change to remove write_inode methods and switch
authorbraam <braam>
Fri, 19 Oct 2001 16:06:28 +0000 (16:06 +0000)
committerbraam <braam>
Fri, 19 Oct 2001 16:06:28 +0000 (16:06 +0000)
to setattr everywhere -- dbench 50 completes, so does bonnie++.

lustre/obdfs/dir.c
lustre/obdfs/file.c
lustre/obdfs/namei.c
lustre/obdfs/rw.c
lustre/obdfs/super.c
lustre/obdfs/symlink.c

index e5f929b..444d6bb 100644 (file)
@@ -410,7 +410,7 @@ void ext2_set_link(struct inode *dir, struct ext2_dir_entry_2 *de,
        UnlockPage(page);
        ext2_put_page(page);
        dir->i_mtime = dir->i_ctime = CURRENT_TIME;
-       mark_inode_dirty(dir);
+       obdfs_change_inode(dir);
 }
 
 /*
@@ -476,7 +476,7 @@ got_it:
        ext2_set_de_type (de, inode);
        err = ext2_commit_chunk(page, from, to);
        dir->i_mtime = dir->i_ctime = CURRENT_TIME;
-       mark_inode_dirty(dir);
+       obdfs_change_inode(dir);
        /* OFFSET_CACHE */
 out_unlock:
        UnlockPage(page);
@@ -518,7 +518,7 @@ int ext2_delete_entry (struct ext2_dir_entry_2 * dir, struct page * page )
        UnlockPage(page);
        ext2_put_page(page);
        inode->i_ctime = inode->i_mtime = CURRENT_TIME;
-       mark_inode_dirty(inode);
+       obdfs_change_inode(inode);
        return err;
 }
 
index fa35fe5..4bb4e74 100644 (file)
@@ -37,6 +37,8 @@
 #include <linux/obd_support.h>
 #include <linux/obdfs.h>
 
+void obdfs_change_inode(struct inode *inode);
+
 static inline void obdfs_remove_suid(struct inode *inode)
 {
         unsigned int mode;
@@ -48,7 +50,7 @@ static inline void obdfs_remove_suid(struct inode *inode)
         mode &= inode->i_mode;
         if (mode && !capable(CAP_FSETID)) {
                 inode->i_mode &= ~mode;
-                mark_inode_dirty(inode);
+                obdfs_change_inode(inode);
         }
 }
 
@@ -68,7 +70,7 @@ obdfs_file_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
                 struct inode *inode = file->f_dentry->d_inode;
                 obdfs_remove_suid(inode);
                 inode->i_ctime = inode->i_mtime = CURRENT_TIME;
-                mark_inode_dirty(inode);
+                obdfs_change_inode(inode);
         }
         EXIT;
         return retval;
@@ -80,9 +82,9 @@ struct file_operations obdfs_file_operations = {
         mmap: generic_file_mmap,      /* mmap */
 };
 
-extern int obdfs_notify_change(struct dentry *de, struct iattr *attr);
+extern int obdfs_setattr(struct dentry *de, struct iattr *attr);
 struct inode_operations obdfs_file_inode_operations = {
         truncate: obdfs_truncate,
-        setattr: obdfs_notify_change
+       setattr: obdfs_setattr
 };
 
index 64d6035..87f04ad 100644 (file)
 #include <linux/obdfs.h>
 extern struct address_space_operations obdfs_aops;
 
+/* from super.c */
+extern void obdfs_change_inode(struct inode *inode);
+extern int obdfs_setattr(struct dentry *de, struct iattr *attr);
+
 /* from dir.c */
 extern int ext2_add_link (struct dentry *dentry, struct inode *inode);
 extern ino_t ext2_inode_by_name(struct inode * dir, struct dentry *dentry);
@@ -52,13 +56,13 @@ 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++;
-       mark_inode_dirty(inode);
+       obdfs_change_inode(inode);
 }
 
 static inline void ext2_dec_count(struct inode *inode)
 {
        inode->i_nlink--;
-       mark_inode_dirty(inode);
+       obdfs_change_inode(inode);
 }
 
 static inline int ext2_add_nondir(struct dentry *dentry, struct inode *inode)
@@ -135,7 +139,7 @@ static struct inode *obdfs_new_inode(struct inode *dir, int mode)
         err = IOPS(dir, create)(IID(dir), oa);
 
         if ( err ) {
-                CDEBUG(D_INODE, "fatal: creating new inode (err %d)\n", err);
+                printk("new_inode - fatal: err %d\n", err);
                 obdo_free(oa);
                 EXIT;
                 return ERR_PTR(err);
@@ -144,7 +148,7 @@ static struct inode *obdfs_new_inode(struct inode *dir, int mode)
         inode = iget(dir->i_sb, (ino_t)oa->o_id);
 
         if (!inode) {
-                CDEBUG(D_INODE, "fatal: get new inode %ld\n", (long)oa->o_id);
+                printk("new_inode -fatal:  %ld\n", (long)oa->o_id);
                 IOPS(dir, destroy)(IID(dir), oa);
                 obdo_free(oa);
                 EXIT;
@@ -152,7 +156,8 @@ static struct inode *obdfs_new_inode(struct inode *dir, int mode)
         }
 
         if (!list_empty(&inode->i_dentry)) {
-                CDEBUG(D_INODE, "New inode (%ld) has aliases!\n", inode->i_ino);
+                printk("new_inode -fatal: aliases %ld, ct %d lnk %d\n", (long)oa->o_id,
+ atomic_read(&inode->i_count), inode->i_nlink);
                 IOPS(dir, destroy)(IID(dir), oa);
                 obdo_free(oa);
                 iput(inode);
@@ -182,7 +187,7 @@ static int obdfs_create (struct inode * dir, struct dentry * dentry, int mode)
                inode->i_op = &obdfs_file_inode_operations;
                inode->i_fop = &obdfs_file_operations;
                inode->i_mapping->a_ops = &obdfs_aops;
-               mark_inode_dirty(inode);
+               obdfs_change_inode(inode);
                err = ext2_add_nondir(dentry, inode);
        }
        return err;
@@ -195,7 +200,7 @@ static int obdfs_mknod (struct inode * dir, struct dentry *dentry, int mode, int
        int err = PTR_ERR(inode);
        if (!IS_ERR(inode)) {
                init_special_inode(inode, mode, rdev);
-               mark_inode_dirty(inode);
+               obdfs_change_inode(inode);
                err = ext2_add_nondir(dentry, inode);
        }
        return err;
@@ -232,7 +237,7 @@ static int obdfs_symlink (struct inode * dir, struct dentry * dentry,
                memcpy(oinfo->oi_inline, symname, l);
                inode->i_size = l-1;
        }
-       mark_inode_dirty(inode);
+       obdfs_change_inode(inode);
 
        err = ext2_add_nondir(dentry, inode);
 out:
@@ -434,4 +439,5 @@ struct inode_operations obdfs_dir_inode_operations = {
        rmdir:          obdfs_rmdir,
        mknod:          obdfs_mknod,
        rename:         obdfs_rename,
+       setattr:        obdfs_setattr
 };
index 19f1032..82b0df8 100644 (file)
@@ -36,6 +36,7 @@
 #include <linux/obd_ext2.h>
 #include <linux/obdfs.h>
 
+void obdfs_change_inode(struct inode *inode);
 
 /* SYNCHRONOUS I/O for an inode */
 static int obdfs_brw(int rw, struct inode *inode, struct page *page, int create)
@@ -389,7 +390,7 @@ int obdfs_commit_write(struct file *file, struct page *page, unsigned from, unsi
         kunmap(page);
         if (pos > inode->i_size) {
                 inode->i_size = pos;
-                mark_inode_dirty(inode);
+                obdfs_change_inode(inode);
         }
         return 0;
 }
index faf46bb..b1869b8 100644 (file)
@@ -341,7 +341,7 @@ static void obdfs_read_inode(struct inode *inode)
         return;
 }
 
-static void obdfs_write_inode(struct inode *inode, int wait) 
+void obdfs_change_inode(struct inode *inode)
 {
         struct obdo *oa;
         int err;
@@ -410,6 +410,8 @@ static void obdfs_delete_inode(struct inode *inode)
         oa->o_valid = OBD_MD_FLNOTOBD;
         obdfs_from_inode(oa, inode);
 
+       /* XXX how do we know that this inode is now clean? */
+       printk("delete_inode ------> link %d\n", inode->i_nlink);
         ODEBUG(oa);
         err = IOPS(inode, destroy)(IID(inode), oa);
         obdo_free(oa);
@@ -424,7 +426,38 @@ static void obdfs_delete_inode(struct inode *inode)
 } /* obdfs_delete_inode */
 
 
-int obdfs_notify_change(struct dentry *de, struct iattr *attr)
+
+int inode_copy_attr(struct inode * inode, struct iattr * attr)
+{
+       unsigned int ia_valid = attr->ia_valid;
+       int error = 0;
+
+       if (ia_valid & ATTR_SIZE) {
+               error = vmtruncate(inode, attr->ia_size);
+               if (error)
+                       goto out;
+       }
+
+       if (ia_valid & ATTR_UID)
+               inode->i_uid = attr->ia_uid;
+       if (ia_valid & ATTR_GID)
+               inode->i_gid = attr->ia_gid;
+       if (ia_valid & ATTR_ATIME)
+               inode->i_atime = attr->ia_atime;
+       if (ia_valid & ATTR_MTIME)
+               inode->i_mtime = attr->ia_mtime;
+       if (ia_valid & ATTR_CTIME)
+               inode->i_ctime = attr->ia_ctime;
+       if (ia_valid & ATTR_MODE) {
+               inode->i_mode = attr->ia_mode;
+               if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID))
+                       inode->i_mode &= ~S_ISGID;
+       }
+out:
+       return error;
+}
+
+int obdfs_setattr(struct dentry *de, struct iattr *attr)
 {
         struct inode *inode = de->d_inode;
         struct obdo *oa;
@@ -442,7 +475,7 @@ int obdfs_notify_change(struct dentry *de, struct iattr *attr)
                 return -ENOMEM;
         }
 
-       inode_setattr(inode, attr);
+       inode_copy_attr(inode, attr);
         oa->o_id = inode->i_ino;
         obdo_from_iattr(oa, attr);
         err = IOPS(inode, setattr)(IID(inode), oa);
@@ -453,7 +486,7 @@ int obdfs_notify_change(struct dentry *de, struct iattr *attr)
         EXIT;
         obdo_free(oa);
         return err;
-} /* obdfs_notify_change */
+} /* obdfs_setattr */
 
 
 static int obdfs_statfs(struct super_block *sb, struct statfs *buf)
@@ -479,7 +512,6 @@ static int obdfs_statfs(struct super_block *sb, struct statfs *buf)
 struct super_operations obdfs_super_operations =
 {
         read_inode: obdfs_read_inode,
-        write_inode: obdfs_write_inode,
         put_inode: obdfs_put_inode,
         delete_inode: obdfs_delete_inode,
         put_super: obdfs_put_super,
index a42c0ab..01484fd 100644 (file)
@@ -40,9 +40,11 @@ static int obdfs_fast_follow_link(struct dentry *dentry, struct nameidata *nd)
         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
 };
 
 static int obdfs_readlink(struct dentry *dentry, char *buffer, int buflen)
@@ -88,4 +90,5 @@ static int obdfs_follow_link(struct dentry * dentry,
 struct inode_operations obdfs_symlink_inode_operations = {
         readlink:       obdfs_readlink,
         follow_link:    obdfs_follow_link,
+       setattr:        obdfs_setattr
 };