Пример #1
0
/*
 * Encrypt / decrypt data from one bio to another one (can be the same one)
 */
static int crypt_convert(struct crypt_config *cc,
                         struct convert_context *ctx)
{
    int r;

    atomic_set(&ctx->cc_pending, 1);

    while(ctx->idx_in < ctx->bio_in->bi_vcnt &&
            ctx->idx_out < ctx->bio_out->bi_vcnt) {

        crypt_alloc_req(cc, ctx);

        atomic_inc(&ctx->cc_pending);

        r = crypt_convert_block(cc, ctx, ctx->req);

        switch (r) {
        /* async */
        case -EBUSY:
            wait_for_completion(&ctx->restart);
            INIT_COMPLETION(ctx->restart);
        /* fall through*/
        case -EINPROGRESS:
            ctx->req = NULL;
            ctx->cc_sector++;
            continue;

        /* sync */
        case 0:
            atomic_dec(&ctx->cc_pending);
            ctx->cc_sector++;
            cond_resched();
            continue;

        /* error */
        default:
            atomic_dec(&ctx->cc_pending);
            return r;
        }
    }

    return 0;
}
Пример #2
0
/*
 * Encrypt / decrypt data from one bio to another one (can be the same one)
 */
static int crypt_convert(struct crypt_config *cc,
			 struct convert_context *ctx)
{
	int r;

	atomic_set(&ctx->cc_pending, 1);

	while (ctx->iter_in.bi_size && ctx->iter_out.bi_size) {

		crypt_alloc_req(cc, ctx);

		atomic_inc(&ctx->cc_pending);

		r = crypt_convert_block(cc, ctx, ctx->req);

		switch (r) {
		/* async */
		case -EINPROGRESS:
		case -EBUSY:
			wait_for_completion(&ctx->restart);
			reinit_completion(&ctx->restart);
			ctx->req = NULL;
			ctx->cc_sector++;
			continue;

		/* sync */
		case 0:
			atomic_dec(&ctx->cc_pending);
			ctx->cc_sector++;
			cond_resched();
			continue;

		/* error */
		default:
			atomic_dec(&ctx->cc_pending);
			return r;
		}
	}

	return 0;
}