Merge "fs_mgr: make block devices read-only"

This commit is contained in:
Nick Kralevich 2013-04-25 20:22:20 +00:00 committed by Android (Google) Code Review
commit 44a5fb5704
3 changed files with 73 additions and 5 deletions

View file

@ -72,6 +72,8 @@ static char *find_mount(const char *dir)
static int remount_system()
{
char *dev;
int fd;
int OFF = 0;
if (system_ro == 0) {
return 0;
@ -82,6 +84,13 @@ static int remount_system()
if (!dev)
return -1;
fd = unix_open(dev, O_RDONLY);
if (fd < 0)
return -1;
ioctl(fd, BLKROSET, &OFF);
adb_close(fd);
system_ro = mount(dev, "/system", "none", MS_REMOUNT, NULL);
free(dev);

View file

@ -487,6 +487,43 @@ static void remove_trailing_slashes(char *n)
}
}
/*
* Mark the given block device as read-only, using the BLKROSET ioctl.
* Return 0 on success, and -1 on error.
*/
static void fs_set_blk_ro(const char *blockdev)
{
int fd;
int ON = 1;
fd = open(blockdev, O_RDONLY);
if (fd < 0) {
// should never happen
return;
}
ioctl(fd, BLKROSET, &ON);
close(fd);
}
/*
* __mount(): wrapper around the mount() system call which also
* sets the underlying block device to read-only if the mount is read-only.
* See "man 2 mount" for return values.
*/
static int __mount(const char *source, const char *target,
const char *filesystemtype, unsigned long mountflags,
const void *data)
{
int ret = mount(source, target, filesystemtype, mountflags, data);
if ((ret == 0) && (mountflags & MS_RDONLY) != 0) {
fs_set_blk_ro(source);
}
return ret;
}
static int fs_match(char *in1, char *in2)
{
char *n1;
@ -539,9 +576,9 @@ int fs_mgr_mount_all(struct fstab *fstab)
fstab->recs[i].mount_point);
}
mret = mount(fstab->recs[i].blk_device, fstab->recs[i].mount_point,
fstab->recs[i].fs_type, fstab->recs[i].flags,
fstab->recs[i].fs_options);
mret = __mount(fstab->recs[i].blk_device, fstab->recs[i].mount_point,
fstab->recs[i].fs_type, fstab->recs[i].flags,
fstab->recs[i].fs_options);
if (!mret) {
/* Success! Go get the next one */
continue;
@ -621,8 +658,8 @@ int fs_mgr_do_mount(struct fstab *fstab, char *n_name, char *n_blk_device,
} else {
m = fstab->recs[i].mount_point;
}
if (mount(n_blk_device, m, fstab->recs[i].fs_type,
fstab->recs[i].flags, fstab->recs[i].fs_options)) {
if (__mount(n_blk_device, m, fstab->recs[i].fs_type,
fstab->recs[i].flags, fstab->recs[i].fs_options)) {
ERROR("Cannot mount filesystem on %s at %s\n",
n_blk_device, m);
goto out;

View file

@ -138,6 +138,24 @@ parse_mount_options(char *arg, unsigned long rwflag, struct extra_opts *extra, i
return rwflag;
}
/*
* Mark the given block device as read-write, using the BLKROSET ioctl.
*/
static void fs_set_blk_rw(const char *blockdev)
{
int fd;
int OFF = 0;
fd = open(blockdev, O_RDONLY);
if (fd < 0) {
// should never happen
return;
}
ioctl(fd, BLKROSET, &OFF);
close(fd);
}
static char *progname;
static struct extra_opts extra;
@ -179,6 +197,10 @@ do_mount(char *dev, char *dir, char *type, unsigned long rwflag, void *data, int
dev = loopdev;
}
if ((rwflag & MS_RDONLY) == 0) {
fs_set_blk_rw(dev);
}
while ((s = strsep(&type, ",")) != NULL) {
retry:
if (mount(dev, dir, s, rwflag, data) == -1) {