[Virtio-fs] [virtiofsd PATCH v6 1/6] virtiofsd: add .ioctl() support

JeffleXu jefflexu at linux.alibaba.com
Thu Oct 21 02:32:58 UTC 2021



On 10/21/21 1:36 AM, Vivek Goyal wrote:
> On Mon, Oct 11, 2021 at 11:09:33AM +0800, Jeffle Xu wrote:
>> For passthrough, it passes corresponding ioctls to host directly.
>>
>> Currently only these ioctls that handling persistent inode flags, i.e.,
>> FS_IOC_[G|S]ETFLAGS and FS_IOC_FS[G|S]ETXATTR are supported for security
>> concern, though it's implemented in a quite general way, so that we can
>> expand the scope of allowed ioctls if it is really needed later.
>>
>> Signed-off-by: Jeffle Xu <jefflexu at linux.alibaba.com>
>> ---
>>  tools/virtiofsd/passthrough_ll.c      | 59 +++++++++++++++++++++++++++
>>  tools/virtiofsd/passthrough_seccomp.c |  1 +
>>  2 files changed, 60 insertions(+)
>>
>> diff --git a/tools/virtiofsd/passthrough_ll.c b/tools/virtiofsd/passthrough_ll.c
>> index b76d878509..5969d67810 100644
>> --- a/tools/virtiofsd/passthrough_ll.c
>> +++ b/tools/virtiofsd/passthrough_ll.c
>> @@ -47,6 +47,7 @@
>>  #include <dirent.h>
>>  #include <pthread.h>
>>  #include <sys/file.h>
>> +#include <sys/ioctl.h>
>>  #include <sys/mount.h>
>>  #include <sys/prctl.h>
>>  #include <sys/resource.h>
>> @@ -54,6 +55,7 @@
>>  #include <sys/wait.h>
>>  #include <sys/xattr.h>
>>  #include <syslog.h>
>> +#include <linux/fs.h>
>>  
>>  #include "qemu/cutils.h"
>>  #include "passthrough_helpers.h"
>> @@ -2105,6 +2107,62 @@ out:
>>      fuse_reply_err(req, saverr);
>>  }
>>  
>> +
>> +static void lo_ioctl(fuse_req_t req, fuse_ino_t ino, unsigned int cmd, void *arg,
>> +                          struct fuse_file_info *fi, unsigned flags, const void *in_buf,
>> +                          size_t in_bufsz, size_t out_bufsz)
>> +{
>> +    int fd = lo_fi_fd(req, fi);
>> +    int res;
>> +    int saverr = ENOSYS;
>> +    int dir;
>> +    void *buf = NULL;
>> +    size_t size = 0;
>> +
>> +    fuse_log(FUSE_LOG_DEBUG, "lo_ioctl(ino=%" PRIu64 ", cmd=0x%x, flags=0x%x, "
>> +            "in_bufsz = %lu, out_bufsz = %lu)\n",
>> +            ino, cmd, flags, in_bufsz, out_bufsz);
>> +
>> +    if (cmd != FS_IOC_SETFLAGS || cmd != FS_IOC_GETFLAGS ||
>> +        cmd != FS_IOC_FSSETXATTR || cmd != FS_IOC_FSGETXATTR)
>> +        goto out;
>> +
>> +    /* unrestricted ioctl is not supported yet */
>> +    if (flags & FUSE_IOCTL_UNRESTRICTED)
>> +        goto out;
>> +
>> +    dir = _IOC_DIR(cmd);
>> +
>> +    if (dir & _IOC_READ) {
>> +        size = out_bufsz;
>> +        buf = malloc(size);
>> +        if (!buf)
>> +            goto out_err;
>> +
>> +        if (dir & _IOC_WRITE)
>> +            memcpy(buf, in_buf, size);
>> +
>> +        res = ioctl(fd, cmd, buf);
>> +    }
>> +    else if (dir & _IOC_WRITE) {
> 
> Typically else is on same line as } braces.
> 
> } else if (dir & _IOC_WRITE) {
> 
> Have you tried running qemu/script/checkpatch.pl on these patches. Does it
> flag it?

Sorry, not yet. I have no experience contributing to qemu before... I
will check it next time and send a new version later.


-- 
Thanks,
Jeffle




More information about the Virtio-fs mailing list