Compatibility with overlayfs
Gao Xiang
hsiangkao at aol.com
Sat Nov 30 13:13:07 AEDT 2019
On Sat, Nov 30, 2019 at 09:29:04AM +0800, Gao Xiang via Linux-erofs wrote:
> Hi David,
>
> On Fri, Nov 29, 2019 at 03:22:15PM -0500, David Michael wrote:
> > Hi,
> >
> > I tried to test EROFS on Linux 5.4 as the root file system and mounted
> > a writable overlay (with upper layer on tmpfs) over /etc, but I get
> > ENODATA errors when attempting to modify files. For example, adding a
> > user results in "Failed to take /etc/passwd lock: No data available".
> > Files can be modified after unlinking and restoring them so they're
> > created on the upper layer. This is not necessary with other
> > read-only file systems (at least squashfs or ext4 with the read-only
> > feature). I tried while forcing compact and extended inodes.
> >
> > Is EROFS intended to be usable as a lower layer with overlayfs?
>
> Yes, and overlayfs were used on our smartphones for development use
> only as well. I think it's weird, I will try it on the latest kernel
> now, and see if I can reproduce this issue soon...
>
> Thanks for your report!
>
> Thanks,
> Gao Xiang
I have reproduced this issue -- That is due to erofs will return an
unexpected -ENODATA when calling listxattr without xattr and cause
copy_up fail:
int ovl_copy_xattr(struct dentry *old, struct dentry *new)
{
ssize_t list_size, size, value_size = 0;
char *buf, *name, *value = NULL;
int uninitialized_var(error);
size_t slen;
if (!(old->d_inode->i_opflags & IOP_XATTR) ||
!(new->d_inode->i_opflags & IOP_XATTR))
return 0;
list_size = vfs_listxattr(old, NULL, 0); <- no xattr
if (list_size <= 0) {
if (list_size == -EOPNOTSUPP)
return 0;
return list_size; <- will return -ENODATA
}
since our products using xattr enabled EROFS with overlayfs,
so we didn't observe this issue before. So could you try
the following patch (If it can resolve the issue, I will
send it for 5.5-rc2 and backport to all stable version)?
Look forward to your feekback.
diff --git a/fs/erofs/xattr.c b/fs/erofs/xattr.c
index a13a78725c57..dd328c87dda7 100644
--- a/fs/erofs/xattr.c
+++ b/fs/erofs/xattr.c
@@ -649,8 +649,11 @@ ssize_t erofs_listxattr(struct dentry *dentry,
struct listxattr_iter it;
ret = init_inode_xattrs(d_inode(dentry));
- if (ret)
+ if (ret) {
+ if (ret == -ENODATA)
+ return 0;
return ret;
+ }
it.dentry = dentry;
it.buffer = buffer;
More information about the Linux-erofs
mailing list