9pfs: Windows host prep, cleanup

* Next preparatory patches for upcoming Windows host support.
 
 * Cleanup patches.
 -----BEGIN PGP SIGNATURE-----
 
 iQJLBAABCgA1FiEEltjREM96+AhPiFkBNMK1h2Wkc5UFAmOlizoXHHFlbXVfb3Nz
 QGNydWRlYnl0ZS5jb20ACgkQNMK1h2Wkc5VrEQ/+Ie/QqZNP/ZHarjxsLFLJIsqi
 XDxQJj24VqOgm8sYCNMJSGyt77UnfoP52pZsKwx0MdV9VDOocIycPsRVEorVAGsH
 0DMdd7UQbaNNKSEGk3xNTnhjVIMpIu7/Ha/N/nMkn4J0LkXCbhJsojFn7NHjfsvb
 4lSpOtKI8IHbCEWnltbsZ0c8EoHsz2CWHrEnXFoHbiwd+Vli4ff/inF2H9SYsgJB
 eHi04logZwO3rTX886vPr6VPMq7vxjkDuRag+Zft2LRsngp89trstQk/fEv0eDoV
 Ca0zT8JBYyqcXeeNK0XzI1qESojUHviToGb3u1TMngr00RMPkdVygkSqIDZFAeCR
 EbCpcl4Vj9norEVRGffxEGSsbXcK6ivety7fgQxmpoEaF//lfHMUR4b0Dc27wtbo
 xv/DP4wC5K5XJlO+oGYzBt5lqZ/B3+xNZIQggOYeoE5JXdi07klgbw8S/14L41R+
 hh2J1NMjw/YSkA1DVySb63lgvEHtues9PN4sfA6+C2N+UDurBb1yb0B5fxL3Xlti
 /Q1UM8hsCS/oQGZGNF19nQ3GcdI1AxxQCMHjbgJwWa9Q40PWkA6gy3qwoz+e2Erj
 ZIFI85TENJSPMGRDFMCnCX8iXjiMQx7VlygVHpQ/VDy8D9QWyMKqkdNif+9Wzf4s
 +a0rEB30ih/ldYBkJRw=
 =3XCu
 -----END PGP SIGNATURE-----

Merge tag 'pull-9p-20221223' of https://github.com/cschoenebeck/qemu into staging

9pfs: Windows host prep, cleanup

* Next preparatory patches for upcoming Windows host support.

* Cleanup patches.

# gpg: Signature made Fri 23 Dec 2022 11:04:26 GMT
# gpg:                using RSA key 96D8D110CF7AF8084F88590134C2B58765A47395
# gpg:                issuer "qemu_oss@crudebyte.com"
# gpg: Good signature from "Christian Schoenebeck <qemu_oss@crudebyte.com>" [unknown]
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg:          There is no indication that the signature belongs to the owner.
# Primary key fingerprint: ECAB 1A45 4014 1413 BA38  4926 30DB 47C3 A012 D5F4
#      Subkey fingerprint: 96D8 D110 CF7A F808 4F88  5901 34C2 B587 65A4 7395

* tag 'pull-9p-20221223' of https://github.com/cschoenebeck/qemu:
  hw/9pfs: Replace the direct call to xxxat() APIs with a wrapper
  hw/9pfs: Drop unnecessary *xattr wrapper API declarations
  qemu/xattr.h: Exclude <sys/xattr.h> for Windows
  MAINTAINERS: Add 9p test client to section "virtio-9p"
  9pfs: Fix some return statements in the synth backend

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2023-01-04 14:53:59 +00:00
commit ecc9a58835
5 changed files with 37 additions and 38 deletions

View File

@ -2053,6 +2053,7 @@ X: hw/9pfs/xen-9p*
F: fsdev/ F: fsdev/
F: docs/tools/virtfs-proxy-helper.rst F: docs/tools/virtfs-proxy-helper.rst
F: tests/qtest/virtio-9p-test.c F: tests/qtest/virtio-9p-test.c
F: tests/qtest/libqos/virtio-9p*
T: git https://gitlab.com/gkurz/qemu.git 9p-next T: git https://gitlab.com/gkurz/qemu.git 9p-next
T: git https://github.com/cschoenebeck/qemu.git 9p.next T: git https://github.com/cschoenebeck/qemu.git 9p.next

View File

