From patchwork Wed Oct 26 07:34:18 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tao Ma X-Patchwork-Id: 121833 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id F25981007D9 for ; Wed, 26 Oct 2011 18:36:50 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932473Ab1JZHgf (ORCPT ); Wed, 26 Oct 2011 03:36:35 -0400 Received: from oproxy5-pub.bluehost.com ([67.222.38.55]:58841 "HELO oproxy5-pub.bluehost.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S932337Ab1JZHfD (ORCPT ); Wed, 26 Oct 2011 03:35:03 -0400 Received: (qmail 27746 invoked by uid 0); 26 Oct 2011 07:35:03 -0000 Received: from unknown (HELO box585.bluehost.com) (66.147.242.185) by cpoproxy2.bluehost.com with SMTP; 26 Oct 2011 07:35:03 -0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tao.ma; s=default; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=QA/96oOKS9D/xSJs+CG73FMaEpWewak8F1P194Vw0Lw=; b=j6wut8bnVvde6Vc3iYxgM7yzfV+9TjFDnNWZhxB/Ofbt4gKHuW5mG9511Z3NqR90G7JrCGefnDQRA2k14++fq47dFYrsATx5nmG7Q6BiPRQZdWdeQCg5LmVOieRpYU9i; Received: from [182.92.247.2] (helo=tma-laptop1.taobao.ali.com) by box585.bluehost.com with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.76) (envelope-from ) id 1RIy0s-0006OI-PJ; Wed, 26 Oct 2011 01:35:03 -0600 From: Tao Ma To: linux-ext4@vger.kernel.org Cc: tytso@mit.edu, linux-kernel@vger.kernel.org, adilger@dilger.ca Subject: [PATCH V1 07/17] ext4: Create a new function ext4_init_new_dir. Date: Wed, 26 Oct 2011 15:34:18 +0800 Message-Id: <1319614468-11227-7-git-send-email-tm@tao.ma> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1319614468-11227-1-git-send-email-tm@tao.ma> References: <4EA7B788.3040503@tao.ma> <1319614468-11227-1-git-send-email-tm@tao.ma> X-Identified-User: {1390:box585.bluehost.com:colyli:tao.ma} {sentby:smtp auth 182.92.247.2 authed with tm@tao.ma} Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org From: Tao Ma Currently, the initialization of dot and dotdot are encapsulated in ext4_mkdir and also bond with dir_block. So create a new function named ext4_init_new_dir and the initialization is moved to ext4_init_dot_dotdot which only accepts a 'de'. Signed-off-by: Tao Ma --- fs/ext4/namei.c | 74 +++++++++++++++++++++++++++++++++--------------------- 1 files changed, 45 insertions(+), 29 deletions(-) diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 6e7779c..c2ca5f4 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c @@ -1807,13 +1807,54 @@ retry: return err; } +static void ext4_init_dot_dotdot(struct inode *parent, struct inode *inode, + struct ext4_dir_entry_2 *de, int blocksize) +{ + de->inode = cpu_to_le32(inode->i_ino); + de->name_len = 1; + de->rec_len = ext4_rec_len_to_disk(EXT4_DIR_REC_LEN(de->name_len), + blocksize); + strcpy(de->name, "."); + ext4_set_de_type(parent->i_sb, de, S_IFDIR); + de = ext4_next_entry(de, blocksize); + de->inode = cpu_to_le32(parent->i_ino); + de->rec_len = ext4_rec_len_to_disk(blocksize - EXT4_DIR_REC_LEN(1), + blocksize); + de->name_len = 2; + strcpy(de->name, ".."); + ext4_set_de_type(parent->i_sb, de, S_IFDIR); + inode->i_nlink = 2; +} + +static int ext4_init_new_dir(handle_t *handle, struct inode *parent, + struct inode *inode) +{ + struct buffer_head *dir_block = NULL; + struct ext4_dir_entry_2 *de; + int err; + int blocksize = inode->i_sb->s_blocksize; + + inode->i_size = EXT4_I(inode)->i_disksize = blocksize; + dir_block = ext4_bread(handle, inode, 0, 1, &err); + if (!dir_block) + goto out; + BUFFER_TRACE(dir_block, "get_write_access"); + err = ext4_journal_get_write_access(handle, dir_block); + if (err) + goto out; + de = (struct ext4_dir_entry_2 *)dir_block->b_data; + ext4_init_dot_dotdot(parent, inode, de, blocksize); + BUFFER_TRACE(dir_block, "call ext4_handle_dirty_metadata"); + err = ext4_handle_dirty_metadata(handle, inode, dir_block); +out: + brelse(dir_block); + return err; +} + static int ext4_mkdir(struct inode *dir, struct dentry *dentry, int mode) { handle_t *handle; struct inode *inode; - struct buffer_head *dir_block = NULL; - struct ext4_dir_entry_2 *de; - unsigned int blocksize = dir->i_sb->s_blocksize; int err, retries = 0; if (EXT4_DIR_LINK_MAX(dir)) @@ -1839,31 +1880,7 @@ retry: inode->i_op = &ext4_dir_inode_operations; inode->i_fop = &ext4_dir_operations; - inode->i_size = EXT4_I(inode)->i_disksize = inode->i_sb->s_blocksize; - dir_block = ext4_bread(handle, inode, 0, 1, &err); - if (!dir_block) - goto out_clear_inode; - BUFFER_TRACE(dir_block, "get_write_access"); - err = ext4_journal_get_write_access(handle, dir_block); - if (err) - goto out_clear_inode; - de = (struct ext4_dir_entry_2 *) dir_block->b_data; - de->inode = cpu_to_le32(inode->i_ino); - de->name_len = 1; - de->rec_len = ext4_rec_len_to_disk(EXT4_DIR_REC_LEN(de->name_len), - blocksize); - strcpy(de->name, "."); - ext4_set_de_type(dir->i_sb, de, S_IFDIR); - de = ext4_next_entry(de, blocksize); - de->inode = cpu_to_le32(dir->i_ino); - de->rec_len = ext4_rec_len_to_disk(blocksize - EXT4_DIR_REC_LEN(1), - blocksize); - de->name_len = 2; - strcpy(de->name, ".."); - ext4_set_de_type(dir->i_sb, de, S_IFDIR); - inode->i_nlink = 2; - BUFFER_TRACE(dir_block, "call ext4_handle_dirty_metadata"); - err = ext4_handle_dirty_metadata(handle, inode, dir_block); + err = ext4_init_new_dir(handle, dir, inode); if (err) goto out_clear_inode; err = ext4_mark_inode_dirty(handle, inode); @@ -1885,7 +1902,6 @@ out_clear_inode: d_instantiate(dentry, inode); unlock_new_inode(inode); out_stop: - brelse(dir_block); ext4_journal_stop(handle); if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries)) goto retry;