mirror of https://github.com/vitalif/e2fsprogs
73 lines
1.5 KiB
C
73 lines
1.5 KiB
C
![]() |
/*
|
||
|
* journal.c --- code for handling the "ext3" journal
|
||
|
*/
|
||
|
|
||
|
#include <errno.h>
|
||
|
|
||
|
#include "e2fsck.h"
|
||
|
|
||
|
/*
|
||
|
* This is a list of directories to try. The first element may get
|
||
|
* replaced by a mktemp'ed generated temp directory if possible.
|
||
|
*/
|
||
|
static char *dirlist[] = { "/mnt", "/tmp", "/root", "/boot", 0 };
|
||
|
|
||
|
/*
|
||
|
* This function attempts to mount and unmount an ext3 filesystem,
|
||
|
* which is a cheap way to force the kernel to run the journal and
|
||
|
* handle the recovery for us.
|
||
|
*/
|
||
|
int e2fsck_run_ext3_journal(const char *device)
|
||
|
{
|
||
|
int ret = 0;
|
||
|
char **cpp, *dir;
|
||
|
char template[] = "/tmp/ext3.XXXXXX";
|
||
|
char *tmpdir;
|
||
|
|
||
|
/*
|
||
|
* First try to make a temporary directory. This may fail if
|
||
|
* the root partition is still mounted read-only.
|
||
|
*/
|
||
|
tmpdir = mktemp(template);
|
||
|
if (tmpdir) {
|
||
|
ret = mkdir(template, 0700);
|
||
|
if (ret)
|
||
|
tmpdir = 0;
|
||
|
}
|
||
|
if (tmpdir) {
|
||
|
ret = mount(device, tmpdir, "ext3", 0xC0ED, NULL);
|
||
|
if (ret) {
|
||
|
ret = errno;
|
||
|
rmdir(tmpdir);
|
||
|
return (ret);
|
||
|
}
|
||
|
} else {
|
||
|
/*
|
||
|
* OK, creating a temporary directory didn't work.
|
||
|
* Let's try a list of possible temporary mountpoints.
|
||
|
*/
|
||
|
for (cpp = dirlist; dir = *cpp; cpp++) {
|
||
|
ret = mount(device, dir, "ext3", 0xC0ED, NULL);
|
||
|
if (ret == 0)
|
||
|
break;
|
||
|
}
|
||
|
if (!dir)
|
||
|
return errno;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Now that it mounted cleanly, the filesystem will have been
|
||
|
* recovered, so we can now unmount it.
|
||
|
*/
|
||
|
ret = umount(device);
|
||
|
if (ret)
|
||
|
return errno;
|
||
|
/*
|
||
|
* Remove the temporary directory, if it was created.
|
||
|
*/
|
||
|
if (tmpdir)
|
||
|
rmdir(tmpdir);
|
||
|
return 0;
|
||
|
}
|
||
|
|