@ -103,14 +103,14 @@ static void renameat_preserve_errno(int odirfd, const char *opath, int ndirfd,
const char *npath) const char *npath)
{ {
int serrno = errno; int serrno = errno;
renameat(odirfd, opath, ndirfd, npath); qemu_renameat(odirfd, opath, ndirfd, npath);
errno = serrno; errno = serrno;
} }
static void unlinkat_preserve_errno(int dirfd, const char *path, int flags) static void unlinkat_preserve_errno(int dirfd, const char *path, int flags)
{ {
int serrno = errno; int serrno = errno;
unlinkat(dirfd, path, flags); qemu_unlinkat(dirfd, path, flags);
errno = serrno; errno = serrno;
} }
@ -194,7 +194,7 @@ static int local_lstat(FsContext *fs_ctx, V9fsPath *fs_path, struct stat *stbuf)
goto out; goto out;
} }
err = fstatat(dirfd, name, stbuf, AT_SYMLINK_NOFOLLOW); err = qemu_fstatat(dirfd, name, stbuf, AT_SYMLINK_NOFOLLOW);
if (err) { if (err) {
goto err_out; goto err_out;
} }
@ -253,7 +253,7 @@ static int local_set_mapped_file_attrat(int dirfd, const char *name,
} }
} }
} else { } else {
ret = mkdirat(dirfd, VIRTFS_META_DIR, 0700); ret = qemu_mkdirat(dirfd, VIRTFS_META_DIR, 0700);
if (ret < 0 && errno != EEXIST) { if (ret < 0 && errno != EEXIST) {
return -1; return -1;
} }
@ -349,7 +349,7 @@ static int fchmodat_nofollow(int dirfd, const char *name, mode_t mode)
*/ */
/* First, we clear non-racing symlinks out of the way. */ /* First, we clear non-racing symlinks out of the way. */
if (fstatat(dirfd, name, &stbuf, AT_SYMLINK_NOFOLLOW)) { if (qemu_fstatat(dirfd, name, &stbuf, AT_SYMLINK_NOFOLLOW)) {
return -1; return -1;
} }
if (S_ISLNK(stbuf.st_mode)) { if (S_ISLNK(stbuf.st_mode)) {
@ -734,7 +734,7 @@ static int local_mkdir(FsContext *fs_ctx, V9fsPath *dir_path,
if (fs_ctx->export_flags & V9FS_SM_MAPPED || if (fs_ctx->export_flags & V9FS_SM_MAPPED ||
fs_ctx->export_flags & V9FS_SM_MAPPED_FILE) { fs_ctx->export_flags & V9FS_SM_MAPPED_FILE) {
err = mkdirat(dirfd, name, fs_ctx->dmode); err = qemu_mkdirat(dirfd, name, fs_ctx->dmode);
if (err == -1) { if (err == -1) {
goto out; goto out;
} }
@ -750,7 +750,7 @@ static int local_mkdir(FsContext *fs_ctx, V9fsPath *dir_path,
} }
} else if (fs_ctx->export_flags & V9FS_SM_PASSTHROUGH || } else if (fs_ctx->export_flags & V9FS_SM_PASSTHROUGH ||
fs_ctx->export_flags & V9FS_SM_NONE) { fs_ctx->export_flags & V9FS_SM_NONE) {
err = mkdirat(dirfd, name, credp->fc_mode); err = qemu_mkdirat(dirfd, name, credp->fc_mode);
if (err == -1) { if (err == -1) {
goto out; goto out;
} }
@ -990,7 +990,7 @@ static int local_link(FsContext *ctx, V9fsPath *oldpath,
if (ctx->export_flags & V9FS_SM_MAPPED_FILE) { if (ctx->export_flags & V9FS_SM_MAPPED_FILE) {
int omap_dirfd, nmap_dirfd; int omap_dirfd, nmap_dirfd;
ret = mkdirat(ndirfd, VIRTFS_META_DIR, 0700); ret = qemu_mkdirat(ndirfd, VIRTFS_META_DIR, 0700);
if (ret < 0 && errno != EEXIST) { if (ret < 0 && errno != EEXIST) {
goto err_undo_link; goto err_undo_link;
} }
@ -1085,7 +1085,7 @@ static int local_utimensat(FsContext *s, V9fsPath *fs_path,
goto out; goto out;
} }
ret = utimensat(dirfd, name, buf, AT_SYMLINK_NOFOLLOW); ret = qemu_utimensat(dirfd, name, buf, AT_SYMLINK_NOFOLLOW);
close_preserve_errno(dirfd); close_preserve_errno(dirfd);
out: out:
g_free(dirpath); g_free(dirpath);
@ -1116,7 +1116,7 @@ static int local_unlinkat_common(FsContext *ctx, int dirfd, const char *name,
if (fd == -1) { if (fd == -1) {
return -1; return -1;
} }
ret = unlinkat(fd, VIRTFS_META_DIR, AT_REMOVEDIR); ret = qemu_unlinkat(fd, VIRTFS_META_DIR, AT_REMOVEDIR);
close_preserve_errno(fd); close_preserve_errno(fd);
if (ret < 0 && errno != ENOENT) { if (ret < 0 && errno != ENOENT) {
return -1; return -1;
@ -1124,7 +1124,7 @@ static int local_unlinkat_common(FsContext *ctx, int dirfd, const char *name,
} }
map_dirfd = openat_dir(dirfd, VIRTFS_META_DIR); map_dirfd = openat_dir(dirfd, VIRTFS_META_DIR);
if (map_dirfd != -1) { if (map_dirfd != -1) {
ret = unlinkat(map_dirfd, name, 0); ret = qemu_unlinkat(map_dirfd, name, 0);
close_preserve_errno(map_dirfd); close_preserve_errno(map_dirfd);
if (ret < 0 && errno != ENOENT) { if (ret < 0 && errno != ENOENT) {
return -1; return -1;
@ -1134,7 +1134,7 @@ static int local_unlinkat_common(FsContext *ctx, int dirfd, const char *name,
} }
} }
return unlinkat(dirfd, name, flags); return qemu_unlinkat(dirfd, name, flags);
} }
static int local_remove(FsContext *ctx, const char *path) static int local_remove(FsContext *ctx, const char *path)
@ -1151,7 +1151,7 @@ static int local_remove(FsContext *ctx, const char *path)
goto out; goto out;
} }
if (fstatat(dirfd, name, &stbuf, AT_SYMLINK_NOFOLLOW) < 0) { if (qemu_fstatat(dirfd, name, &stbuf, AT_SYMLINK_NOFOLLOW) < 0) {
goto err_out; goto err_out;
} }
@ -1296,7 +1296,7 @@ static int local_renameat(FsContext *ctx, V9fsPath *olddir,
return -1; return -1;
} }
ret = renameat(odirfd, old_name, ndirfd, new_name); ret = qemu_renameat(odirfd, old_name, ndirfd, new_name);
if (ret < 0) { if (ret < 0) {
goto out; goto out;
} }
@ -1304,7 +1304,7 @@ static int local_renameat(FsContext *ctx, V9fsPath *olddir,
if (ctx->export_flags & V9FS_SM_MAPPED_FILE) { if (ctx->export_flags & V9FS_SM_MAPPED_FILE) {
int omap_dirfd, nmap_dirfd; int omap_dirfd, nmap_dirfd;
ret = mkdirat(ndirfd, VIRTFS_META_DIR, 0700); ret = qemu_mkdirat(ndirfd, VIRTFS_META_DIR, 0700);
if (ret < 0 && errno != EEXIST) { if (ret < 0 && errno != EEXIST) {
goto err_undo_rename; goto err_undo_rename;
} }
@ -1321,7 +1321,7 @@ static int local_renameat(FsContext *ctx, V9fsPath *olddir,
} }
/* rename the .virtfs_metadata files */ /* rename the .virtfs_metadata files */
ret = renameat(omap_dirfd, old_name, nmap_dirfd, new_name); ret = qemu_renameat(omap_dirfd, old_name, nmap_dirfd, new_name);
close_preserve_errno(nmap_dirfd); close_preserve_errno(nmap_dirfd);
close_preserve_errno(omap_dirfd); close_preserve_errno(omap_dirfd);
if (ret < 0 && errno != ENOENT) { if (ret < 0 && errno != ENOENT) {

View File

@ -75,10 +75,10 @@ int qemu_v9fs_synth_mkdir(V9fsSynthNode *parent, int mode,
V9fsSynthNode *node, *tmp; V9fsSynthNode *node, *tmp;
if (!synth_fs) { if (!synth_fs) {
return EAGAIN; return -EAGAIN;
} }
if (!name || (strlen(name) >= NAME_MAX)) { if (!name || (strlen(name) >= NAME_MAX)) {
return EINVAL; return -EINVAL;
} }
if (!parent) { if (!parent) {
parent = &synth_root; parent = &synth_root;
@ -86,7 +86,7 @@ int qemu_v9fs_synth_mkdir(V9fsSynthNode *parent, int mode,
QEMU_LOCK_GUARD(&synth_mutex); QEMU_LOCK_GUARD(&synth_mutex);
QLIST_FOREACH(tmp, &parent->child, sibling) { QLIST_FOREACH(tmp, &parent->child, sibling) {
if (!strcmp(tmp->name, name)) { if (!strcmp(tmp->name, name)) {
return EEXIST; return -EEXIST;
} }
} }
/* Add the name */ /* Add the name */
@ -106,10 +106,10 @@ int qemu_v9fs_synth_add_file(V9fsSynthNode *parent, int mode,
V9fsSynthNode *node, *tmp; V9fsSynthNode *node, *tmp;
if (!synth_fs) { if (!synth_fs) {
return EAGAIN; return -EAGAIN;
} }
if (!name || (strlen(name) >= NAME_MAX)) { if (!name || (strlen(name) >= NAME_MAX)) {
return EINVAL; return -EINVAL;
} }
if (!parent) { if (!parent) {
parent = &synth_root; parent = &synth_root;
@ -118,7 +118,7 @@ int qemu_v9fs_synth_add_file(V9fsSynthNode *parent, int mode,
QEMU_LOCK_GUARD(&synth_mutex); QEMU_LOCK_GUARD(&synth_mutex);
QLIST_FOREACH(tmp, &parent->child, sibling) { QLIST_FOREACH(tmp, &parent->child, sibling) {
if (!strcmp(tmp->name, name)) { if (!strcmp(tmp->name, name)) {
return EEXIST; return -EEXIST;
} }
} }
/* Add file type and remove write bits */ /* Add file type and remove write bits */

View File

@ -90,21 +90,17 @@ static inline int errno_to_dotl(int err) {
#ifdef CONFIG_DARWIN #ifdef CONFIG_DARWIN
#define qemu_fgetxattr(...) fgetxattr(__VA_ARGS__, 0, 0) #define qemu_fgetxattr(...) fgetxattr(__VA_ARGS__, 0, 0)
#define qemu_lgetxattr(...) getxattr(__VA_ARGS__, 0, XATTR_NOFOLLOW)
#define qemu_llistxattr(...) listxattr(__VA_ARGS__, XATTR_NOFOLLOW)
#define qemu_lremovexattr(...) removexattr(__VA_ARGS__, XATTR_NOFOLLOW)
static inline int qemu_lsetxattr(const char *path, const char *name,
const void *value, size_t size, int flags) {
return setxattr(path, name, value, size, 0, flags | XATTR_NOFOLLOW);
}
#else #else
#define qemu_fgetxattr fgetxattr #define qemu_fgetxattr fgetxattr
#define qemu_lgetxattr lgetxattr
#define qemu_llistxattr llistxattr
#define qemu_lremovexattr lremovexattr
#define qemu_lsetxattr lsetxattr
#endif #endif
#define qemu_openat openat
#define qemu_fstatat fstatat
#define qemu_mkdirat mkdirat
#define qemu_renameat renameat
#define qemu_utimensat utimensat
#define qemu_unlinkat unlinkat
static inline void close_preserve_errno(int fd) static inline void close_preserve_errno(int fd)
{ {
int serrno = errno; int serrno = errno;
@ -114,7 +110,7 @@ static inline void close_preserve_errno(int fd)
static inline int openat_dir(int dirfd, const char *name) static inline int openat_dir(int dirfd, const char *name)
{ {
return openat(dirfd, name, return qemu_openat(dirfd, name,
O_DIRECTORY | O_RDONLY | O_NOFOLLOW | O_PATH_9P_UTIL); O_DIRECTORY | O_RDONLY | O_NOFOLLOW | O_PATH_9P_UTIL);
} }
@ -126,7 +122,7 @@ static inline int openat_file(int dirfd, const char *name, int flags,
#ifndef CONFIG_DARWIN #ifndef CONFIG_DARWIN
again: again:
#endif #endif
fd = openat(dirfd, name, flags | O_NOFOLLOW | O_NOCTTY | O_NONBLOCK, fd = qemu_openat(dirfd, name, flags | O_NOFOLLOW | O_NOCTTY | O_NONBLOCK,
mode); mode);
if (fd == -1) { if (fd == -1) {
#ifndef CONFIG_DARWIN #ifndef CONFIG_DARWIN

View File

@ -25,7 +25,9 @@
# if !defined(ENOATTR) # if !defined(ENOATTR)
# define ENOATTR ENODATA # define ENOATTR ENODATA
# endif # endif
# ifndef CONFIG_WIN32
# include <sys/xattr.h> # include <sys/xattr.h>
# endif # endif
#endif
#endif #endif