Skip to content

Commit

Permalink
fsdev: improve error handling of backend init
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
gkurz committed Jan 8, 2018
1 parent 91cda4e commit 65603a8
Show file tree
Hide file tree
Showing 6 changed files with 15 additions and 14 deletions.
2 changes: 1 addition & 1 deletion fsdev/file-op-9p.h
Expand Up @@ -104,7 +104,7 @@ void cred_init(FsCred *);
struct FileOperations
{
int (*parse_opts)(QemuOpts *, FsDriverEntry *, Error **errp);
int (*init)(FsContext *);
int (*init)(FsContext *, Error **errp);
void (*cleanup)(FsContext *);
int (*lstat)(FsContext *, V9fsPath *, struct stat *);
ssize_t (*readlink)(FsContext *, V9fsPath *, char *, size_t);
Expand Down
2 changes: 1 addition & 1 deletion hw/9pfs/9p-handle.c
Expand Up @@ -604,7 +604,7 @@ static int handle_ioc_getversion(FsContext *ctx, V9fsPath *path,
#endif
}

static int handle_init(FsContext *ctx)
static int handle_init(FsContext *ctx, Error **errp)
{
int ret, mnt_id;
struct statfs stbuf;
Expand Down
3 changes: 2 additions & 1 deletion hw/9pfs/9p-local.c
Expand Up @@ -1400,13 +1400,14 @@ static int local_ioc_getversion(FsContext *ctx, V9fsPath *path,
#endif
}

static int local_init(FsContext *ctx)
static int local_init(FsContext *ctx, Error **errp)
{
struct statfs stbuf;
LocalData *data = g_malloc(sizeof(*data));

data->mountfd = open(ctx->fs_root, O_DIRECTORY | O_RDONLY);
if (data->mountfd == -1) {
error_setg_errno(errp, errno, "failed to open '%s'", ctx->fs_root);
goto err;
}

Expand Down
14 changes: 7 additions & 7 deletions hw/9pfs/9p-proxy.c
Expand Up @@ -1083,25 +1083,25 @@ static int proxy_ioc_getversion(FsContext *fs_ctx, V9fsPath *path,
return err;
}

static int connect_namedsocket(const char *path)
static int connect_namedsocket(const char *path, Error **errp)
{
int sockfd, size;
struct sockaddr_un helper;

if (strlen(path) >= sizeof(helper.sun_path)) {
error_report("Socket name too long");
error_setg(errp, "socket name too long");
return -1;
}
sockfd = socket(AF_UNIX, SOCK_STREAM, 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;
}
strcpy(helper.sun_path, path);
helper.sun_family = AF_UNIX;
size = strlen(helper.sun_path) + sizeof(helper.sun_family);
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);
return -1;
}
Expand Down Expand Up @@ -1144,17 +1144,17 @@ static int proxy_parse_opts(QemuOpts *opts, FsDriverEntry *fs, Error **errp)
return 0;
}

static int proxy_init(FsContext *ctx)
static int proxy_init(FsContext *ctx, Error **errp)
{
V9fsProxy *proxy = g_malloc(sizeof(V9fsProxy));
int sock_id;

if (ctx->export_flags & V9FS_PROXY_SOCK_NAME) {
sock_id = connect_namedsocket(ctx->fs_root);
sock_id = connect_namedsocket(ctx->fs_root, errp);
} else {
sock_id = atoi(ctx->fs_root);
if (sock_id < 0) {
error_report("Socket descriptor not initialized");
error_setg(errp, "socket descriptor not initialized");
}
}
if (sock_id < 0) {
Expand Down
2 changes: 1 addition & 1 deletion hw/9pfs/9p-synth.c
Expand Up @@ -514,7 +514,7 @@ static int synth_unlinkat(FsContext *ctx, V9fsPath *dir,
return -1;
}

static int synth_init(FsContext *ctx)
static int synth_init(FsContext *ctx, Error **errp)
{
QLIST_INIT(&synth_root.child);
qemu_mutex_init(&synth_mutex);
Expand Down
6 changes: 3 additions & 3 deletions hw/9pfs/9p.c
Expand Up @@ -3542,9 +3542,9 @@ int v9fs_device_realize_common(V9fsState *s, Error **errp)
s->fid_list = NULL;
qemu_co_rwlock_init(&s->rename_lock);

if (s->ops->init(&s->ctx) < 0) {
error_setg(errp, "9pfs Failed to initialize fs-driver with id:%s"
" and export path:%s", s->fsconf.fsdev_id, s->ctx.fs_root);
if (s->ops->init(&s->ctx, errp) < 0) {
error_prepend(errp, "cannot initialize fsdev '%s': ",
s->fsconf.fsdev_id);
goto out;
}

Expand Down

0 comments on commit 65603a8

Please sign in to comment.