diff options
Diffstat (limited to 'fs/ubifs/super.c')
| -rw-r--r-- | fs/ubifs/super.c | 17 | 
1 files changed, 13 insertions, 4 deletions
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index e9f7a754c4f..3589eab02a2 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c @@ -36,6 +36,7 @@  #include <linux/mount.h>  #include <linux/math64.h>  #include <linux/writeback.h> +#include <linux/smp_lock.h>  #include "ubifs.h"  /* @@ -447,9 +448,6 @@ static int ubifs_sync_fs(struct super_block *sb, int wait)  	if (!wait)  		return 0; -	if (sb->s_flags & MS_RDONLY) -		return 0; -  	/*  	 * VFS calls '->sync_fs()' before synchronizing all dirty inodes and  	 * pages, so synchronize them first, then commit the journal. Strictly @@ -1687,6 +1685,9 @@ static void ubifs_put_super(struct super_block *sb)  	ubifs_msg("un-mount UBI device %d, volume %d", c->vi.ubi_num,  		  c->vi.vol_id); + +	lock_kernel(); +  	/*  	 * The following asserts are only valid if there has not been a failure  	 * of the media. For example, there will be dirty inodes if we failed @@ -1753,6 +1754,8 @@ static void ubifs_put_super(struct super_block *sb)  	ubi_close_volume(c->ubi);  	mutex_unlock(&c->umount_mutex);  	kfree(c); + +	unlock_kernel();  }  static int ubifs_remount_fs(struct super_block *sb, int *flags, char *data) @@ -1768,17 +1771,22 @@ static int ubifs_remount_fs(struct super_block *sb, int *flags, char *data)  		return err;  	} +	lock_kernel();  	if ((sb->s_flags & MS_RDONLY) && !(*flags & MS_RDONLY)) {  		if (c->ro_media) {  			ubifs_msg("cannot re-mount due to prior errors"); +			unlock_kernel();  			return -EROFS;  		}  		err = ubifs_remount_rw(c); -		if (err) +		if (err) { +			unlock_kernel();  			return err; +		}  	} else if (!(sb->s_flags & MS_RDONLY) && (*flags & MS_RDONLY)) {  		if (c->ro_media) {  			ubifs_msg("cannot re-mount due to prior errors"); +			unlock_kernel();  			return -EROFS;  		}  		ubifs_remount_ro(c); @@ -1793,6 +1801,7 @@ static int ubifs_remount_fs(struct super_block *sb, int *flags, char *data)  	}  	ubifs_assert(c->lst.taken_empty_lebs > 0); +	unlock_kernel();  	return 0;  }  |