VFS: Kill off s_options and helpers
Kill off s_options, save/replace_mount_options() and generic_show_options() as all filesystems now implement ->show_options() for themselves. This should make it easier to implement a context-based mount where the mount options can be passed individually over a file descriptor. Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Родитель
4dfdb71307
Коммит
1d278a8790
|
@ -1187,12 +1187,6 @@ The underlying reason for the above rules is to make sure, that a
|
|||
mount can be accurately replicated (e.g. umounting and mounting again)
|
||||
based on the information found in /proc/mounts.
|
||||
|
||||
A simple method of saving options at mount/remount time and showing
|
||||
them is provided with the save_mount_options() and
|
||||
generic_show_options() helper functions. Please note, that using
|
||||
these may have drawbacks. For more info see header comments for these
|
||||
functions in fs/namespace.c.
|
||||
|
||||
Resources
|
||||
=========
|
||||
|
||||
|
|
|
@ -29,7 +29,6 @@ static const struct super_operations efivarfs_ops = {
|
|||
.statfs = simple_statfs,
|
||||
.drop_inode = generic_delete_inode,
|
||||
.evict_inode = efivarfs_evict_inode,
|
||||
.show_options = generic_show_options,
|
||||
};
|
||||
|
||||
static struct super_block *efivarfs_sb;
|
||||
|
|
|
@ -1237,65 +1237,6 @@ struct vfsmount *mnt_clone_internal(const struct path *path)
|
|||
return &p->mnt;
|
||||
}
|
||||
|
||||
static inline void mangle(struct seq_file *m, const char *s)
|
||||
{
|
||||
seq_escape(m, s, " \t\n\\");
|
||||
}
|
||||
|
||||
/*
|
||||
* Simple .show_options callback for filesystems which don't want to
|
||||
* implement more complex mount option showing.
|
||||
*
|
||||
* See also save_mount_options().
|
||||
*/
|
||||
int generic_show_options(struct seq_file *m, struct dentry *root)
|
||||
{
|
||||
const char *options;
|
||||
|
||||
rcu_read_lock();
|
||||
options = rcu_dereference(root->d_sb->s_options);
|
||||
|
||||
if (options != NULL && options[0]) {
|
||||
seq_putc(m, ',');
|
||||
mangle(m, options);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(generic_show_options);
|
||||
|
||||
/*
|
||||
* If filesystem uses generic_show_options(), this function should be
|
||||
* called from the fill_super() callback.
|
||||
*
|
||||
* The .remount_fs callback usually needs to be handled in a special
|
||||
* way, to make sure, that previous options are not overwritten if the
|
||||
* remount fails.
|
||||
*
|
||||
* Also note, that if the filesystem's .remount_fs function doesn't
|
||||
* reset all options to their default value, but changes only newly
|
||||
* given options, then the displayed options will not reflect reality
|
||||
* any more.
|
||||
*/
|
||||
void save_mount_options(struct super_block *sb, char *options)
|
||||
{
|
||||
BUG_ON(sb->s_options);
|
||||
rcu_assign_pointer(sb->s_options, kstrdup(options, GFP_KERNEL));
|
||||
}
|
||||
EXPORT_SYMBOL(save_mount_options);
|
||||
|
||||
void replace_mount_options(struct super_block *sb, char *options)
|
||||
{
|
||||
char *old = sb->s_options;
|
||||
rcu_assign_pointer(sb->s_options, options);
|
||||
if (old) {
|
||||
synchronize_rcu();
|
||||
kfree(old);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(replace_mount_options);
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
/* iterator; we want it to have access to namespace_sem, thus here... */
|
||||
static void *m_start(struct seq_file *m, loff_t *pos)
|
||||
|
|
|
@ -168,7 +168,6 @@ static void destroy_super(struct super_block *s)
|
|||
WARN_ON(!list_empty(&s->s_mounts));
|
||||
put_user_ns(s->s_user_ns);
|
||||
kfree(s->s_subtype);
|
||||
kfree(s->s_options);
|
||||
call_rcu(&s->rcu, destroy_super_rcu);
|
||||
}
|
||||
|
||||
|
|
|
@ -1351,11 +1351,6 @@ struct super_block {
|
|||
*/
|
||||
char *s_subtype;
|
||||
|
||||
/*
|
||||
* Saved mount options for lazy filesystems using
|
||||
* generic_show_options()
|
||||
*/
|
||||
char __rcu *s_options;
|
||||
const struct dentry_operations *s_d_op; /* default d_op for dentries */
|
||||
|
||||
/*
|
||||
|
@ -3033,10 +3028,6 @@ extern void setattr_copy(struct inode *inode, const struct iattr *attr);
|
|||
|
||||
extern int file_update_time(struct file *file);
|
||||
|
||||
extern int generic_show_options(struct seq_file *m, struct dentry *root);
|
||||
extern void save_mount_options(struct super_block *sb, char *options);
|
||||
extern void replace_mount_options(struct super_block *sb, char *options);
|
||||
|
||||
static inline bool io_is_direct(struct file *filp)
|
||||
{
|
||||
return (filp->f_flags & O_DIRECT) || IS_DAX(filp->f_mapping->host);
|
||||
|
|
Загрузка…
Ссылка в новой задаче