12633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall#include <sys/types.h> 22633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall#include <sys/stat.h> 32633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall#include <fcntl.h> 42633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall#include <stdio.h> 52633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall#include <stdlib.h> 62633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall 72633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall#define SB_OFFSET 1024 82633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall#define SB_SIZE 1024 92633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall#define EXT4_MAGIC_OFFSET 0x38 102633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall#define EXT4_STATE_OFFSET 0x3A 112633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall 122633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrallint main(int argc, char *argv[]) 132633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall{ 142633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall int fd; 152633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall char me[] = "set_ext4_err_bit"; 162633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall unsigned char sb[1024]; 172633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall 182633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall if (argc != 2) { 192633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall fprintf(stderr, "%s: Usage: %s <ext4_block_device>\n", me, me); 202633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall exit(1); 212633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall } 222633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall 232633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall fd = open(argv[1], O_RDWR); 242633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall 252633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall if (fd < 0) { 262633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall fprintf(stderr, "%s: Cannot open block device %s\n", me, argv[1]); 272633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall exit(1); 282633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall } 292633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall 302633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall if (lseek(fd, SB_OFFSET, SEEK_SET) == -1) { 312633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall fprintf(stderr, "%s: Cannot lseek to superblock to read\n", me); 322633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall exit(1); 332633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall } 342633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall 352633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall if (read(fd, sb, SB_SIZE) != SB_SIZE) { 362633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall fprintf(stderr, "%s: Cannot read superblock\n", me); 372633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall exit(1); 382633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall } 392633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall 402633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall if ((sb[EXT4_MAGIC_OFFSET] != 0x53) || (sb[EXT4_MAGIC_OFFSET+1] != 0xEF)) { 412633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall fprintf(stderr, "%s: invalid superblock magic\n", me); 422633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall exit(1); 432633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall } 442633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall 452633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall /* Set the errors detected bit */ 462633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall sb[EXT4_STATE_OFFSET] |= 0x2; 472633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall 482633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall if (lseek(fd, SB_OFFSET, SEEK_SET) == -1) { 492633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall fprintf(stderr, "%s: Cannot lseek to superblock to write\n", me); 502633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall exit(1); 512633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall } 522633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall 532633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall if (write(fd, sb, SB_SIZE) != SB_SIZE) { 542633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall fprintf(stderr, "%s: Cannot write superblock\n", me); 552633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall exit(1); 562633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall } 572633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall 582633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall close(fd); 592633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall 602633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall return 0; 612633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall} 622633ce5ca5024d5565c9068c29ec39a8c3ed10e9Ken Sumrall 63