bdev: check status parameter instead of bdev_io->status

A status member of spdk_bdev_io structure is set after the if block.
Therefore a status parameter should be checked instead of a status
member.

Change-Id: I4030a7fcdb36d9c589802ec5b4e424591dc2a3b6
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Tsuyoshi Uchida 2016-08-02 10:54:09 -07:00 committed by Ben Walker
parent 76469b2cf7
commit b13fecd3b3
2 changed files with 61 additions and 3 deletions

View File

@ -811,7 +811,7 @@ spdk_bdev_io_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status sta
{
if (bdev_io->type == SPDK_BDEV_IO_TYPE_RESET) {
/* Successful reset */
if (bdev_io->status == SPDK_BDEV_IO_STATUS_SUCCESS) {
if (status == SPDK_BDEV_IO_STATUS_SUCCESS) {
/* Increase the blockdev generation if it is a hard reset */
if (bdev_io->u.reset.type == SPDK_BDEV_RESET_HARD) {
bdev_io->bdev->gencnt++;

View File

@ -123,8 +123,10 @@ quick_test_complete(spdk_event_t event)
struct bdevio_request *req = spdk_event_get_arg1(event);
struct spdk_bdev_io *bdev_io = spdk_event_get_arg2(event);
spdk_put_io_channel(req->target->ch);
req->target->ch = NULL;
if (req->target->ch) {
spdk_put_io_channel(req->target->ch);
req->target->ch = NULL;
}
g_completion_status = bdev_io->status;
spdk_bdev_free_io(bdev_io);
wake_ut_thread();
@ -618,6 +620,60 @@ blockdev_overlapped_write_read_8k(void)
blockdev_write_read(data_length, 0, pattern, offset, expected_rc);
}
static void
__blockdev_reset(spdk_event_t event)
{
struct bdevio_request *req = spdk_event_get_arg1(event);
enum spdk_bdev_reset_type *reset_type = spdk_event_get_arg2(event);
struct io_target *target = req->target;
int rc;
rc = spdk_bdev_reset(target->bdev, *reset_type, quick_test_complete, req);
if (rc < 0) {
spdk_put_io_channel(target->ch);
target->ch = NULL;
g_completion_status = SPDK_BDEV_IO_STATUS_FAILED;
wake_ut_thread();
}
}
static void
blockdev_reset(struct io_target *target, enum spdk_bdev_reset_type reset_type)
{
struct bdevio_request req;
spdk_event_t event;
req.target = target;
g_completion_status = SPDK_BDEV_IO_STATUS_FAILED;
event = spdk_event_allocate(1, __blockdev_reset, &req, &reset_type, NULL);
pthread_mutex_lock(&g_test_mutex);
spdk_event_call(event);
pthread_cond_wait(&g_test_cond, &g_test_mutex);
pthread_mutex_unlock(&g_test_mutex);
}
static void
blockdev_test_reset(void)
{
struct io_target *target;
target = g_io_targets;
while (target != NULL) {
target->bdev->gencnt = 0;
blockdev_reset(target, SPDK_BDEV_RESET_HARD);
CU_ASSERT_EQUAL(g_completion_status, SPDK_BDEV_IO_STATUS_SUCCESS);
CU_ASSERT_EQUAL(target->bdev->gencnt, 1);
target->bdev->gencnt = 0;
blockdev_reset(target, SPDK_BDEV_RESET_SOFT);
CU_ASSERT_EQUAL(g_completion_status, SPDK_BDEV_IO_STATUS_SUCCESS);
CU_ASSERT_EQUAL(target->bdev->gencnt, 0);
target = target->next;
}
}
static void
test_main(spdk_event_t event)
@ -667,6 +723,8 @@ test_main(spdk_event_t event)
blockdev_writev_readv_size_gt_128k) == NULL
|| CU_add_test(suite, "blockdev writev readv size > 128k in two iovs",
blockdev_writev_readv_size_gt_128k_two_iov) == NULL
|| CU_add_test(suite, "blockdev reset",
blockdev_test_reset) == NULL
) {
CU_cleanup_registry();
spdk_app_stop(CU_get_error());