* Misono Tomohiro (misono.tomoh...@jp.fujitsu.com) wrote: > > From: Miklos Szeredi <mszer...@redhat.com> > > > > Signed-off-by: Miklos Szeredi <mszer...@redhat.com> > > I'm not familiar with qemu convention but shouldn't we put > at least one line of description like linux kernel?
Miklos: would you like to suggest a better commit message? > For code itself: > Reviewed-by: Misono Tomohiro <misono.tomoh...@jp.fujitsu.com> Thanks! > > > --- > > tools/virtiofsd/passthrough_ll.c | 50 +++++++++++++++++++++++++++++++- > > 1 file changed, 49 insertions(+), 1 deletion(-) > > > > diff --git a/tools/virtiofsd/passthrough_ll.c > > b/tools/virtiofsd/passthrough_ll.c > > index 0f33c3c5e9..1b84d4f313 100644 > > --- a/tools/virtiofsd/passthrough_ll.c > > +++ b/tools/virtiofsd/passthrough_ll.c > > @@ -1077,17 +1077,42 @@ out_err: > > fuse_reply_err(req, saverr); > > } > > > > +static struct lo_inode *lookup_name(fuse_req_t req, fuse_ino_t parent, > > + const char *name) > > +{ > > + int res; > > + struct stat attr; > > + > > + res = fstatat(lo_fd(req, parent), name, &attr, > > + AT_EMPTY_PATH | AT_SYMLINK_NOFOLLOW); > > + if (res == -1) { > > + return NULL; > > + } > > + > > + return lo_find(lo_data(req), &attr); > > +} > > + > > static void lo_rmdir(fuse_req_t req, fuse_ino_t parent, const char *name) > > { > > int res; > > + struct lo_inode *inode; > > + struct lo_data *lo = lo_data(req); > > + > > if (!is_safe_path_component(name)) { > > fuse_reply_err(req, EINVAL); > > return; > > } > > > > + inode = lookup_name(req, parent, name); > > + if (!inode) { > > + fuse_reply_err(req, EIO); > > + return; > > + } > > + > > res = unlinkat(lo_fd(req, parent), name, AT_REMOVEDIR); > > > > fuse_reply_err(req, res == -1 ? errno : 0); > > + unref_inode_lolocked(lo, inode, 1); > > } > > > > static void lo_rename(fuse_req_t req, fuse_ino_t parent, const char *name, > > @@ -1095,12 +1120,23 @@ static void lo_rename(fuse_req_t req, fuse_ino_t > > parent, const char *name, > > unsigned int flags) > > { > > int res; > > + struct lo_inode *oldinode; > > + struct lo_inode *newinode; > > + struct lo_data *lo = lo_data(req); > > > > if (!is_safe_path_component(name) || !is_safe_path_component(newname)) > > { > > fuse_reply_err(req, EINVAL); > > return; > > } > > > > + oldinode = lookup_name(req, parent, name); > > + newinode = lookup_name(req, newparent, newname); > > + > > + if (!oldinode) { > > + fuse_reply_err(req, EIO); > > + goto out; > > + } > > + > > if (flags) { > > #ifndef SYS_renameat2 > > fuse_reply_err(req, EINVAL); > > @@ -1113,26 +1149,38 @@ static void lo_rename(fuse_req_t req, fuse_ino_t > > parent, const char *name, > > fuse_reply_err(req, res == -1 ? errno : 0); > > } > > #endif > > - return; > > + goto out; > > } > > > > res = renameat(lo_fd(req, parent), name, lo_fd(req, newparent), > > newname); > > > > fuse_reply_err(req, res == -1 ? errno : 0); > > +out: > > + unref_inode_lolocked(lo, oldinode, 1); > > + unref_inode_lolocked(lo, newinode, 1); > > } > > > > static void lo_unlink(fuse_req_t req, fuse_ino_t parent, const char *name) > > { > > int res; > > + struct lo_inode *inode; > > + struct lo_data *lo = lo_data(req); > > > > if (!is_safe_path_component(name)) { > > fuse_reply_err(req, EINVAL); > > return; > > } > > > > + inode = lookup_name(req, parent, name); > > + if (!inode) { > > + fuse_reply_err(req, EIO); > > + return; > > + } > > + > > res = unlinkat(lo_fd(req, parent), name, 0); > > > > fuse_reply_err(req, res == -1 ? errno : 0); > > + unref_inode_lolocked(lo, inode, 1); > > } > > > > static void unref_inode_lolocked(struct lo_data *lo, struct lo_inode > > *inode, > > -- > > 2.23.0 > -- Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK