From 5d856051340ce9a4e38df6b57d48934a9ee598e6 Mon Sep 17 00:00:00 2001 From: braam Date: Fri, 19 Oct 2001 16:06:28 +0000 Subject: [PATCH] fairly massive change to remove write_inode methods and switch to setattr everywhere -- dbench 50 completes, so does bonnie++. --- lustre/obdfs/dir.c | 6 +++--- lustre/obdfs/file.c | 10 ++++++---- lustre/obdfs/namei.c | 22 ++++++++++++++-------- lustre/obdfs/rw.c | 3 ++- lustre/obdfs/super.c | 42 +++++++++++++++++++++++++++++++++++++----- lustre/obdfs/symlink.c | 3 +++ 6 files changed, 65 insertions(+), 21 deletions(-) diff --git a/lustre/obdfs/dir.c b/lustre/obdfs/dir.c index e5f929b..444d6bb 100644 --- a/lustre/obdfs/dir.c +++ b/lustre/obdfs/dir.c @@ -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; } diff --git a/lustre/obdfs/file.c b/lustre/obdfs/file.c index fa35fe5..4bb4e74 100644 --- a/lustre/obdfs/file.c +++ b/lustre/obdfs/file.c @@ -37,6 +37,8 @@ #include #include +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 }; diff --git a/lustre/obdfs/namei.c b/lustre/obdfs/namei.c index 64d6035..87f04ad 100644 --- a/lustre/obdfs/namei.c +++ b/lustre/obdfs/namei.c @@ -34,6 +34,10 @@ #include 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 }; diff --git a/lustre/obdfs/rw.c b/lustre/obdfs/rw.c index 19f1032..82b0df8 100644 --- a/lustre/obdfs/rw.c +++ b/lustre/obdfs/rw.c @@ -36,6 +36,7 @@ #include #include +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; } diff --git a/lustre/obdfs/super.c b/lustre/obdfs/super.c index faf46bb..b1869b8 100644 --- a/lustre/obdfs/super.c +++ b/lustre/obdfs/super.c @@ -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, diff --git a/lustre/obdfs/symlink.c b/lustre/obdfs/symlink.c index a42c0ab..01484fd 100644 --- a/lustre/obdfs/symlink.c +++ b/lustre/obdfs/symlink.c @@ -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 }; -- 1.8.3.1