On 2023/8/31 18:48, Li Yiyan wrote:

...

+
+     vi->sbi = &sbi;
+     vi->nid = (erofs_nid_t)ino;
+     ret = erofs_read_inode_from_disk(vi);
+     if (ret < 0) {
+             fuse_reply_err(req, EIO);

Maybe reply -ret? Since there are other errors in
erofs_read_inode_from_disk.

No. As mentioned in declaration, param err represents the *positive* error 
value,
or zero for success.

I think Jianan meant:
        if (ret < 0) {
                fuse_reply_err(req, -err);

instead.



...


+             return;
+     }
+
+     if (bufsize == 0)
+             bufsize = EROFSFUSE_XATTR_BUF_SIZE;

Why do we need to reconfigure bufsize here? erofs_listxattr should
handle bufsize of 0.


This is a workaround for the time being, I will propose a patch to modify the 
lib
to solve this problem.

As mentioned in https://man7.org/linux/man-pages/man2/listxattr.2.html:

"If size is specified as zero, these calls return the current size of the list 
of
extended attribute names ( and leave list unchanged). This can be used to 
determine
the size of the buffer that should be supplied in a subsequent call."

Therefore, buf=0 means that we need to use fuse_reply_xattr to return the 
requested
size of the buffer. Only when buf is not 0 do we need to copy xattr to buffer.
At present, the erofs_getxattr cannot solve this problem, so a workaround is
made on the fuse layer to temporarily solve this problem and
control the extent of the patch.

Are you sure that erofs_listxattr() cannot accept NULL buffers?
I'm totally confused.

Anyway, if erofs_listxattr() unmeet your requirement for whatever
reasons, please fix this instead.

Thanks,
Gao Xiang

Reply via email to