fat: drop lock/unlock super
Removed lock/unlock super. Added a new private s_lock mutex. Signed-off-by: Marco Stornelli <marco.stornelli@gmail.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
67e2c19a3b
commit
e40b34c792
@ -571,7 +571,7 @@ static int __fat_readdir(struct inode *inode, struct file *filp, void *dirent,
|
||||
int short_len = 0, fill_len = 0;
|
||||
int ret = 0;
|
||||
|
||||
lock_super(sb);
|
||||
mutex_lock(&sbi->s_lock);
|
||||
|
||||
cpos = filp->f_pos;
|
||||
/* Fake . and .. for the root directory. */
|
||||
@ -693,7 +693,7 @@ fill_failed:
|
||||
if (unicode)
|
||||
__putname(unicode);
|
||||
out:
|
||||
unlock_super(sb);
|
||||
mutex_unlock(&sbi->s_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -71,6 +71,7 @@ struct msdos_sb_info {
|
||||
unsigned long root_cluster; /* first cluster of the root directory */
|
||||
unsigned long fsinfo_sector; /* sector number of FAT32 fsinfo */
|
||||
struct mutex fat_lock;
|
||||
struct mutex s_lock;
|
||||
unsigned int prev_free; /* previously allocated cluster number */
|
||||
unsigned int free_clusters; /* -1 if undefined */
|
||||
unsigned int free_clus_valid; /* is free_clusters valid? */
|
||||
|
@ -673,9 +673,9 @@ static int fat_write_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
if (inode->i_ino == MSDOS_FSINFO_INO) {
|
||||
struct super_block *sb = inode->i_sb;
|
||||
|
||||
lock_super(sb);
|
||||
mutex_lock(&MSDOS_SB(sb)->s_lock);
|
||||
err = fat_clusters_flush(sb);
|
||||
unlock_super(sb);
|
||||
mutex_unlock(&MSDOS_SB(sb)->s_lock);
|
||||
} else
|
||||
err = __fat_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL);
|
||||
|
||||
@ -1268,6 +1268,7 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat,
|
||||
b = (struct fat_boot_sector *) bh->b_data;
|
||||
}
|
||||
|
||||
mutex_init(&sbi->s_lock);
|
||||
sbi->cluster_size = sb->s_blocksize * sbi->sec_per_clus;
|
||||
sbi->cluster_bits = ffs(sbi->cluster_size) - 1;
|
||||
sbi->fats = b->fats;
|
||||
|
@ -208,7 +208,7 @@ static struct dentry *msdos_lookup(struct inode *dir, struct dentry *dentry,
|
||||
struct inode *inode;
|
||||
int err;
|
||||
|
||||
lock_super(sb);
|
||||
mutex_lock(&MSDOS_SB(sb)->s_lock);
|
||||
err = msdos_find(dir, dentry->d_name.name, dentry->d_name.len, &sinfo);
|
||||
switch (err) {
|
||||
case -ENOENT:
|
||||
@ -221,7 +221,7 @@ static struct dentry *msdos_lookup(struct inode *dir, struct dentry *dentry,
|
||||
default:
|
||||
inode = ERR_PTR(err);
|
||||
}
|
||||
unlock_super(sb);
|
||||
mutex_unlock(&MSDOS_SB(sb)->s_lock);
|
||||
return d_splice_alias(inode, dentry);
|
||||
}
|
||||
|
||||
@ -273,7 +273,7 @@ static int msdos_create(struct inode *dir, struct dentry *dentry, umode_t mode,
|
||||
unsigned char msdos_name[MSDOS_NAME];
|
||||
int err, is_hid;
|
||||
|
||||
lock_super(sb);
|
||||
mutex_lock(&MSDOS_SB(sb)->s_lock);
|
||||
|
||||
err = msdos_format_name(dentry->d_name.name, dentry->d_name.len,
|
||||
msdos_name, &MSDOS_SB(sb)->options);
|
||||
@ -302,7 +302,7 @@ static int msdos_create(struct inode *dir, struct dentry *dentry, umode_t mode,
|
||||
|
||||
d_instantiate(dentry, inode);
|
||||
out:
|
||||
unlock_super(sb);
|
||||
mutex_unlock(&MSDOS_SB(sb)->s_lock);
|
||||
if (!err)
|
||||
err = fat_flush_inodes(sb, dir, inode);
|
||||
return err;
|
||||
@ -316,7 +316,7 @@ static int msdos_rmdir(struct inode *dir, struct dentry *dentry)
|
||||
struct fat_slot_info sinfo;
|
||||
int err;
|
||||
|
||||
lock_super(sb);
|
||||
mutex_lock(&MSDOS_SB(sb)->s_lock);
|
||||
/*
|
||||
* Check whether the directory is not in use, then check
|
||||
* whether it is empty.
|
||||
@ -337,7 +337,7 @@ static int msdos_rmdir(struct inode *dir, struct dentry *dentry)
|
||||
inode->i_ctime = CURRENT_TIME_SEC;
|
||||
fat_detach(inode);
|
||||
out:
|
||||
unlock_super(sb);
|
||||
mutex_unlock(&MSDOS_SB(sb)->s_lock);
|
||||
if (!err)
|
||||
err = fat_flush_inodes(sb, dir, inode);
|
||||
|
||||
@ -354,7 +354,7 @@ static int msdos_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
|
||||
struct timespec ts;
|
||||
int err, is_hid, cluster;
|
||||
|
||||
lock_super(sb);
|
||||
mutex_lock(&MSDOS_SB(sb)->s_lock);
|
||||
|
||||
err = msdos_format_name(dentry->d_name.name, dentry->d_name.len,
|
||||
msdos_name, &MSDOS_SB(sb)->options);
|
||||
@ -392,14 +392,14 @@ static int msdos_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
|
||||
|
||||
d_instantiate(dentry, inode);
|
||||
|
||||
unlock_super(sb);
|
||||
mutex_unlock(&MSDOS_SB(sb)->s_lock);
|
||||
fat_flush_inodes(sb, dir, inode);
|
||||
return 0;
|
||||
|
||||
out_free:
|
||||
fat_free_clusters(dir, cluster);
|
||||
out:
|
||||
unlock_super(sb);
|
||||
mutex_unlock(&MSDOS_SB(sb)->s_lock);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -411,7 +411,7 @@ static int msdos_unlink(struct inode *dir, struct dentry *dentry)
|
||||
struct fat_slot_info sinfo;
|
||||
int err;
|
||||
|
||||
lock_super(sb);
|
||||
mutex_lock(&MSDOS_SB(sb)->s_lock);
|
||||
err = msdos_find(dir, dentry->d_name.name, dentry->d_name.len, &sinfo);
|
||||
if (err)
|
||||
goto out;
|
||||
@ -423,7 +423,7 @@ static int msdos_unlink(struct inode *dir, struct dentry *dentry)
|
||||
inode->i_ctime = CURRENT_TIME_SEC;
|
||||
fat_detach(inode);
|
||||
out:
|
||||
unlock_super(sb);
|
||||
mutex_unlock(&MSDOS_SB(sb)->s_lock);
|
||||
if (!err)
|
||||
err = fat_flush_inodes(sb, dir, inode);
|
||||
|
||||
@ -606,7 +606,7 @@ static int msdos_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||
unsigned char old_msdos_name[MSDOS_NAME], new_msdos_name[MSDOS_NAME];
|
||||
int err, is_hid;
|
||||
|
||||
lock_super(sb);
|
||||
mutex_lock(&MSDOS_SB(sb)->s_lock);
|
||||
|
||||
err = msdos_format_name(old_dentry->d_name.name,
|
||||
old_dentry->d_name.len, old_msdos_name,
|
||||
@ -625,7 +625,7 @@ static int msdos_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||
err = do_msdos_rename(old_dir, old_msdos_name, old_dentry,
|
||||
new_dir, new_msdos_name, new_dentry, is_hid);
|
||||
out:
|
||||
unlock_super(sb);
|
||||
mutex_unlock(&MSDOS_SB(sb)->s_lock);
|
||||
if (!err)
|
||||
err = fat_flush_inodes(sb, old_dir, new_dir);
|
||||
return err;
|
||||
|
@ -721,7 +721,7 @@ static struct dentry *vfat_lookup(struct inode *dir, struct dentry *dentry,
|
||||
struct dentry *alias;
|
||||
int err;
|
||||
|
||||
lock_super(sb);
|
||||
mutex_lock(&MSDOS_SB(sb)->s_lock);
|
||||
|
||||
err = vfat_find(dir, &dentry->d_name, &sinfo);
|
||||
if (err) {
|
||||
@ -752,13 +752,13 @@ static struct dentry *vfat_lookup(struct inode *dir, struct dentry *dentry,
|
||||
if (!S_ISDIR(inode->i_mode))
|
||||
d_move(alias, dentry);
|
||||
iput(inode);
|
||||
unlock_super(sb);
|
||||
mutex_unlock(&MSDOS_SB(sb)->s_lock);
|
||||
return alias;
|
||||
} else
|
||||
dput(alias);
|
||||
|
||||
out:
|
||||
unlock_super(sb);
|
||||
mutex_unlock(&MSDOS_SB(sb)->s_lock);
|
||||
dentry->d_time = dentry->d_parent->d_inode->i_version;
|
||||
dentry = d_splice_alias(inode, dentry);
|
||||
if (dentry)
|
||||
@ -766,7 +766,7 @@ out:
|
||||
return dentry;
|
||||
|
||||
error:
|
||||
unlock_super(sb);
|
||||
mutex_unlock(&MSDOS_SB(sb)->s_lock);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
@ -779,7 +779,7 @@ static int vfat_create(struct inode *dir, struct dentry *dentry, umode_t mode,
|
||||
struct timespec ts;
|
||||
int err;
|
||||
|
||||
lock_super(sb);
|
||||
mutex_lock(&MSDOS_SB(sb)->s_lock);
|
||||
|
||||
ts = CURRENT_TIME_SEC;
|
||||
err = vfat_add_entry(dir, &dentry->d_name, 0, 0, &ts, &sinfo);
|
||||
@ -800,7 +800,7 @@ static int vfat_create(struct inode *dir, struct dentry *dentry, umode_t mode,
|
||||
dentry->d_time = dentry->d_parent->d_inode->i_version;
|
||||
d_instantiate(dentry, inode);
|
||||
out:
|
||||
unlock_super(sb);
|
||||
mutex_unlock(&MSDOS_SB(sb)->s_lock);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -811,7 +811,7 @@ static int vfat_rmdir(struct inode *dir, struct dentry *dentry)
|
||||
struct fat_slot_info sinfo;
|
||||
int err;
|
||||
|
||||
lock_super(sb);
|
||||
mutex_lock(&MSDOS_SB(sb)->s_lock);
|
||||
|
||||
err = fat_dir_empty(inode);
|
||||
if (err)
|
||||
@ -829,7 +829,7 @@ static int vfat_rmdir(struct inode *dir, struct dentry *dentry)
|
||||
inode->i_mtime = inode->i_atime = CURRENT_TIME_SEC;
|
||||
fat_detach(inode);
|
||||
out:
|
||||
unlock_super(sb);
|
||||
mutex_unlock(&MSDOS_SB(sb)->s_lock);
|
||||
|
||||
return err;
|
||||
}
|
||||
@ -841,7 +841,7 @@ static int vfat_unlink(struct inode *dir, struct dentry *dentry)
|
||||
struct fat_slot_info sinfo;
|
||||
int err;
|
||||
|
||||
lock_super(sb);
|
||||
mutex_lock(&MSDOS_SB(sb)->s_lock);
|
||||
|
||||
err = vfat_find(dir, &dentry->d_name, &sinfo);
|
||||
if (err)
|
||||
@ -854,7 +854,7 @@ static int vfat_unlink(struct inode *dir, struct dentry *dentry)
|
||||
inode->i_mtime = inode->i_atime = CURRENT_TIME_SEC;
|
||||
fat_detach(inode);
|
||||
out:
|
||||
unlock_super(sb);
|
||||
mutex_unlock(&MSDOS_SB(sb)->s_lock);
|
||||
|
||||
return err;
|
||||
}
|
||||
@ -867,7 +867,7 @@ static int vfat_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
|
||||
struct timespec ts;
|
||||
int err, cluster;
|
||||
|
||||
lock_super(sb);
|
||||
mutex_lock(&MSDOS_SB(sb)->s_lock);
|
||||
|
||||
ts = CURRENT_TIME_SEC;
|
||||
cluster = fat_alloc_new_dir(dir, &ts);
|
||||
@ -896,13 +896,13 @@ static int vfat_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
|
||||
dentry->d_time = dentry->d_parent->d_inode->i_version;
|
||||
d_instantiate(dentry, inode);
|
||||
|
||||
unlock_super(sb);
|
||||
mutex_unlock(&MSDOS_SB(sb)->s_lock);
|
||||
return 0;
|
||||
|
||||
out_free:
|
||||
fat_free_clusters(dir, cluster);
|
||||
out:
|
||||
unlock_super(sb);
|
||||
mutex_unlock(&MSDOS_SB(sb)->s_lock);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -921,7 +921,7 @@ static int vfat_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||
old_sinfo.bh = sinfo.bh = dotdot_bh = NULL;
|
||||
old_inode = old_dentry->d_inode;
|
||||
new_inode = new_dentry->d_inode;
|
||||
lock_super(sb);
|
||||
mutex_lock(&MSDOS_SB(sb)->s_lock);
|
||||
err = vfat_find(old_dir, &old_dentry->d_name, &old_sinfo);
|
||||
if (err)
|
||||
goto out;
|
||||
@ -996,7 +996,7 @@ out:
|
||||
brelse(sinfo.bh);
|
||||
brelse(dotdot_bh);
|
||||
brelse(old_sinfo.bh);
|
||||
unlock_super(sb);
|
||||
mutex_unlock(&MSDOS_SB(sb)->s_lock);
|
||||
|
||||
return err;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user