From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chris Mason Subject: Re: [PATCH/RFC] Replacing iget4/read_inode2 with icreate Date: 30 Apr 2002 12:40:33 -0400 Sender: linux-fsdevel-owner@vger.kernel.org Message-ID: <1020184833.6770.285.camel@tiny> References: <20020429232429.GA24927@ravel.coda.cs.cmu.edu> <1020182047.28076.54.camel@jen.americas.sgi.com> <20020430161415.GA23998@ravel.coda.cs.cmu.edu> Mime-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 7bit Cc: Steve Lord , Alexander Viro , linux-fsdevel@vger.kernel.org Return-path: To: Jan Harkes In-Reply-To: <20020430161415.GA23998@ravel.coda.cs.cmu.edu> List-Id: linux-fsdevel.vger.kernel.org Your reiserfs bits work, but I prefer reiserfs_read_locked_inode over reiserfs_init_inode2 (we've got init_inode and reiserfs_init_inode it got confusing.... Below is a slightly updated version (reiserfs parts only), the only difference is the name change, and it is against the reiserfs patch the namesys guys posted yesterday there was a trivial reject in fs/reiserfs/super.c. These work for me under light testing on 2.5.11 + Viro's fastwalk fixes + reiserfs update. -chris ===== fs/reiserfs/inode.c 1.51 vs edited ===== --- 1.51/fs/reiserfs/inode.c Fri Apr 26 11:09:07 2002 +++ edited/fs/reiserfs/inode.c Tue Apr 30 09:31:28 2002 @@ -30,7 +30,7 @@ lock_kernel() ; /* The = 0 happens when we abort creating a new inode for some reason like lack of space.. */ - if (INODE_PKEY(inode)->k_objectid != 0) { /* also handles bad_inode case */ + if (!(inode->i_state & I_NEW) && INODE_PKEY(inode)->k_objectid != 0) { /* also handles bad_inode case */ down (&inode->i_sem); journal_begin(&th, inode->i_sb, jbegin_count) ; @@ -1118,21 +1118,22 @@ } +int reiserfs_init_inode (struct inode * inode, void *p) +{ + struct reiserfs_iget4_args *args = (struct reiserfs_iget4_args *)p ; + INODE_PKEY(inode)->k_dir_id = cpu_to_le32(args->objectid); + return 0; +} + /* looks for stat data in the tree, and fills up the fields of in-core inode stat data fields */ -void reiserfs_read_inode2 (struct inode * inode, void *p) +void reiserfs_read_locked_inode (struct inode * inode, struct reiserfs_iget4_args *args) { INITIALIZE_PATH (path_to_sd); struct cpu_key key; - struct reiserfs_iget4_args *args = (struct reiserfs_iget4_args *)p ; unsigned long dirino; int retval; - if (!p) { - reiserfs_make_bad_inode(inode) ; - return; - } - dirino = args->objectid ; /* set version 1, version 2 could be used too, because stat data @@ -1202,8 +1203,7 @@ * inode numbers (objectids) are distinguished by parent directory ids. * */ -static int reiserfs_find_actor( struct inode *inode, - unsigned long inode_no, void *opaque ) +static int reiserfs_find_actor( struct inode *inode, void *opaque ) { struct reiserfs_iget4_args *args; @@ -1218,10 +1218,15 @@ struct reiserfs_iget4_args args ; args.objectid = key->on_disk_key.k_dir_id ; - inode = iget4 (s, key->on_disk_key.k_objectid, - reiserfs_find_actor, (void *)(&args)); + inode = icreate (s, key->on_disk_key.k_objectid, + reiserfs_find_actor, reiserfs_init_inode, (void *)(&args)); if (!inode) return ERR_PTR(-ENOMEM) ; + + if (inode->i_state & I_NEW) { + reiserfs_read_locked_inode(inode, &args); + unlock_new_inode(inode); + } if (comp_short_keys (INODE_PKEY (inode), key) || is_bad_inode (inode)) { /* either due to i/o error or a stale NFS handle */ ===== fs/reiserfs/super.c 1.43 vs edited ===== --- 1.43/fs/reiserfs/super.c Mon Apr 29 08:55:12 2002 +++ edited/fs/reiserfs/super.c Tue Apr 30 09:31:49 2002 @@ -471,7 +471,6 @@ alloc_inode: reiserfs_alloc_inode, destroy_inode: reiserfs_destroy_inode, read_inode: reiserfs_read_inode, - read_inode2: reiserfs_read_inode2, write_inode: reiserfs_write_inode, dirty_inode: reiserfs_dirty_inode, delete_inode: reiserfs_delete_inode, @@ -1148,10 +1147,16 @@ s->s_flags |= MS_RDONLY ; } args.objectid = REISERFS_ROOT_PARENT_OBJECTID ; - root_inode = iget4 (s, REISERFS_ROOT_OBJECTID, 0, (void *)(&args)); + root_inode = icreate (s, REISERFS_ROOT_OBJECTID, 0, reiserfs_init_inode, + (void *)(&args)); if (!root_inode) { printk ("jmacd-10: reiserfs_fill_super: get root inode failed\n"); goto error; + } + + if (root_inode->i_state & I_NEW) { + reiserfs_read_locked_inode(root_inode, &args); + unlock_new_inode(root_inode); } s->s_root = d_alloc_root(root_inode); ===== include/linux/reiserfs_fs.h 1.32 vs edited ===== --- 1.32/include/linux/reiserfs_fs.h Fri Apr 26 12:03:26 2002 +++ edited/include/linux/reiserfs_fs.h Tue Apr 30 10:28:52 2002 @@ -1822,7 +1822,8 @@ /* inode.c */ void reiserfs_read_inode (struct inode * inode) ; -void reiserfs_read_inode2(struct inode * inode, void *p) ; +int reiserfs_init_inode(struct inode * inode, void *p) ; +void reiserfs_read_locked_inode(struct inode * inode, struct reiserfs_iget4_args *args) ; void reiserfs_delete_inode (struct inode * inode); void reiserfs_write_inode (struct inode * inode, int) ; struct dentry *reiserfs_fh_to_dentry(struct super_block *sb, __u32 *data,