mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 11:46:19 +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
3 changed files with 43 additions and 39 deletions
|
@ -399,6 +399,44 @@ too_bad:
|
||||||
return 0;
|
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)
|
void __init files_init(unsigned long mempages)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
|
|
|
@ -66,3 +66,8 @@ extern void __init mnt_init(void);
|
||||||
* fs_struct.c
|
* fs_struct.c
|
||||||
*/
|
*/
|
||||||
extern void chroot_fs_refs(struct path *, struct path *);
|
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 @@ out:
|
||||||
return err;
|
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.
|
* do_remount_sb - asks filesystem to change mount options.
|
||||||
* @sb: superblock in question
|
* @sb: superblock in question
|
||||||
|
|
Loading…
Reference in a new issue