summaryrefslogtreecommitdiffstats
path: root/sys/fs/msdosfs
diff options
context:
space:
mode:
authorrodrigc <rodrigc@FreeBSD.org>2007-01-06 20:46:02 +0000
committerrodrigc <rodrigc@FreeBSD.org>2007-01-06 20:46:02 +0000
commita533f9bcf630791d3f0d1f3537afbae114d8f145 (patch)
treeec58232f798b513b925dc497192dbd72e8a14e5f /sys/fs/msdosfs
parent9131a172735d17248d28f501ef0eb37ef082434f (diff)
downloadFreeBSD-src-a533f9bcf630791d3f0d1f3537afbae114d8f145.zip
FreeBSD-src-a533f9bcf630791d3f0d1f3537afbae114d8f145.tar.gz
When performing a mount update to change a mount from read-only to read-write,
do not call markvoldirty() until the mount has been flagged as read-write. Due to the nature of the msdosfs code, this bug only seemed to appear for FAT-16 and FAT-32. This fixes the testcase: #!/bin/sh dd if=/dev/zero bs=1m count=1 oseek=119 of=image.msdos mdconfig -a -t vnode -f image.msdos newfs_msdos -F 16 /dev/md0 fd120m mount_msdosfs -o ro /dev/md0 /mnt mount | grep md0 mount -u -o rw /dev/md0; echo $? mount | grep md0 umount /mnt mdconfig -d -u 0 PR: 105412 Tested by: Eugene Grosbein <eugen grosbein pp ru>
Diffstat (limited to 'sys/fs/msdosfs')
-rw-r--r--sys/fs/msdosfs/msdosfs_vfsops.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/sys/fs/msdosfs/msdosfs_vfsops.c b/sys/fs/msdosfs/msdosfs_vfsops.c
index eb872bc..5bc7ba8 100644
--- a/sys/fs/msdosfs/msdosfs_vfsops.c
+++ b/sys/fs/msdosfs/msdosfs_vfsops.c
@@ -259,6 +259,7 @@ msdosfs_mount(struct mount *mp, struct thread *td)
* read/write; if there is no device name, that's all we do.
*/
if (mp->mnt_flag & MNT_UPDATE) {
+ int ro_to_rw = 0;
pmp = VFSTOMSDOSFS(mp);
if (vfs_flagopt(mp->mnt_optnew, "export", NULL, 0)) {
@@ -317,15 +318,20 @@ msdosfs_mount(struct mount *mp, struct thread *td)
if (error)
return (error);
- /* Now that the volume is modifiable, mark it dirty. */
- error = markvoldirty(pmp, 1);
- if (error)
- return (error);
+ ro_to_rw = 1;
}
vfs_flagopt(mp->mnt_optnew, "ro",
&pmp->pm_flags, MSDOSFSMNT_RONLY);
vfs_flagopt(mp->mnt_optnew, "ro",
&mp->mnt_flag, MNT_RDONLY);
+
+ if (ro_to_rw) {
+ /* Now that the volume is modifiable, mark it dirty. */
+ error = markvoldirty(pmp, 1);
+ if (error)
+ return (error);
+ }
+
if (vfs_getopt(mp->mnt_optnew, "from", NULL, NULL)) {
#ifdef __notyet__ /* doesn't work correctly with current mountd XXX */
if (args.flags & MSDOSFSMNT_MNTOPT) {
OpenPOWER on IntegriCloud