1 #include <sys/types.h>
2 #include <sys/stat.h>
3 #include <fcntl.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6
7 #define SB_OFFSET 1024
8 #define SB_SIZE 1024
9 #define EXT4_MAGIC_OFFSET 0x38
10 #define EXT4_STATE_OFFSET 0x3A
11
main(int argc,char * argv[])12 int main(int argc, char *argv[])
13 {
14 int fd;
15 char me[] = "set_ext4_err_bit";
16 unsigned char sb[1024];
17
18 if (argc != 2) {
19 fprintf(stderr, "%s: Usage: %s <ext4_block_device>\n", me, me);
20 exit(1);
21 }
22
23 fd = open(argv[1], O_RDWR);
24
25 if (fd < 0) {
26 fprintf(stderr, "%s: Cannot open block device %s\n", me, argv[1]);
27 exit(1);
28 }
29
30 if (lseek(fd, SB_OFFSET, SEEK_SET) == -1) {
31 fprintf(stderr, "%s: Cannot lseek to superblock to read\n", me);
32 exit(1);
33 }
34
35 if (read(fd, sb, SB_SIZE) != SB_SIZE) {
36 fprintf(stderr, "%s: Cannot read superblock\n", me);
37 exit(1);
38 }
39
40 if ((sb[EXT4_MAGIC_OFFSET] != 0x53) || (sb[EXT4_MAGIC_OFFSET+1] != 0xEF)) {
41 fprintf(stderr, "%s: invalid superblock magic\n", me);
42 exit(1);
43 }
44
45 /* Set the errors detected bit */
46 sb[EXT4_STATE_OFFSET] |= 0x2;
47
48 if (lseek(fd, SB_OFFSET, SEEK_SET) == -1) {
49 fprintf(stderr, "%s: Cannot lseek to superblock to write\n", me);
50 exit(1);
51 }
52
53 if (write(fd, sb, SB_SIZE) != SB_SIZE) {
54 fprintf(stderr, "%s: Cannot write superblock\n", me);
55 exit(1);
56 }
57
58 close(fd);
59
60 return 0;
61 }
62
63