Home | History | Annotate | Download | only in ext4
      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 
     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