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