fsdev: improve error handling of backend init

This patch changes some error messages in the backend init code and
convert backends to propagate QEMU Error objects instead of calling
error_report().

One notable improvement is that the local backend now provides a more
detailed error report when it fails to open the shared directory.

Signed-off-by: Greg Kurz <groug@kaod.org>
This commit is contained in:
Greg Kurz 2018-01-08 11:18:23 +01:00
parent 91cda4e8f3
commit 65603a801e
6 changed files with 15 additions and 14 deletions

View File

@ -104,7 +104,7 @@ void cred_init(FsCred *);
struct FileOperations struct FileOperations
{ {
int (*parse_opts)(QemuOpts *, FsDriverEntry *, Error **errp); int (*parse_opts)(QemuOpts *, FsDriverEntry *, Error **errp);
int (*init)(FsContext *); int (*init)(FsContext *, Error **errp);
void (*cleanup)(FsContext *); void (*cleanup)(FsContext *);
int (*lstat)(FsContext *, V9fsPath *, struct stat *); int (*lstat)(FsContext *, V9fsPath *, struct stat *);
ssize_t (*readlink)(FsContext *, V9fsPath *, char *, size_t); ssize_t (*readlink)(FsContext *, V9fsPath *, char *, size_t);

View File

@ -604,7 +604,7 @@ static int handle_ioc_getversion(FsContext *ctx, V9fsPath *path,
#endif #endif
} }
static int handle_init(FsContext *ctx) static int handle_init(FsContext *ctx, Error **errp)
{ {
int ret, mnt_id; int ret, mnt_id;
struct statfs stbuf; struct statfs stbuf;

View File

@ -1400,13 +1400,14 @@ static int local_ioc_getversion(FsContext *ctx, V9fsPath *path,
#endif #endif
} }
static int local_init(FsContext *ctx) static int local_init(FsContext *ctx, Error **errp)
{ {
struct statfs stbuf; struct statfs stbuf;
LocalData *data = g_malloc(sizeof(*data)); LocalData *data = g_malloc(sizeof(*data));
data->mountfd = open(ctx->fs_root, O_DIRECTORY | O_RDONLY); data->mountfd = open(ctx->fs_root, O_DIRECTORY | O_RDONLY);
if (data->mountfd == -1) { if (data->mountfd == -1) {
error_setg_errno(errp, errno, "failed to open '%s'", ctx->fs_root);
goto err; goto err;
} }

View File

@ -1083,25 +1083,25 @@ static int proxy_ioc_getversion(FsContext *fs_ctx, V9fsPath *path,
return err; return err;
} }
static int connect_namedsocket(const char *path) static int connect_namedsocket(const char *path, Error **errp)
{ {
int sockfd, size; int sockfd, size;
struct sockaddr_un helper; struct sockaddr_un helper;
if (strlen(path) >= sizeof(helper.sun_path)) { if (strlen(path) >= sizeof(helper.sun_path)) {
error_report("Socket name too long"); error_setg(errp, "socket name too long");
return -1; return -1;
} }
sockfd = socket(AF_UNIX, SOCK_STREAM, 0); sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
if (sockfd < 0) { if (sockfd < 0) {
error_report("Failed to create socket: %s", strerror(errno)); error_setg_errno(errp, errno, "failed to create client socket");
return -1; return -1;
} }
strcpy(helper.sun_path, path); strcpy(helper.sun_path, path);
helper.sun_family = AF_UNIX; helper.sun_family = AF_UNIX;
size = strlen(helper.sun_path) + sizeof(helper.sun_family); size = strlen(helper.sun_path) + sizeof(helper.sun_family);
if (connect(sockfd, (struct sockaddr *)&helper, size) < 0) { if (connect(sockfd, (struct sockaddr *)&helper, size) < 0) {
error_report("Failed to connect to %s: %s", path, strerror(errno)); error_setg_errno(errp, errno, "failed to connect to '%s'", path);
close(sockfd); close(sockfd);
return -1; return -1;
} }
@ -1144,17 +1144,17 @@ static int proxy_parse_opts(QemuOpts *opts, FsDriverEntry *fs, Error **errp)
return 0; return 0;
} }
static int proxy_init(FsContext *ctx) static int proxy_init(FsContext *ctx, Error **errp)
{ {
V9fsProxy *proxy = g_malloc(sizeof(V9fsProxy)); V9fsProxy *proxy = g_malloc(sizeof(V9fsProxy));
int sock_id; int sock_id;
if (ctx->export_flags & V9FS_PROXY_SOCK_NAME) { if (ctx->export_flags & V9FS_PROXY_SOCK_NAME) {
sock_id = connect_namedsocket(ctx->fs_root); sock_id = connect_namedsocket(ctx->fs_root, errp);
} else { } else {
sock_id = atoi(ctx->fs_root); sock_id = atoi(ctx->fs_root);
if (sock_id < 0) { if (sock_id < 0) {
error_report("Socket descriptor not initialized"); error_setg(errp, "socket descriptor not initialized");
} }
} }
if (sock_id < 0) { if (sock_id < 0) {

View File

@ -514,7 +514,7 @@ static int synth_unlinkat(FsContext *ctx, V9fsPath *dir,
return -1; return -1;
} }
static int synth_init(FsContext *ctx) static int synth_init(FsContext *ctx, Error **errp)
{ {
QLIST_INIT(&synth_root.child); QLIST_INIT(&synth_root.child);
qemu_mutex_init(&synth_mutex); qemu_mutex_init(&synth_mutex);

View File

@ -3542,9 +3542,9 @@ int v9fs_device_realize_common(V9fsState *s, Error **errp)
s->fid_list = NULL; s->fid_list = NULL;
qemu_co_rwlock_init(&s->rename_lock); qemu_co_rwlock_init(&s->rename_lock);
if (s->ops->init(&s->ctx) < 0) { if (s->ops->init(&s->ctx, errp) < 0) {
error_setg(errp, "9pfs Failed to initialize fs-driver with id:%s" error_prepend(errp, "cannot initialize fsdev '%s': ",
" and export path:%s", s->fsconf.fsdev_id, s->ctx.fs_root); s->fsconf.fsdev_id);
goto out; goto out;
} }