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:
		
							parent
							
								
									91cda4e8f3
								
							
						
					
					
						commit
						65603a801e
					
				| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -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) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue