diff options
| -rw-r--r-- | fs/file_table.c | 23 | ||||
| -rw-r--r-- | fs/namespace.c | 7 | ||||
| -rw-r--r-- | fs/super.c | 4 | ||||
| -rw-r--r-- | include/linux/fs.h | 2 | 
4 files changed, 7 insertions, 29 deletions
diff --git a/fs/file_table.c b/fs/file_table.c index c322794f7360..20002e39754d 100644 --- a/fs/file_table.c +++ b/fs/file_table.c @@ -474,29 +474,6 @@ void file_sb_list_del(struct file *file)  #endif -int fs_may_remount_ro(struct super_block *sb) -{ -	struct file *file; -	/* Check that no files are currently opened for writing. */ -	lg_global_lock(files_lglock); -	do_file_list_for_each_entry(sb, file) { -		struct inode *inode = file->f_path.dentry->d_inode; - -		/* File with pending delete? */ -		if (inode->i_nlink == 0) -			goto too_bad; - -		/* Writeable file? */ -		if (S_ISREG(inode->i_mode) && (file->f_mode & FMODE_WRITE)) -			goto too_bad; -	} while_file_list_for_each_entry; -	lg_global_unlock(files_lglock); -	return 1; /* Tis' cool bro. */ -too_bad: -	lg_global_unlock(files_lglock); -	return 0; -} -  /**   *	mark_files_ro - mark all files read-only   *	@sb: superblock in question diff --git a/fs/namespace.c b/fs/namespace.c index 98ebc78b21ab..7e6f2c9dc7c4 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -449,6 +449,10 @@ int sb_prepare_remount_readonly(struct super_block *sb)  	struct mount *mnt;  	int err = 0; +	/* Racy optimization.  Recheck the counter under MNT_WRITE_HOLD */ +	if (atomic_long_read(&sb->s_remove_count)) +		return -EBUSY; +  	br_write_lock(vfsmount_lock);  	list_for_each_entry(mnt, &sb->s_mounts, mnt_instance) {  		if (!(mnt->mnt.mnt_flags & MNT_READONLY)) { @@ -460,6 +464,9 @@ int sb_prepare_remount_readonly(struct super_block *sb)  			}  		}  	} +	if (!err && atomic_long_read(&sb->s_remove_count)) +		err = -EBUSY; +  	if (!err) {  		sb->s_readonly_remount = 1;  		smp_wmb(); diff --git a/fs/super.c b/fs/super.c index 6acc02237e3e..de41e1e46f09 100644 --- a/fs/super.c +++ b/fs/super.c @@ -729,10 +729,6 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force)  			retval = sb_prepare_remount_readonly(sb);  			if (retval)  				return retval; - -			retval = -EBUSY; -			if (!fs_may_remount_ro(sb)) -				goto cancel_readonly;  		}  	} diff --git a/include/linux/fs.h b/include/linux/fs.h index 8ac40921f5ac..7aacf31418fe 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2150,8 +2150,6 @@ extern const struct file_operations read_pipefifo_fops;  extern const struct file_operations write_pipefifo_fops;  extern const struct file_operations rdwr_pipefifo_fops; -extern int fs_may_remount_ro(struct super_block *); -  #ifdef CONFIG_BLOCK  /*   * return READ, READA, or WRITE  | 
