mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-29 09:16:33 +00:00
fs: move mark_files_ro into file_table.c
This function walks the s_files lock, and operates primarily on the files in a superblock, so it better belongs here (eg. see also fs_may_remount_ro). [AV: ... and it shouldn't be static after that move] Signed-off-by: Nick Piggin <npiggin@suse.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
96029c4e09
commit
864d7c4c06
@ -399,6 +399,44 @@ int fs_may_remount_ro(struct super_block *sb)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* mark_files_ro - mark all files read-only
|
||||
* @sb: superblock in question
|
||||
*
|
||||
* All files are marked read-only. We don't care about pending
|
||||
* delete files so this should be used in 'force' mode only.
|
||||
*/
|
||||
void mark_files_ro(struct super_block *sb)
|
||||
{
|
||||
struct file *f;
|
||||
|
||||
retry:
|
||||
file_list_lock();
|
||||
list_for_each_entry(f, &sb->s_files, f_u.fu_list) {
|
||||
struct vfsmount *mnt;
|
||||
if (!S_ISREG(f->f_path.dentry->d_inode->i_mode))
|
||||
continue;
|
||||
if (!file_count(f))
|
||||
continue;
|
||||
if (!(f->f_mode & FMODE_WRITE))
|
||||
continue;
|
||||
f->f_mode &= ~FMODE_WRITE;
|
||||
if (file_check_writeable(f) != 0)
|
||||
continue;
|
||||
file_release_write(f);
|
||||
mnt = mntget(f->f_path.mnt);
|
||||
file_list_unlock();
|
||||
/*
|
||||
* This can sleep, so we can't hold
|
||||
* the file_list_lock() spinlock.
|
||||
*/
|
||||
mnt_drop_write(mnt);
|
||||
mntput(mnt);
|
||||
goto retry;
|
||||
}
|
||||
file_list_unlock();
|
||||
}
|
||||
|
||||
void __init files_init(unsigned long mempages)
|
||||
{
|
||||
int n;
|
||||
|
@ -66,3 +66,8 @@ extern void __init mnt_init(void);
|
||||
* fs_struct.c
|
||||
*/
|
||||
extern void chroot_fs_refs(struct path *, struct path *);
|
||||
|
||||
/*
|
||||
* file_table.c
|
||||
*/
|
||||
extern void mark_files_ro(struct super_block *);
|
||||
|
39
fs/super.c
39
fs/super.c
@ -615,45 +615,6 @@ SYSCALL_DEFINE2(ustat, unsigned, dev, struct ustat __user *, ubuf)
|
||||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
* mark_files_ro - mark all files read-only
|
||||
* @sb: superblock in question
|
||||
*
|
||||
* All files are marked read-only. We don't care about pending
|
||||
* delete files so this should be used in 'force' mode only.
|
||||
*/
|
||||
|
||||
static void mark_files_ro(struct super_block *sb)
|
||||
{
|
||||
struct file *f;
|
||||
|
||||
retry:
|
||||
file_list_lock();
|
||||
list_for_each_entry(f, &sb->s_files, f_u.fu_list) {
|
||||
struct vfsmount *mnt;
|
||||
if (!S_ISREG(f->f_path.dentry->d_inode->i_mode))
|
||||
continue;
|
||||
if (!file_count(f))
|
||||
continue;
|
||||
if (!(f->f_mode & FMODE_WRITE))
|
||||
continue;
|
||||
f->f_mode &= ~FMODE_WRITE;
|
||||
if (file_check_writeable(f) != 0)
|
||||
continue;
|
||||
file_release_write(f);
|
||||
mnt = mntget(f->f_path.mnt);
|
||||
file_list_unlock();
|
||||
/*
|
||||
* This can sleep, so we can't hold
|
||||
* the file_list_lock() spinlock.
|
||||
*/
|
||||
mnt_drop_write(mnt);
|
||||
mntput(mnt);
|
||||
goto retry;
|
||||
}
|
||||
file_list_unlock();
|
||||
}
|
||||
|
||||
/**
|
||||
* do_remount_sb - asks filesystem to change mount options.
|
||||
* @sb: superblock in question
|
||||
|
Loading…
Reference in New Issue
Block a user