[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <47cf66a681a1836877a6899a67d1b6301bd29e07.camel@zoho.com.cn>
Date: Thu, 16 May 2019 19:11:25 +0800
From: "cgxu519@...o.com.cn" <cgxu519@...o.com.cn>
To: Jan Kara <jack@...e.cz>, linux-ext4@...r.kernel.org
Subject: Re: [PATCH 2/3] ext2: Merge loops in ext2_xattr_set()
On Thu, 2019-05-16 at 12:03 +0200, Jan Kara wrote:
> There are two very similar loops when searching xattr to set. Just merge
> them.
>
> Signed-off-by: Jan Kara <jack@...e.cz>
Reviewed-by: Chengguang Xu <cgxu519@...o.com.cn>
> ---
> fs/ext2/xattr.c | 41 +++++++++++++++++++----------------------
> 1 file changed, 19 insertions(+), 22 deletions(-)
>
> diff --git a/fs/ext2/xattr.c b/fs/ext2/xattr.c
> index fb2e008d4406..f9fda6d16d78 100644
> --- a/fs/ext2/xattr.c
> +++ b/fs/ext2/xattr.c
> @@ -436,28 +436,12 @@ ext2_xattr_set(struct inode *inode, int name_index,
> const char *name,
> error = -EIO;
> goto cleanup;
> }
> - /* Find the named attribute. */
> - here = FIRST_ENTRY(bh);
> - while (!IS_LAST_ENTRY(here)) {
> - struct ext2_xattr_entry *next = EXT2_XATTR_NEXT(here);
> - if ((char *)next >= end)
> - goto bad_block;
> - if (!here->e_value_block && here->e_value_size) {
> - size_t offs = le16_to_cpu(here->e_value_offs);
> - if (offs < min_offs)
> - min_offs = offs;
> - }
> - not_found = name_index - here->e_name_index;
> - if (!not_found)
> - not_found = name_len - here->e_name_len;
> - if (!not_found)
> - not_found = memcmp(name, here->e_name,name_len);
> - if (not_found <= 0)
> - break;
> - here = next;
> - }
> - last = here;
> - /* We still need to compute min_offs and last. */
> + /*
> + * Find the named attribute. If not found, 'here' will point
> + * to entry where the new attribute should be inserted to
> + * maintain sorting.
> + */
> + last = FIRST_ENTRY(bh);
> while (!IS_LAST_ENTRY(last)) {
> struct ext2_xattr_entry *next = EXT2_XATTR_NEXT(last);
> if ((char *)next >= end)
> @@ -467,8 +451,21 @@ ext2_xattr_set(struct inode *inode, int name_index, const
> char *name,
> if (offs < min_offs)
> min_offs = offs;
> }
> + if (not_found > 0) {
> + not_found = name_index - last->e_name_index;
> + if (!not_found)
> + not_found = name_len - last->e_name_len;
> + if (!not_found) {
> + not_found = memcmp(name, last->e_name,
> + name_len);
> + }
> + if (not_found <= 0)
> + here = last;
> + }
> last = next;
> }
> + if (not_found > 0)
> + here = last;
>
> /* Check whether we have enough space left. */
> free = min_offs - ((char*)last - (char*)header) - sizeof(__u32);
Powered by blists - more mailing lists