[PATCH] erofs-utils: sort shared xattr

Gao Xiang hsiangkao at linux.alibaba.com
Thu Oct 21 20:50:11 AEDT 2021


On Thu, Oct 21, 2021 at 05:28:25PM +0800, Huang Jianan wrote:
> 
> 
> 在 2021/10/21 15:25, Gao Xiang 写道:
> > Hi Jianan,
> > 
> > On Thu, Oct 21, 2021 at 10:58:47AM +0800, Huang Jianan via Linux-erofs wrote:
> > > Sort shared xattr before writing to disk to ensure the consistency
> > > of reproducible builds.
> > How about adding it as an option?
> 
> Can we consider turning on this by default abd add some test cases to ensure
> that xattr
> functionality?  It seems that this part of the modification has no effect on
> the overall
> function.

Ok, that is fine with me as well.

> 
> > > ---
> > >   lib/xattr.c | 34 ++++++++++++++++++++++++++++++----
> > >   1 file changed, 30 insertions(+), 4 deletions(-)
> > > 
> > > diff --git a/lib/xattr.c b/lib/xattr.c
> > > index 196133a..f17e57e 100644
> > > --- a/lib/xattr.c
> > > +++ b/lib/xattr.c
> > > @@ -171,7 +171,7 @@ static struct xattr_item *parse_one_xattr(const char *path, const char *key,
> > >   	/* allocate key-value buffer */
> > >   	len[0] = keylen - prefixlen;
> > > -	kvbuf = malloc(len[0] + len[1]);
> > > +	kvbuf = malloc(len[0] + len[1] + 1);
> > >   	if (!kvbuf)
> > >   		return ERR_PTR(-ENOMEM);
> > >   	memcpy(kvbuf, key + prefixlen, len[0]);
> > > @@ -196,6 +196,7 @@ static struct xattr_item *parse_one_xattr(const char *path, const char *key,
> > >   			len[1] = ret;
> > >   		}
> > >   	}
> > > +	kvbuf[len[0] + len[1]] = '\0';
> > >   	return get_xattritem(prefix, kvbuf, len);
> > >   }
> > > @@ -398,7 +399,7 @@ static int erofs_droid_xattr_set_caps(struct erofs_inode *inode)
> > >   	len[0] = sizeof("capability") - 1;
> > >   	len[1] = sizeof(caps);
> > > -	kvbuf = malloc(len[0] + len[1]);
> > > +	kvbuf = malloc(len[0] + len[1] + 1);
> > >   	if (!kvbuf)
> > >   		return -ENOMEM;
> > > @@ -409,6 +410,7 @@ static int erofs_droid_xattr_set_caps(struct erofs_inode *inode)
> > >   	caps.data[1].permitted = (u32) (capabilities >> 32);
> > >   	caps.data[1].inheritable = 0;
> > >   	memcpy(kvbuf + len[0], &caps, len[1]);
> > > +	kvbuf[len[0] + len[1]] = '\0';
> > >   	item = get_xattritem(EROFS_XATTR_INDEX_SECURITY, kvbuf, len);
> > >   	if (IS_ERR(item))
> > > @@ -562,13 +564,23 @@ static struct erofs_bhops erofs_write_shared_xattrs_bhops = {
> > >   	.flush = erofs_bh_flush_write_shared_xattrs,
> > >   };
> > > +static int comp_xattr_item(const void *a, const void *b)
> > > +{
> > > +	const struct xattr_item *ia, *ib;
> > > +
> > > +	ia = (*((const struct inode_xattr_node **)a))->item;
> > > +	ib = (*((const struct inode_xattr_node **)b))->item;
> > > +
> > > +	return strcmp(ia->kvbuf, ib->kvbuf);
> > could we use strncmp (len[0] + len[1]) instead?
> 
> It seems that strncmp can't guarantee the order since ia and ib has
> different len. We
> have ensure kvbuf[len[0] + len[1]] = '\0', Is there anything else to
> consider?

you could min(xa, xb) and strncmp first. If strncmp returns 0, compare
length then.

Thanks,
Gao Xiang

> 
> Thanks,
> Jianan
> 
> > Thanks,
> > Gao Xiang


More information about the Linux-erofs mailing list