You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
1.6 KiB
77 lines
1.6 KiB
/* |
|
* Copyright (C) 2011 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 "ext4_utils/wipe.h" |
|
|
|
#include "ext4_utils/ext4_utils.h" |
|
|
|
#if WIPE_IS_SUPPORTED |
|
|
|
#if defined(__linux__) |
|
|
|
#include <linux/fs.h> |
|
#include <sys/ioctl.h> |
|
|
|
#ifndef BLKDISCARD |
|
#define BLKDISCARD _IO(0x12,119) |
|
#endif |
|
|
|
#ifndef BLKSECDISCARD |
|
#define BLKSECDISCARD _IO(0x12,125) |
|
#endif |
|
|
|
int wipe_block_device(int fd, s64 len) |
|
{ |
|
u64 range[2]; |
|
int ret; |
|
|
|
if (!is_block_device_fd(fd)) { |
|
// Wiping only makes sense on a block device. |
|
return 0; |
|
} |
|
|
|
range[0] = 0; |
|
range[1] = len; |
|
ret = ioctl(fd, BLKSECDISCARD, &range); |
|
if (ret < 0) { |
|
range[0] = 0; |
|
range[1] = len; |
|
ret = ioctl(fd, BLKDISCARD, &range); |
|
if (ret < 0) { |
|
warn("Discard failed\n"); |
|
return 1; |
|
} else { |
|
warn("Wipe via secure discard failed, used discard instead\n"); |
|
return 0; |
|
} |
|
} |
|
|
|
return 0; |
|
} |
|
|
|
#else /* __linux__ */ |
|
#error "Missing block device wiping implementation for this platform!" |
|
#endif |
|
|
|
#else /* WIPE_IS_SUPPORTED */ |
|
|
|
int wipe_block_device(int fd, s64 len) |
|
{ |
|
/* Wiping is not supported on this platform. */ |
|
return 1; |
|
} |
|
|
|
#endif /* WIPE_IS_SUPPORTED */
|
|
|