I see xfstest generic/062 causes process hang because of xattr operation to FIFO created by mknod. The problem is that virtiofsd opens any files with only O_RDWR or O_RDONLY flags for xattr operation, and therefore if a file is FIFO, open may not return.
Since O_NONBLOCK flag has no effect to regular files, add it to open flags to fix the problem. Signed-off-by: Misono Tomohiro <misono.tomoh...@jp.fujitsu.com> --- contrib/virtiofsd/passthrough_ll.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contrib/virtiofsd/passthrough_ll.c b/contrib/virtiofsd/passthrough_ll.c index 84b60d85bd..645324da58 100644 --- a/contrib/virtiofsd/passthrough_ll.c +++ b/contrib/virtiofsd/passthrough_ll.c @@ -2251,7 +2251,7 @@ static void lo_getxattr(fuse_req_t req, fuse_ino_t ino, const char *name, } sprintf(procname, "%i", inode->fd); - fd = openat(lo->proc_self_fd, procname, O_RDONLY); + fd = openat(lo->proc_self_fd, procname, O_RDONLY|O_NONBLOCK); if (fd < 0) { goto out_err; } @@ -2323,7 +2323,7 @@ static void lo_listxattr(fuse_req_t req, fuse_ino_t ino, size_t size) } sprintf(procname, "%i", inode->fd); - fd = openat(lo->proc_self_fd, procname, O_RDONLY); + fd = openat(lo->proc_self_fd, procname, O_RDONLY|O_NONBLOCK); if (fd < 0) { goto out_err; } @@ -2397,7 +2397,7 @@ static void lo_setxattr(fuse_req_t req, fuse_ino_t ino, const char *name, } sprintf(procname, "%i", inode->fd); - fd = openat(lo->proc_self_fd, procname, O_RDWR); + fd = openat(lo->proc_self_fd, procname, O_RDWR|O_NONBLOCK); if (fd < 0) { saverr = errno; goto out; @@ -2446,7 +2446,7 @@ static void lo_removexattr(fuse_req_t req, fuse_ino_t ino, const char *name) } sprintf(procname, "%i", inode->fd); - fd = openat(lo->proc_self_fd, procname, O_RDWR); + fd = openat(lo->proc_self_fd, procname, O_RDWR|O_NONBLOCK); if (fd < 0) { saverr = errno; goto out; -- 2.21.0