summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Sumrall <ksumrall@android.com>2012-11-13 16:26:59 -0800
committerKen Sumrall <ksumrall@android.com>2013-02-08 14:16:48 -0800
commit6002c64f41c3e169e68eeb4c5272c6ec63642514 (patch)
treee3819ea3f9a08dff0f9e2a735729e2be8df8925f
parent3e5822584d54b605c296a7fac78d4cc3f949e5ca (diff)
downloadextras-6002c64f41c3e169e68eeb4c5272c6ec63642514.tar.gz
A testing/debugging tool to wipe partitions
This is basically a command line tool version of the wipe_block_device() function in libext4_utils. Useful for testing and/or debugging the BLKSECDISCARD and BLKDISCARD ioctls. Change-Id: I733f0f7daa673624ddbaac055d82b64d741acd70
-rw-r--r--tests/ext4/Android.mk3
-rw-r--r--tests/storage/Android.mk6
-rw-r--r--tests/storage/wipe_blkdev.c131
3 files changed, 137 insertions, 3 deletions
diff --git a/tests/ext4/Android.mk b/tests/ext4/Android.mk
index 36f2e17d..0c0cdd08 100644
--- a/tests/ext4/Android.mk
+++ b/tests/ext4/Android.mk
@@ -4,7 +4,6 @@ LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= corrupt_gdt_free_blocks.c
-
LOCAL_MODULE:= corrupt_gdt_free_blocks
LOCAL_MODULE_TAGS := debug
LOCAL_C_INCLUDES += system/extras/ext4_utils
@@ -15,7 +14,6 @@ include $(BUILD_EXECUTABLE)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= set_ext4_err_bit.c
-
LOCAL_MODULE:= set_ext4_err_bit
LOCAL_MODULE_TAGS := debug
@@ -25,7 +23,6 @@ include $(BUILD_EXECUTABLE)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= rand_emmc_perf.c
-
LOCAL_MODULE:= rand_emmc_perf
LOCAL_MODULE_TAGS := optional
LOCAL_FORCE_STATIC_EXECUTABLE := true
diff --git a/tests/storage/Android.mk b/tests/storage/Android.mk
index 48f0029f..462ebef6 100644
--- a/tests/storage/Android.mk
+++ b/tests/storage/Android.mk
@@ -9,3 +9,9 @@ LOCAL_MODULE := opentest
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := wipe_blkdev.c
+LOCAL_MODULE := wipe_blkdev
+LOCAL_MODULE_TAGS := optional
+include $(BUILD_EXECUTABLE)
+
diff --git a/tests/storage/wipe_blkdev.c b/tests/storage/wipe_blkdev.c
new file mode 100644
index 00000000..43b630b9
--- /dev/null
+++ b/tests/storage/wipe_blkdev.c
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2011, 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <linux/fs.h>
+#include <errno.h>
+
+typedef unsigned long long u64;
+
+#ifndef BLKDISCARD
+#define BLKDISCARD _IO(0x12,119)
+#endif
+
+#ifndef BLKSECDISCARD
+#define BLKSECDISCARD _IO(0x12,125)
+#endif
+
+static u64 get_block_device_size(int fd)
+{
+ u64 size = 0;
+ int ret;
+
+ ret = ioctl(fd, BLKGETSIZE64, &size);
+
+ if (ret)
+ return 0;
+
+ return size;
+}
+
+static int wipe_block_device(int fd, u64 len, int secure)
+{
+ u64 range[2];
+ int ret;
+ int req;
+
+ range[0] = 0;
+ range[1] = len;
+ if (secure) {
+ req = BLKSECDISCARD;
+ } else {
+ req = BLKDISCARD;
+ }
+
+ ret = ioctl(fd, req, &range);
+ if (ret < 0) {
+ fprintf(stderr, "%s discard failed, errno = %d\n",
+ secure ? "Secure" : "Nonsecure", errno);
+ }
+
+ return ret;
+}
+
+static void usage(void)
+{
+ fprintf(stderr, "Usage: wipe_blkdev [-s] <partition>\n");
+ exit(1);
+}
+
+int main(int argc, char *argv[])
+{
+ int secure = 0;
+ char *devname;
+ int fd;
+ u64 len;
+ struct stat statbuf;
+ int ret;
+
+ if ((argc != 2) && (argc != 3)) {
+ usage();
+ }
+
+ if (argc == 3) {
+ if (!strcmp(argv[1], "-s")) {
+ secure = 1;
+ devname = argv[2];
+ } else {
+ usage();
+ }
+ } else {
+ devname = argv[1];
+ }
+
+ fd = open(devname, O_RDWR);
+ if (fd < 0) {
+ fprintf(stderr, "Cannot open device %s\n", devname);
+ exit(1);
+ }
+
+ if (fstat(fd, &statbuf) < 0) {
+ fprintf(stderr, "Cannot stat %s\n", devname);
+ exit(1);
+ }
+
+ if (!S_ISBLK(statbuf.st_mode)) {
+ fprintf(stderr, "%s is not a block device\n", devname);
+ exit(1);
+ }
+
+ len = get_block_device_size(fd);
+
+ if (! len) {
+ fprintf(stderr, "Cannot get size of block device %s\n", devname);
+ exit(1);
+ }
+
+ ret = wipe_block_device(fd, len, secure);
+
+ close(fd);
+
+ return ret;
+}