diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-05-10 13:49:08 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-05-10 13:49:08 -0400 |
| commit | 93b49d45eb97574057ee03dfdd590c209f5132f8 (patch) | |
| tree | d01e5af58331ab6a8c758e445aeb943cf803dfa9 /fs/namespace.c | |
| parent | f9f51cc0ce544224a8332a4c1733624fcbc70a32 (diff) | |
| parent | b0c4f3222c7406f0aee9d52b7d604a1d36108463 (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6: (22 commits)
Fix the race between capifs remount and node creation
Fix races around the access to ->s_options
switch ufs directories to ufs_sync_file()
Switch open_exec() and sys_uselib() to do_open_filp()
Make open_exec() and sys_uselib() use may_open(), instead of duplicating its parts
Reduce path_lookup() abuses
Make checkpatch.pl shut up on fs/inode.c
NULL noise in fs/super.c:kill_bdev_super()
romfs: cleanup romfs_fs.h
ROMFS: romfs_dev_read() error ignored
fs: dcache fix LRU ordering
ocfs2: Use nd_set_link().
Fix deadlock in ipathfs ->get_sb()
Fix a leak in failure exit in 9p ->get_sb()
Convert obvious places to deactivate_locked_super()
New helper: deactivate_locked_super()
reiserfs: remove privroot hiding in lookup
reiserfs: dont associate security.* with xattr files
reiserfs: fixup xattr_root caching
Always lookup priv_root on reiserfs mount and keep it
...
Diffstat (limited to 'fs/namespace.c')
| -rw-r--r-- | fs/namespace.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/fs/namespace.c b/fs/namespace.c index 41196209a906..134d494158d9 100644 --- a/fs/namespace.c +++ b/fs/namespace.c | |||
| @@ -695,12 +695,16 @@ static inline void mangle(struct seq_file *m, const char *s) | |||
| 695 | */ | 695 | */ |
| 696 | int generic_show_options(struct seq_file *m, struct vfsmount *mnt) | 696 | int generic_show_options(struct seq_file *m, struct vfsmount *mnt) |
| 697 | { | 697 | { |
| 698 | const char *options = mnt->mnt_sb->s_options; | 698 | const char *options; |
| 699 | |||
| 700 | rcu_read_lock(); | ||
| 701 | options = rcu_dereference(mnt->mnt_sb->s_options); | ||
| 699 | 702 | ||
| 700 | if (options != NULL && options[0]) { | 703 | if (options != NULL && options[0]) { |
| 701 | seq_putc(m, ','); | 704 | seq_putc(m, ','); |
| 702 | mangle(m, options); | 705 | mangle(m, options); |
| 703 | } | 706 | } |
| 707 | rcu_read_unlock(); | ||
| 704 | 708 | ||
| 705 | return 0; | 709 | return 0; |
| 706 | } | 710 | } |
| @@ -721,11 +725,22 @@ EXPORT_SYMBOL(generic_show_options); | |||
| 721 | */ | 725 | */ |
| 722 | void save_mount_options(struct super_block *sb, char *options) | 726 | void save_mount_options(struct super_block *sb, char *options) |
| 723 | { | 727 | { |
| 724 | kfree(sb->s_options); | 728 | BUG_ON(sb->s_options); |
| 725 | sb->s_options = kstrdup(options, GFP_KERNEL); | 729 | rcu_assign_pointer(sb->s_options, kstrdup(options, GFP_KERNEL)); |
| 726 | } | 730 | } |
| 727 | EXPORT_SYMBOL(save_mount_options); | 731 | EXPORT_SYMBOL(save_mount_options); |
| 728 | 732 | ||
| 733 | void replace_mount_options(struct super_block *sb, char *options) | ||
| 734 | { | ||
| 735 | char *old = sb->s_options; | ||
| 736 | rcu_assign_pointer(sb->s_options, options); | ||
| 737 | if (old) { | ||
| 738 | synchronize_rcu(); | ||
| 739 | kfree(old); | ||
| 740 | } | ||
| 741 | } | ||
| 742 | EXPORT_SYMBOL(replace_mount_options); | ||
| 743 | |||
| 729 | #ifdef CONFIG_PROC_FS | 744 | #ifdef CONFIG_PROC_FS |
| 730 | /* iterator */ | 745 | /* iterator */ |
| 731 | static void *m_start(struct seq_file *m, loff_t *pos) | 746 | static void *m_start(struct seq_file *m, loff_t *pos) |
| @@ -1073,9 +1088,7 @@ static int do_umount(struct vfsmount *mnt, int flags) | |||
| 1073 | */ | 1088 | */ |
| 1074 | 1089 | ||
| 1075 | if (flags & MNT_FORCE && sb->s_op->umount_begin) { | 1090 | if (flags & MNT_FORCE && sb->s_op->umount_begin) { |
| 1076 | lock_kernel(); | ||
| 1077 | sb->s_op->umount_begin(sb); | 1091 | sb->s_op->umount_begin(sb); |
| 1078 | unlock_kernel(); | ||
| 1079 | } | 1092 | } |
| 1080 | 1093 | ||
| 1081 | /* | 1094 | /* |
