mkjournal.c revision 19dacda2b02bb08c0ffb649f84526b249c749279
119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * mkjournal.c --- make a journal for a filesystem 319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright (C) 2000 Theodore Ts'o. 519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %Begin-Header% 719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This file may be redistributed under the terms of the GNU Public 819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * License. 919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %End-Header% 1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdio.h> 1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <string.h> 1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_UNISTD_H 1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <unistd.h> 1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_ERRNO_H 1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <errno.h> 1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <fcntl.h> 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <time.h> 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_SYS_STAT_H 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/stat.h> 2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_SYS_TYPES_H 2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/types.h> 2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_SYS_IOCTL_H 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/ioctl.h> 3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_NETINET_IN_H 3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <netinet/in.h> 3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ext2_fs.h" 3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "e2p/e2p.h" 3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ext2fs.h" 3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "jfs_user.h" 3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This function automatically sets up the journal superblock and 4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * returns it as an allocated block. 4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ext2fs_create_journal_superblock(ext2_filsys fs, 4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project __u32 size, int flags, 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char **ret_jsb) 4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project journal_superblock_t *jsb; 5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (size < 1024) 5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return EXT2_ET_JOURNAL_TOO_SMALL; 5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((retval = ext2fs_get_mem(fs->blocksize, &jsb))) 5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project memset (jsb, 0, fs->blocksize); 5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project jsb->s_header.h_magic = htonl(JFS_MAGIC_NUMBER); 6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (flags & EXT2_MKJOURNAL_V1_SUPER) 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project jsb->s_header.h_blocktype = htonl(JFS_SUPERBLOCK_V1); 6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project jsb->s_header.h_blocktype = htonl(JFS_SUPERBLOCK_V2); 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project jsb->s_blocksize = htonl(fs->blocksize); 6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project jsb->s_maxlen = htonl(size); 6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project jsb->s_nr_users = htonl(1); 6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project jsb->s_first = htonl(1); 6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project jsb->s_sequence = htonl(1); 6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project memcpy(jsb->s_uuid, fs->super->s_uuid, sizeof(fs->super->s_uuid)); 7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* 7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * If we're creating an external journal device, we need to 7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * adjust these fields. 7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fs->super->s_feature_incompat & 7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT3_FEATURE_INCOMPAT_JOURNAL_DEV) { 7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project jsb->s_nr_users = 0; 7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fs->blocksize == 1024) 7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project jsb->s_first = htonl(3); 7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project jsb->s_first = htonl(2); 8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *ret_jsb = (char *) jsb; 8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This function writes a journal using POSIX routines. It is used 8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * for creating external journals and creating journals on live 9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * filesystems. 9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic errcode_t write_journal_file(ext2_filsys fs, char *filename, 9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t size, int flags) 9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *buf = 0; 9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int fd, ret_size; 9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t i; 9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((retval = ext2fs_create_journal_superblock(fs, size, flags, &buf))) 10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* Open the device or journal file */ 10419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((fd = open(filename, O_WRONLY)) < 0) { 10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = errno; 10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto errout; 10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* Write the superblock out */ 11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = EXT2_ET_SHORT_WRITE; 11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ret_size = write(fd, buf, fs->blocksize); 11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ret_size < 0) { 11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = errno; 11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto errout; 11519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ret_size != (int) fs->blocksize) 11719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto errout; 11819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project memset(buf, 0, fs->blocksize); 11919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 12019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (i = 1; i < size; i++) { 12119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ret_size = write(fd, buf, fs->blocksize); 12219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ret_size < 0) { 12319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = errno; 12419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto errout; 12519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 12619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ret_size != (int) fs->blocksize) 12719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto errout; 12819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 12919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project close(fd); 13019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 13119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = 0; 13219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrout: 13319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_free_mem(&buf); 13419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 13519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 13619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 13719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 13819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Helper function for creating the journal using direct I/O routines 13919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 14019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstruct mkjournal_struct { 14119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int num_blocks; 14219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int newblocks; 14319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *buf; 14419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t err; 14519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}; 14619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 14719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic int mkjournal_proc(ext2_filsys fs, 14819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t *blocknr, 14919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project e2_blkcnt_t blockcnt, 15019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t ref_block EXT2FS_ATTR((unused)), 15119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int ref_offset EXT2FS_ATTR((unused)), 15219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project void *priv_data) 15319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 15419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct mkjournal_struct *es = (struct mkjournal_struct *) priv_data; 15519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t new_blk; 15619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project static blk_t last_blk = 0; 15719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 15819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 15919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*blocknr) { 16019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project last_blk = *blocknr; 16119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 16219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 16319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_new_block(fs, last_blk, 0, &new_blk); 16419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 16519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project es->err = retval; 16619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return BLOCK_ABORT; 16719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 16819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (blockcnt > 0) 16919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project es->num_blocks--; 17019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 17119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project es->newblocks++; 17219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = io_channel_write_blk(fs->io, new_blk, 1, es->buf); 17319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 17419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (blockcnt == 0) 17519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project memset(es->buf, 0, fs->blocksize); 17619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 17719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 17819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project es->err = retval; 17919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return BLOCK_ABORT; 18019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 18119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *blocknr = new_blk; 18219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project last_blk = new_blk; 18319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_block_alloc_stats(fs, new_blk, +1); 18419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 18519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (es->num_blocks == 0) 18619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return (BLOCK_CHANGED | BLOCK_ABORT); 18719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 18819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return BLOCK_CHANGED; 18919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 19019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 19119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 19219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 19319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This function creates a journal using direct I/O routines. 19419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 19519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic errcode_t write_journal_inode(ext2_filsys fs, ext2_ino_t journal_ino, 19619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t size, int flags) 19719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 19819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *buf; 19919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 20019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ext2_inode inode; 20119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct mkjournal_struct es; 20219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 20319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((retval = ext2fs_create_journal_superblock(fs, size, flags, &buf))) 20419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 20519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 20619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((retval = ext2fs_read_bitmaps(fs))) 20719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 20819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 20919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((retval = ext2fs_read_inode(fs, journal_ino, &inode))) 21019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 21119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 21219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (inode.i_blocks > 0) 21319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return EEXIST; 21419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 21519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project es.num_blocks = size; 21619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project es.newblocks = 0; 21719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project es.buf = buf; 21819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project es.err = 0; 21919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 22019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_block_iterate2(fs, journal_ino, BLOCK_FLAG_APPEND, 22119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 0, mkjournal_proc, &es); 22219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (es.err) { 22319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = es.err; 22419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto errout; 22519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 22619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 22719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((retval = ext2fs_read_inode(fs, journal_ino, &inode))) 22819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto errout; 22919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 23019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode.i_size += fs->blocksize * size; 23119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode.i_blocks += (fs->blocksize / 512) * es.newblocks; 23219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode.i_mtime = inode.i_ctime = fs->now ? fs->now : time(0); 23319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode.i_links_count = 1; 23419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode.i_mode = LINUX_S_IFREG | 0600; 23519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 23619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((retval = ext2fs_write_inode(fs, journal_ino, &inode))) 23719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto errout; 23819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = 0; 23919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 24019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project memcpy(fs->super->s_jnl_blocks, inode.i_block, EXT2_N_BLOCKS*4); 24119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->super->s_jnl_blocks[16] = inode.i_size; 24219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->super->s_jnl_backup_type = EXT3_JNL_BACKUP_BLOCKS; 24319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_mark_super_dirty(fs); 24419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 24519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrout: 24619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_free_mem(&buf); 24719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 24819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 24919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 25019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 25119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Find a reasonable journal file size (in blocks) given the number of blocks 25219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * in the filesystem. For very small filesystems, it is not reasonable to 25319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * have a journal that fills more than half of the filesystem. 25419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 25519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint ext2fs_default_journal_size(__u64 blocks) 25619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 25719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (blocks < 2048) 25819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return -1; 25919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (blocks < 32768) 26019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return (1024); 26119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (blocks < 256*1024) 26219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return (4096); 26319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (blocks < 512*1024) 26419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return (8192); 26519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (blocks < 1024*1024) 26619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return (16384); 26719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 32768; 26819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 26919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 27019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 27119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This function adds a journal device to a filesystem 27219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 27319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ext2fs_add_journal_device(ext2_filsys fs, ext2_filsys journal_dev) 27419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 27519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct stat st; 27619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 27719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char buf[1024]; 27819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project journal_superblock_t *jsb; 27919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int start; 28019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project __u32 i, nr_users; 28119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 28219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* Make sure the device exists and is a block device */ 28319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (stat(journal_dev->device_name, &st) < 0) 28419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return errno; 28519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 28619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!S_ISBLK(st.st_mode)) 28719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return EXT2_ET_JOURNAL_NOT_BLOCK; /* Must be a block device */ 28819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 28919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* Get the journal superblock */ 29019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project start = 1; 29119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (journal_dev->blocksize == 1024) 29219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project start++; 29319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((retval = io_channel_read_blk(journal_dev->io, start, -1024, buf))) 29419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 29519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 29619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project jsb = (journal_superblock_t *) buf; 29719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((jsb->s_header.h_magic != (unsigned) ntohl(JFS_MAGIC_NUMBER)) || 29819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (jsb->s_header.h_blocktype != (unsigned) ntohl(JFS_SUPERBLOCK_V2))) 29919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return EXT2_ET_NO_JOURNAL_SB; 30019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 30119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ntohl(jsb->s_blocksize) != (unsigned long) fs->blocksize) 30219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return EXT2_ET_UNEXPECTED_BLOCK_SIZE; 30319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 30419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* Check and see if this filesystem has already been added */ 30519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project nr_users = ntohl(jsb->s_nr_users); 30619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (i=0; i < nr_users; i++) { 30719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (memcmp(fs->super->s_uuid, 30819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project &jsb->s_users[i*16], 16) == 0) 30919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 31019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 31119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (i >= nr_users) { 31219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project memcpy(&jsb->s_users[nr_users*16], 31319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->super->s_uuid, 16); 31419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project jsb->s_nr_users = htonl(nr_users+1); 31519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 31619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 31719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* Writeback the journal superblock */ 31819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((retval = io_channel_write_blk(journal_dev->io, start, -1024, buf))) 31919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 32019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 32119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->super->s_journal_inum = 0; 32219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->super->s_journal_dev = st.st_rdev; 32319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project memcpy(fs->super->s_journal_uuid, jsb->s_uuid, 32419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project sizeof(fs->super->s_journal_uuid)); 32519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->super->s_feature_compat |= EXT3_FEATURE_COMPAT_HAS_JOURNAL; 32619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_mark_super_dirty(fs); 32719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 32819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 32919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 33019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 33119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This function adds a journal inode to a filesystem, using either 33219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * POSIX routines if the filesystem is mounted, or using direct I/O 33319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * functions if it is not. 33419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 33519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ext2fs_add_journal_inode(ext2_filsys fs, blk_t size, int flags) 33619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 33719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 33819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_ino_t journal_ino; 33919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct stat st; 34019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char jfile[1024]; 34119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int mount_flags, f; 34219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int fd = -1; 34319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 34419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((retval = ext2fs_check_mount_point(fs->device_name, &mount_flags, 34519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project jfile, sizeof(jfile)-10))) 34619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 34719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 34819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (mount_flags & EXT2_MF_MOUNTED) { 34919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project strcat(jfile, "/.journal"); 35019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 35119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* 35219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * If .../.journal already exists, make sure any 35319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * immutable or append-only flags are cleared. 35419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 35519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if defined(HAVE_CHFLAGS) && defined(UF_NODUMP) 35619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (void) chflags (jfile, 0); 35719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else 35819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_EXT2_IOCTLS 35919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fd = open(jfile, O_RDONLY); 36019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fd >= 0) { 36119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project f = 0; 36219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ioctl(fd, EXT2_IOC_SETFLAGS, &f); 36319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project close(fd); 36419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 36519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 36619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 36719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 36819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* Create the journal file */ 36919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((fd = open(jfile, O_CREAT|O_WRONLY, 0600)) < 0) 37019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return errno; 37119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 37219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((retval = write_journal_file(fs, jfile, size, flags))) 37319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto errout; 37419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 37519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* Get inode number of the journal file */ 37619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fstat(fd, &st) < 0) 37719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto errout; 37819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 37919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if defined(HAVE_CHFLAGS) && defined(UF_NODUMP) 38019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = fchflags (fd, UF_NODUMP|UF_IMMUTABLE); 38119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else 38219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_EXT2_IOCTLS 38319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project f = EXT2_NODUMP_FL | EXT2_IMMUTABLE_FL; 38419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ioctl(fd, EXT2_IOC_SETFLAGS, &f); 38519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 38619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 38719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 38819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto errout; 38919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 39019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project close(fd); 39119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project journal_ino = st.st_ino; 39219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else { 39319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((mount_flags & EXT2_MF_BUSY) && 39419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project !(fs->flags & EXT2_FLAG_EXCLUSIVE)) { 39519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = EBUSY; 39619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto errout; 39719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 39819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project journal_ino = EXT2_JOURNAL_INO; 39919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((retval = write_journal_inode(fs, journal_ino, 40019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project size, flags))) 40119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 40219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 40319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 40419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->super->s_journal_inum = journal_ino; 40519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->super->s_journal_dev = 0; 40619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project memset(fs->super->s_journal_uuid, 0, 40719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project sizeof(fs->super->s_journal_uuid)); 40819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->super->s_feature_compat |= EXT3_FEATURE_COMPAT_HAS_JOURNAL; 40919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 41019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_mark_super_dirty(fs); 41119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 41219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrout: 41319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fd > 0) 41419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project close(fd); 41519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 41619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 41719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 41819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef DEBUG 41919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectmain(int argc, char **argv) 42019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 42119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 42219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *device_name; 42319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_filsys fs; 42419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 42519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (argc < 2) { 42619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, "Usage: %s filesystem\n", argv[0]); 42719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 42819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 42919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project device_name = argv[1]; 43019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 43119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_open (device_name, EXT2_FLAG_RW, 0, 0, 43219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unix_io_manager, &fs); 43319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 43419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], retval, "while opening %s", device_name); 43519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 43619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 43719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 43819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_add_journal_inode(fs, 1024); 43919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 44019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(argv[0], retval, "while adding journal to %s", 44119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project device_name); 44219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 44319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 44419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_flush(fs); 44519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 44619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Warning, had trouble writing out superblocks.\n"); 44719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 44819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_close(fs); 44919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(0); 45019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 45119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 45219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 453