1f08c3bdfSopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 2f08c3bdfSopenharmony_ci/* 3f08c3bdfSopenharmony_ci * Copyright (c) 2016 Linux Test Project 4f08c3bdfSopenharmony_ci * Copyright (C) 2021 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com> 5f08c3bdfSopenharmony_ci */ 6f08c3bdfSopenharmony_ci#define _GNU_SOURCE 7f08c3bdfSopenharmony_ci 8f08c3bdfSopenharmony_ci#include <stdlib.h> 9f08c3bdfSopenharmony_ci#include <sys/mount.h> 10f08c3bdfSopenharmony_ci#include <stdint.h> 11f08c3bdfSopenharmony_ci#include <stdio.h> 12f08c3bdfSopenharmony_ci#include <lapi/loop.h> 13f08c3bdfSopenharmony_ci#include <time.h> 14f08c3bdfSopenharmony_ci 15f08c3bdfSopenharmony_ci#include "tst_test.h" 16f08c3bdfSopenharmony_ci 17f08c3bdfSopenharmony_ci#define DEVBLOCKSIZE 2048 18f08c3bdfSopenharmony_ci#define DEV_MIN_SIZE 310 19f08c3bdfSopenharmony_ci 20f08c3bdfSopenharmony_cistatic char *mntpoint; 21f08c3bdfSopenharmony_cistatic uint64_t ltp_dev_size; 22f08c3bdfSopenharmony_ci 23f08c3bdfSopenharmony_cistatic int set_block_size(int fd) 24f08c3bdfSopenharmony_ci{ 25f08c3bdfSopenharmony_ci return ioctl(fd, LOOP_SET_BLOCK_SIZE, DEVBLOCKSIZE); 26f08c3bdfSopenharmony_ci} 27f08c3bdfSopenharmony_ci 28f08c3bdfSopenharmony_cistatic void setup(void) 29f08c3bdfSopenharmony_ci{ 30f08c3bdfSopenharmony_ci int fd; 31f08c3bdfSopenharmony_ci int ret; 32f08c3bdfSopenharmony_ci 33f08c3bdfSopenharmony_ci ret = asprintf(&mntpoint, "%s/mnt", tst_get_tmpdir()); 34f08c3bdfSopenharmony_ci if (ret < 0) 35f08c3bdfSopenharmony_ci tst_brk(TBROK, "asprintf failure"); 36f08c3bdfSopenharmony_ci 37f08c3bdfSopenharmony_ci fd = SAFE_OPEN(tst_device->dev, O_RDONLY); 38f08c3bdfSopenharmony_ci 39f08c3bdfSopenharmony_ci SAFE_IOCTL(fd, BLKGETSIZE64, <p_dev_size); 40f08c3bdfSopenharmony_ci 41f08c3bdfSopenharmony_ci TST_RETRY_FN_EXP_BACKOFF(set_block_size(fd), TST_RETVAL_EQ0, 10); 42f08c3bdfSopenharmony_ci 43f08c3bdfSopenharmony_ci SAFE_CLOSE(fd); 44f08c3bdfSopenharmony_ci 45f08c3bdfSopenharmony_ci SAFE_MKFS(tst_device->dev, tst_device->fs_type, NULL, NULL); 46f08c3bdfSopenharmony_ci 47f08c3bdfSopenharmony_ci SAFE_MKDIR(mntpoint, 0777); 48f08c3bdfSopenharmony_ci SAFE_MOUNT(tst_device->dev, mntpoint, tst_device->fs_type, 0, 0); 49f08c3bdfSopenharmony_ci} 50f08c3bdfSopenharmony_ci 51f08c3bdfSopenharmony_cistatic void cleanup(void) 52f08c3bdfSopenharmony_ci{ 53f08c3bdfSopenharmony_ci if (tst_is_mounted(mntpoint)) 54f08c3bdfSopenharmony_ci SAFE_UMOUNT(mntpoint); 55f08c3bdfSopenharmony_ci} 56f08c3bdfSopenharmony_ci 57f08c3bdfSopenharmony_cistatic void test_dev_min_size(void) 58f08c3bdfSopenharmony_ci{ 59f08c3bdfSopenharmony_ci uint64_t size; 60f08c3bdfSopenharmony_ci 61f08c3bdfSopenharmony_ci size = ltp_dev_size / 1024 / 1024; 62f08c3bdfSopenharmony_ci 63f08c3bdfSopenharmony_ci if (size == DEV_MIN_SIZE) 64f08c3bdfSopenharmony_ci tst_res(TPASS, "Got expected device size %lu", size); 65f08c3bdfSopenharmony_ci else 66f08c3bdfSopenharmony_ci tst_res(TFAIL, "Expected device size is %d but got %lu", 67f08c3bdfSopenharmony_ci DEV_MIN_SIZE, size); 68f08c3bdfSopenharmony_ci} 69f08c3bdfSopenharmony_ci 70f08c3bdfSopenharmony_cistatic void test_tst_find_backing_dev(void) 71f08c3bdfSopenharmony_ci{ 72f08c3bdfSopenharmony_ci char block_dev[100]; 73f08c3bdfSopenharmony_ci 74f08c3bdfSopenharmony_ci tst_find_backing_dev(mntpoint, block_dev, sizeof(block_dev)); 75f08c3bdfSopenharmony_ci 76f08c3bdfSopenharmony_ci if (!strcmp(tst_device->dev, block_dev)) 77f08c3bdfSopenharmony_ci tst_res(TPASS, "%s belongs to %s block dev", mntpoint, 78f08c3bdfSopenharmony_ci block_dev); 79f08c3bdfSopenharmony_ci else 80f08c3bdfSopenharmony_ci tst_res(TFAIL, "%s should belong to %s, but %s is returned", 81f08c3bdfSopenharmony_ci mntpoint, tst_device->dev, block_dev); 82f08c3bdfSopenharmony_ci} 83f08c3bdfSopenharmony_ci 84f08c3bdfSopenharmony_cistatic void test_tst_dev_block_size(void) 85f08c3bdfSopenharmony_ci{ 86f08c3bdfSopenharmony_ci int block_size; 87f08c3bdfSopenharmony_ci 88f08c3bdfSopenharmony_ci block_size = tst_dev_block_size(mntpoint); 89f08c3bdfSopenharmony_ci 90f08c3bdfSopenharmony_ci if (block_size == DEVBLOCKSIZE) 91f08c3bdfSopenharmony_ci tst_res(TPASS, "%s has %d block size", mntpoint, block_size); 92f08c3bdfSopenharmony_ci else 93f08c3bdfSopenharmony_ci tst_res(TFAIL, "%s has %d block size, but expected is %i", 94f08c3bdfSopenharmony_ci mntpoint, block_size, DEVBLOCKSIZE); 95f08c3bdfSopenharmony_ci} 96f08c3bdfSopenharmony_ci 97f08c3bdfSopenharmony_cistatic void do_test(void) 98f08c3bdfSopenharmony_ci{ 99f08c3bdfSopenharmony_ci test_dev_min_size(); 100f08c3bdfSopenharmony_ci test_tst_find_backing_dev(); 101f08c3bdfSopenharmony_ci test_tst_dev_block_size(); 102f08c3bdfSopenharmony_ci} 103f08c3bdfSopenharmony_ci 104f08c3bdfSopenharmony_cistatic struct tst_test test = { 105f08c3bdfSopenharmony_ci .needs_root = 1, 106f08c3bdfSopenharmony_ci .needs_device = 1, 107f08c3bdfSopenharmony_ci .dev_min_size = DEV_MIN_SIZE, 108f08c3bdfSopenharmony_ci .test_all = do_test, 109f08c3bdfSopenharmony_ci .setup = setup, 110f08c3bdfSopenharmony_ci .cleanup = cleanup, 111f08c3bdfSopenharmony_ci .min_kver = "4.14", 112f08c3bdfSopenharmony_ci}; 113