All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andreas Dilger <adilger@dilger.ca>
To: Tao Ma <tm@tao.ma>
Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH V4 17/22] ext4: let empty_dir handle inline dir.
Date: Fri, 6 Apr 2012 18:21:56 -0600	[thread overview]
Message-ID: <B656C5E6-2795-4355-ABE4-6D9334CB7AFB@dilger.ca> (raw)
In-Reply-To: <1329721316-4955-17-git-send-email-tm@tao.ma>

On 2012-02-20, at 12:01 AM, Tao Ma wrote:
> From: Tao Ma <boyu.mt@taobao.com>
> 
> empty_dir is used when deleting a dir. So it should handle
> inline dir properly.
> 
> Signed-off-by: Tao Ma <boyu.mt@taobao.com>
> ---
> fs/ext4/inline.c |   69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
> fs/ext4/namei.c  |    8 ++++++
> fs/ext4/xattr.h  |    6 ++++
> 3 files changed, 83 insertions(+), 0 deletions(-)
> 
> diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c
> index 3126ac3..6612ce1 100644
> --- a/fs/ext4/inline.c
> +++ b/fs/ext4/inline.c
> @@ -1436,6 +1436,75 @@ out:
> 	return err;
> }
> 
> +int empty_inline_dir(struct inode *dir, int *has_inline_data)
> +{
> +	int err, inline_size;
> +	struct ext4_iloc iloc;
> +	void *inline_pos;
> +	unsigned int offset;
> +	struct ext4_dir_entry_2 *de, *de1;
> +	int ret = 1;
> +
> +	err = ext4_get_inode_loc(dir, &iloc);
> +	if (err) {
> +		EXT4_ERROR_INODE(dir, "error %d getting inode %lu block",
> +				 err, dir->i_ino);
> +		return 1;
> +	}
> +
> +	down_read(&EXT4_I(dir)->xattr_sem);
> +	if (!ext4_has_inline_data(dir)) {
> +		*has_inline_data = 0;
> +		goto out;
> +	}
> +
> +	de = ext4_get_inline_entry(dir, &iloc, 0,
> +				   &inline_pos, &inline_size);
> +	de1 = ext4_get_inline_entry(dir, &iloc,
> +			ext4_rec_len_from_disk(de->rec_len, inline_size),
> +			&inline_pos, &inline_size);
> +	if (le32_to_cpu(de->inode) != dir->i_ino ||
> +			!le32_to_cpu(de1->inode) ||
> +			strcmp(".", de->name) ||
> +			strcmp("..", de1->name)) {
> +		ext4_warning(dir->i_sb,
> +			     "bad directory (dir #%lu) - no `.' or `..'",
> +			     dir->i_ino);
> +		ret = 1;
> +		goto out;
> +	}
> +
> +	offset = ext4_rec_len_from_disk(de->rec_len, inline_size) +
> +		 ext4_rec_len_from_disk(de1->rec_len, inline_size);
> +	while (offset < dir->i_size) {
> +		de = ext4_get_inline_entry(dir, &iloc, offset,
> +					   &inline_pos, &inline_size);
> +		if (ext4_check_dir_entry(dir, NULL, de,
> +					 iloc.bh, inline_pos,
> +					 inline_size, offset)) {
> +			ext4_warning(dir->i_sb,
> +				     "bad inline directory (dir #%lu) - "
> +				     "inode %u, rec_len %u, name_len %d"
> +				     "inline size %d\n",
> +				     dir->i_ino, le32_to_cpu(de->inode),
> +				     le16_to_cpu(de->rec_len), de->name_len,
> +				     inline_size);
> +			ret = 1;
> +			goto out;
> +		}

Most of the code in this function is duplicated with empty_dir().  Instead of
duplicating everything here, it seems that it is possible to just use the code
in empty_dir() with a few small changes:

- a helper function which reads the first directory block instead of ext4_bread() 
> +		if (le32_to_cpu(de->inode)) {
> +			ret = 0;
> +			goto out;
> +		}
> +		offset += ext4_rec_len_from_disk(de->rec_len, inline_size);
> +	}
> +
> +out:
> +	up_read(&EXT4_I(dir)->xattr_sem);
> +	brelse(iloc.bh);
> +	return ret;
> +}
> +
> int ext4_destroy_inline_data(handle_t *handle, struct inode *inode)
> {
> 	int ret;
> diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
> index 9f7002c..b6b718e 100644
> --- a/fs/ext4/namei.c
> +++ b/fs/ext4/namei.c
> @@ -2015,6 +2015,14 @@ static int empty_dir(struct inode *inode)
> 	struct super_block *sb;
> 	int err = 0;
> 
> +	if (ext4_has_inline_data(inode)) {
> +		int has_inline_data = 1;
> +
> +		err = empty_inline_dir(inode, &has_inline_data);
> +		if (has_inline_data)
> +			return err;
> +	}
> +
> 	sb = inode->i_sb;
> 	if (inode->i_size < EXT4_DIR_REC_LEN(1) + EXT4_DIR_REC_LEN(2) ||
> 	    !(bh = ext4_bread(NULL, inode, 0, 0, &err))) {
> diff --git a/fs/ext4/xattr.h b/fs/ext4/xattr.h
> index 9991143..6ccfa8d 100644
> --- a/fs/ext4/xattr.h
> +++ b/fs/ext4/xattr.h
> @@ -176,6 +176,7 @@ extern int ext4_delete_inline_entry(handle_t *handle,
> 				    struct inode *dir,
> 				    struct ext4_dir_entry_2 *de_del,
> 				    struct buffer_head *bh);
> +extern int empty_inline_dir(struct inode *dir, int *has_inline_data);
> # else  /* CONFIG_EXT4_FS_XATTR */
> 
> static inline int
> @@ -373,6 +374,11 @@ static inline int ext4_delete_inline_entry(handle_t *handle,
> {
> 	return 0;
> }
> +
> +static inline int empty_inline_dir(struct inode *dir, int *has_inline_data)
> +{
> +	return 0;
> +}
> # endif  /* CONFIG_EXT4_FS_XATTR */
> 
> #ifdef CONFIG_EXT4_FS_SECURITY
> -- 
> 1.7.0.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


Cheers, Andreas






  reply	other threads:[~2012-04-07  0:21 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-20  7:00 [PATCH V4 00/22] ext4: Add inline data support Tao Ma
2012-02-20  7:01 ` [PATCH V4 01/22] ext4: Move extra inode read to a new function Tao Ma
2012-02-20  7:01   ` [PATCH V4 02/22] ext4: export inline xattr functions Tao Ma
2012-02-21 22:45     ` Andreas Dilger
2012-02-20  7:01   ` [PATCH V4 03/22] ext4: Add the basic function for inline data support Tao Ma
2012-04-07  0:21     ` Andreas Dilger
2012-04-13  2:59       ` Tao Ma
2012-02-20  7:01   ` [PATCH V4 04/22] ext4: Add read support for inline data Tao Ma
2012-02-20  7:01   ` [PATCH V4 05/22] ext4: Add normal write " Tao Ma
2012-02-20  7:01   ` [PATCH V4 06/22] ext4: Add journalled " Tao Ma
2012-02-20  7:01   ` [PATCH V4 07/22] ext4: Add delalloc " Tao Ma
2012-02-20  7:01   ` [PATCH V4 08/22] ext4: Create a new function ext4_init_new_dir Tao Ma
2012-02-20  7:01   ` [PATCH V4 09/22] ext4: Refactor __ext4_check_dir_entry to accepts start and size Tao Ma
2012-02-20  7:01   ` [PATCH V4 10/22] ext4: Create __ext4_insert_dentry for dir entry insertion Tao Ma
2012-02-20  7:01   ` [PATCH V4 11/22] ext4: let add_dir_entry handle inline data properly Tao Ma
2012-02-20  7:01   ` [PATCH V4 12/22] ext4: Let ext4_readdir handle inline data Tao Ma
2012-02-20  7:01   ` [PATCH V4 13/22] ext4: Create a new function search_dir Tao Ma
2012-02-20  7:01   ` [PATCH V4 14/22] ext4: let ext4_find_entry handle inline data Tao Ma
2012-02-20  7:01   ` [PATCH V4 15/22] ext4: make ext4_delete_entry generic Tao Ma
2012-02-20  7:01   ` [PATCH V4 16/22] ext4: let ext4_delete_entry handle inline data Tao Ma
2012-02-20  7:01   ` [PATCH V4 17/22] ext4: let empty_dir handle inline dir Tao Ma
2012-04-07  0:21     ` Andreas Dilger [this message]
2012-04-17  3:55       ` Tao Ma
2012-02-20  7:01   ` [PATCH V4 18/22] ext4: let ext4_rename " Tao Ma
2012-02-20  7:01   ` [PATCH V4 19/22] ext4: Let fiemap work with inline data Tao Ma
2012-02-20  7:01   ` [PATCH V4 20/22] ext4: Evict inline data out if we needs to strore xattr in inode Tao Ma
2012-02-20  7:01   ` [PATCH V4 21/22] ext4: let ext4_truncate handle inline data correctly Tao Ma
2012-02-20  7:01   ` [PATCH V4 22/22] ext4: Enable ext4 inline support Tao Ma
2012-02-21  6:51   ` [PATCH V4 01/22] ext4: Move extra inode read to a new function Andreas Dilger
2012-02-21  8:13     ` Tao Ma
2012-02-21 23:44 ` [PATCH V4 00/22] ext4: Add inline data support Andreas Dilger
2012-02-22  1:34   ` Tao Ma

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=B656C5E6-2795-4355-ABE4-6D9334CB7AFB@dilger.ca \
    --to=adilger@dilger.ca \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=tm@tao.ma \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.