aboutsummaryrefslogtreecommitdiffstats
path: root/fs/proc_namespace.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-01-12 20:11:47 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2016-01-12 20:11:47 -0500
commit33caf82acf4dc420bf0f0136b886f7b27ecf90c5 (patch)
treeb24b0b5c8f257ae7db3b8df939821a0856869895 /fs/proc_namespace.c
parentca9706a282943899981e83604f2ed13e88ce4239 (diff)
parentbbddca8e8fac07ece3938e03526b5d00fa791a4c (diff)
Merge branch 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull misc vfs updates from Al Viro: "All kinds of stuff. That probably should've been 5 or 6 separate branches, but by the time I'd realized how large and mixed that bag had become it had been too close to -final to play with rebasing. Some fs/namei.c cleanups there, memdup_user_nul() introduction and switching open-coded instances, burying long-dead code, whack-a-mole of various kinds, several new helpers for ->llseek(), assorted cleanups and fixes from various people, etc. One piece probably deserves special mention - Neil's lookup_one_len_unlocked(). Similar to lookup_one_len(), but gets called without ->i_mutex and tries to avoid ever taking it. That, of course, means that it's not useful for any directory modifications, but things like getting inode attributes in nfds readdirplus are fine with that. I really should've asked for moratorium on lookup-related changes this cycle, but since I hadn't done that early enough... I *am* asking for that for the coming cycle, though - I'm going to try and get conversion of i_mutex to rwsem with ->lookup() done under lock taken shared. There will be a patch closer to the end of the window, along the lines of the one Linus had posted last May - mechanical conversion of ->i_mutex accesses to inode_lock()/inode_unlock()/inode_trylock()/ inode_is_locked()/inode_lock_nested(). To quote Linus back then: ----- | This is an automated patch using | | sed 's/mutex_lock(&\(.*\)->i_mutex)/inode_lock(\1)/' | sed 's/mutex_unlock(&\(.*\)->i_mutex)/inode_unlock(\1)/' | sed 's/mutex_lock_nested(&\(.*\)->i_mutex,[ ]*I_MUTEX_\([A-Z0-9_]*\))/inode_lock_nested(\1, I_MUTEX_\2)/' | sed 's/mutex_is_locked(&\(.*\)->i_mutex)/inode_is_locked(\1)/' | sed 's/mutex_trylock(&\(.*\)->i_mutex)/inode_trylock(\1)/' | | with a very few manual fixups ----- I'm going to send that once the ->i_mutex-affecting stuff in -next gets mostly merged (or when Linus says he's about to stop taking merges)" * 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (63 commits) nfsd: don't hold i_mutex over userspace upcalls fs:affs:Replace time_t with time64_t fs/9p: use fscache mutex rather than spinlock proc: add a reschedule point in proc_readfd_common() logfs: constify logfs_block_ops structures fcntl: allow to set O_DIRECT flag on pipe fs: __generic_file_splice_read retry lookup on AOP_TRUNCATED_PAGE fs: xattr: Use kvfree() [s390] page_to_phys() always returns a multiple of PAGE_SIZE nbd: use ->compat_ioctl() fs: use block_device name vsprintf helper lib/vsprintf: add %*pg format specifier fs: use gendisk->disk_name where possible poll: plug an unused argument to do_poll amdkfd: don't open-code memdup_user() cdrom: don't open-code memdup_user() rsxx: don't open-code memdup_user() mtip32xx: don't open-code memdup_user() [um] mconsole: don't open-code memdup_user_nul() [um] hostaudio: don't open-code memdup_user() ...
Diffstat (limited to 'fs/proc_namespace.c')
-rw-r--r--fs/proc_namespace.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/fs/proc_namespace.c b/fs/proc_namespace.c
index 8ebd9a334085..2256e7e23e67 100644
--- a/fs/proc_namespace.c
+++ b/fs/proc_namespace.c
@@ -95,9 +95,9 @@ static int show_vfsmnt(struct seq_file *m, struct vfsmount *mnt)
95{ 95{
96 struct proc_mounts *p = m->private; 96 struct proc_mounts *p = m->private;
97 struct mount *r = real_mount(mnt); 97 struct mount *r = real_mount(mnt);
98 int err = 0;
99 struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt }; 98 struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt };
100 struct super_block *sb = mnt_path.dentry->d_sb; 99 struct super_block *sb = mnt_path.dentry->d_sb;
100 int err;
101 101
102 if (sb->s_op->show_devname) { 102 if (sb->s_op->show_devname) {
103 err = sb->s_op->show_devname(m, mnt_path.dentry); 103 err = sb->s_op->show_devname(m, mnt_path.dentry);
@@ -131,16 +131,17 @@ static int show_mountinfo(struct seq_file *m, struct vfsmount *mnt)
131 struct mount *r = real_mount(mnt); 131 struct mount *r = real_mount(mnt);
132 struct super_block *sb = mnt->mnt_sb; 132 struct super_block *sb = mnt->mnt_sb;
133 struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt }; 133 struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt };
134 int err = 0; 134 int err;
135 135
136 seq_printf(m, "%i %i %u:%u ", r->mnt_id, r->mnt_parent->mnt_id, 136 seq_printf(m, "%i %i %u:%u ", r->mnt_id, r->mnt_parent->mnt_id,
137 MAJOR(sb->s_dev), MINOR(sb->s_dev)); 137 MAJOR(sb->s_dev), MINOR(sb->s_dev));
138 if (sb->s_op->show_path) 138 if (sb->s_op->show_path) {
139 err = sb->s_op->show_path(m, mnt->mnt_root); 139 err = sb->s_op->show_path(m, mnt->mnt_root);
140 else 140 if (err)
141 goto out;
142 } else {
141 seq_dentry(m, mnt->mnt_root, " \t\n\\"); 143 seq_dentry(m, mnt->mnt_root, " \t\n\\");
142 if (err) 144 }
143 goto out;
144 seq_putc(m, ' '); 145 seq_putc(m, ' ');
145 146
146 /* mountpoints outside of chroot jail will give SEQ_SKIP on this */ 147 /* mountpoints outside of chroot jail will give SEQ_SKIP on this */
@@ -168,12 +169,13 @@ static int show_mountinfo(struct seq_file *m, struct vfsmount *mnt)
168 seq_puts(m, " - "); 169 seq_puts(m, " - ");
169 show_type(m, sb); 170 show_type(m, sb);
170 seq_putc(m, ' '); 171 seq_putc(m, ' ');
171 if (sb->s_op->show_devname) 172 if (sb->s_op->show_devname) {
172 err = sb->s_op->show_devname(m, mnt->mnt_root); 173 err = sb->s_op->show_devname(m, mnt->mnt_root);
173 else 174 if (err)
175 goto out;
176 } else {
174 mangle(m, r->mnt_devname ? r->mnt_devname : "none"); 177 mangle(m, r->mnt_devname ? r->mnt_devname : "none");
175 if (err) 178 }
176 goto out;
177 seq_puts(m, sb->s_flags & MS_RDONLY ? " ro" : " rw"); 179 seq_puts(m, sb->s_flags & MS_RDONLY ? " ro" : " rw");
178 err = show_sb_opts(m, sb); 180 err = show_sb_opts(m, sb);
179 if (err) 181 if (err)
@@ -191,7 +193,7 @@ static int show_vfsstat(struct seq_file *m, struct vfsmount *mnt)
191 struct mount *r = real_mount(mnt); 193 struct mount *r = real_mount(mnt);
192 struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt }; 194 struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt };
193 struct super_block *sb = mnt_path.dentry->d_sb; 195 struct super_block *sb = mnt_path.dentry->d_sb;
194 int err = 0; 196 int err;
195 197
196 /* device */ 198 /* device */
197 if (sb->s_op->show_devname) { 199 if (sb->s_op->show_devname) {
@@ -220,8 +222,7 @@ static int show_vfsstat(struct seq_file *m, struct vfsmount *mnt)
220 /* optional statistics */ 222 /* optional statistics */
221 if (sb->s_op->show_stats) { 223 if (sb->s_op->show_stats) {
222 seq_putc(m, ' '); 224 seq_putc(m, ' ');
223 if (!err) 225 err = sb->s_op->show_stats(m, mnt_path.dentry);
224 err = sb->s_op->show_stats(m, mnt_path.dentry);
225 } 226 }
226 227
227 seq_putc(m, '\n'); 228 seq_putc(m, '\n');