Re: xattr hash error in 4.13-rc with overlayfs over ext4

From: zhangyi (F)
Date: Sun Aug 06 2017 - 08:45:38 EST


On 2017/8/3 19:10, Miklos Szeredi Wrote:
On Tue, Aug 1, 2017 at 12:34 PM, Amir Goldstein <amir73il@xxxxxxxxx> wrote:
On Mon, Jul 31, 2017 at 7:08 PM, Miklos Szeredi <miklos@xxxxxxxxxx> wrote:
On Thu, Jul 27, 2017 at 10:54 PM, Tahsin Erdogan <tahsin@xxxxxxxxxx> wrote:
Still no luck reproducing the error. I am using the test script below
at v4.13-rc2. Do you mind checking my script to see what I am missing?

Don't know. I can reliably reproduce it under UML, but not with a
VM. What the hell is going on?


Is it the same ext4 image for UML and VM? same image size? same mkfs version?

Exact same starting image. Same userspace. Same EXT4 kernel config options.

Thanks,
Miklos


Hi:
I think the root cause of this problem is the hash value not updated
when we overwrite the same xattr, please see ext4_xattr_set_entry():

static int ext4_xattr_set_entry(struct ext4_xattr_info *i,
struct ext4_xattr_search *s,
handle_t *handle, struct inode *inode,
bool is_block)
{
...
if (new_size && new_size == old_size) {
size_t offs = le16_to_cpu(here->e_value_offs);
void *val = s->base + offs;

here->e_value_size = cpu_to_le32(i->value_len);
if (i->value == EXT4_ZERO_XATTR_VALUE) {
memset(val, 0, new_size);
} else {
memcpy(val, i->value, i->value_len);
/* Clear padding bytes. */
memset(val + i->value_len, 0, new_size - i->value_len);
}

/* Forget updating *here->e_hash* and *s->base->h_hash* here. */

return 0;
}
...
/* Call ext4_xattr_hash_entry && ext4_xattr_rehash first set */
...
}

Thanks,
ZhangYi