diff options
author | attilio <attilio@FreeBSD.org> | 2012-11-10 19:32:16 +0000 |
---|---|---|
committer | attilio <attilio@FreeBSD.org> | 2012-11-10 19:32:16 +0000 |
commit | 0a289d546bde4f4a1b513aa568714d69732d3dc1 (patch) | |
tree | 1a73dd5aa14c9307efac16e7e25d8ea3689d5c98 /sys | |
parent | e77276ee754f72b5918af6df35b6e6be279908b2 (diff) | |
download | FreeBSD-src-0a289d546bde4f4a1b513aa568714d69732d3dc1.zip FreeBSD-src-0a289d546bde4f4a1b513aa568714d69732d3dc1.tar.gz |
- Protect mnt_data and mnt_flags under the mount interlock
- Move mp->mnt_stat manipulation where all of them happens
Reported by: davide
Discussed with: kib
Tested by: flo
MFC after: 2 months
X-MFC: 241519, 242536,242616, 242727
Diffstat (limited to 'sys')
-rw-r--r-- | sys/fs/fuse/fuse_vfsops.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/sys/fs/fuse/fuse_vfsops.c b/sys/fs/fuse/fuse_vfsops.c index 7c4578b..639550a 100644 --- a/sys/fs/fuse/fuse_vfsops.c +++ b/sys/fs/fuse/fuse_vfsops.c @@ -234,8 +234,10 @@ fuse_vfsop_mount(struct mount *mp) if (mp->mnt_flag & MNT_UPDATE) return EOPNOTSUPP; + MNT_ILOCK(mp); mp->mnt_flag |= MNT_SYNCHRONOUS; mp->mnt_data = NULL; + MNT_IUNLOCK(mp); /* Get the new options passed to mount */ opts = mp->mnt_optnew; @@ -323,22 +325,20 @@ fuse_vfsop_mount(struct mount *mp) FUSE_UNLOCK(); goto out; } - /* We need this here as this slot is used by getnewvnode() */ - mp->mnt_stat.f_iosize = PAGE_SIZE; - mp->mnt_data = data; data->ref++; data->mp = mp; data->dataflags |= mntopts; data->max_read = max_read; data->daemon_timeout = daemon_timeout; -#ifdef XXXIP - if (!priv_check(td, PRIV_VFS_FUSE_SYNC_UNMOUNT)) - data->dataflags |= FSESS_CAN_SYNC_UNMOUNT; -#endif FUSE_UNLOCK(); vfs_getnewfsid(mp); + MNT_ILOCK(mp); + mp->mnt_data = data; mp->mnt_flag |= MNT_LOCAL; + MNT_IUNLOCK(mp); + /* We need this here as this slot is used by getnewvnode() */ + mp->mnt_stat.f_iosize = PAGE_SIZE; if (subtype) { strlcat(mp->mnt_stat.f_fstypename, ".", MFSNAMELEN); strlcat(mp->mnt_stat.f_fstypename, subtype, MFSNAMELEN); |