forked from Minki/linux
sysv: 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
f6e12dc4fc
commit
c07cb01c45
@ -60,12 +60,12 @@ void sysv_free_block(struct super_block * sb, sysv_zone_t nr)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
lock_super(sb);
|
mutex_lock(&sbi->s_lock);
|
||||||
count = fs16_to_cpu(sbi, *sbi->s_bcache_count);
|
count = fs16_to_cpu(sbi, *sbi->s_bcache_count);
|
||||||
|
|
||||||
if (count > sbi->s_flc_size) {
|
if (count > sbi->s_flc_size) {
|
||||||
printk("sysv_free_block: flc_count > flc_size\n");
|
printk("sysv_free_block: flc_count > flc_size\n");
|
||||||
unlock_super(sb);
|
mutex_unlock(&sbi->s_lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* If the free list head in super-block is full, it is copied
|
/* If the free list head in super-block is full, it is copied
|
||||||
@ -77,7 +77,7 @@ void sysv_free_block(struct super_block * sb, sysv_zone_t nr)
|
|||||||
bh = sb_getblk(sb, block);
|
bh = sb_getblk(sb, block);
|
||||||
if (!bh) {
|
if (!bh) {
|
||||||
printk("sysv_free_block: getblk() failed\n");
|
printk("sysv_free_block: getblk() failed\n");
|
||||||
unlock_super(sb);
|
mutex_unlock(&sbi->s_lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
memset(bh->b_data, 0, sb->s_blocksize);
|
memset(bh->b_data, 0, sb->s_blocksize);
|
||||||
@ -93,7 +93,7 @@ void sysv_free_block(struct super_block * sb, sysv_zone_t nr)
|
|||||||
*sbi->s_bcache_count = cpu_to_fs16(sbi, count);
|
*sbi->s_bcache_count = cpu_to_fs16(sbi, count);
|
||||||
fs32_add(sbi, sbi->s_free_blocks, 1);
|
fs32_add(sbi, sbi->s_free_blocks, 1);
|
||||||
dirty_sb(sb);
|
dirty_sb(sb);
|
||||||
unlock_super(sb);
|
mutex_unlock(&sbi->s_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
sysv_zone_t sysv_new_block(struct super_block * sb)
|
sysv_zone_t sysv_new_block(struct super_block * sb)
|
||||||
@ -104,7 +104,7 @@ sysv_zone_t sysv_new_block(struct super_block * sb)
|
|||||||
struct buffer_head * bh;
|
struct buffer_head * bh;
|
||||||
unsigned count;
|
unsigned count;
|
||||||
|
|
||||||
lock_super(sb);
|
mutex_lock(&sbi->s_lock);
|
||||||
count = fs16_to_cpu(sbi, *sbi->s_bcache_count);
|
count = fs16_to_cpu(sbi, *sbi->s_bcache_count);
|
||||||
|
|
||||||
if (count == 0) /* Applies only to Coherent FS */
|
if (count == 0) /* Applies only to Coherent FS */
|
||||||
@ -147,11 +147,11 @@ sysv_zone_t sysv_new_block(struct super_block * sb)
|
|||||||
/* Now the free list head in the superblock is valid again. */
|
/* Now the free list head in the superblock is valid again. */
|
||||||
fs32_add(sbi, sbi->s_free_blocks, -1);
|
fs32_add(sbi, sbi->s_free_blocks, -1);
|
||||||
dirty_sb(sb);
|
dirty_sb(sb);
|
||||||
unlock_super(sb);
|
mutex_unlock(&sbi->s_lock);
|
||||||
return nr;
|
return nr;
|
||||||
|
|
||||||
Enospc:
|
Enospc:
|
||||||
unlock_super(sb);
|
mutex_unlock(&sbi->s_lock);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -173,7 +173,7 @@ unsigned long sysv_count_free_blocks(struct super_block * sb)
|
|||||||
if (sbi->s_type == FSTYPE_AFS)
|
if (sbi->s_type == FSTYPE_AFS)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
lock_super(sb);
|
mutex_lock(&sbi->s_lock);
|
||||||
sb_count = fs32_to_cpu(sbi, *sbi->s_free_blocks);
|
sb_count = fs32_to_cpu(sbi, *sbi->s_free_blocks);
|
||||||
|
|
||||||
if (0)
|
if (0)
|
||||||
@ -211,7 +211,7 @@ unsigned long sysv_count_free_blocks(struct super_block * sb)
|
|||||||
if (count != sb_count)
|
if (count != sb_count)
|
||||||
goto Ecount;
|
goto Ecount;
|
||||||
done:
|
done:
|
||||||
unlock_super(sb);
|
mutex_unlock(&sbi->s_lock);
|
||||||
return count;
|
return count;
|
||||||
|
|
||||||
Einval:
|
Einval:
|
||||||
|
@ -118,7 +118,7 @@ void sysv_free_inode(struct inode * inode)
|
|||||||
"%s\n", inode->i_sb->s_id);
|
"%s\n", inode->i_sb->s_id);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
lock_super(sb);
|
mutex_lock(&sbi->s_lock);
|
||||||
count = fs16_to_cpu(sbi, *sbi->s_sb_fic_count);
|
count = fs16_to_cpu(sbi, *sbi->s_sb_fic_count);
|
||||||
if (count < sbi->s_fic_size) {
|
if (count < sbi->s_fic_size) {
|
||||||
*sv_sb_fic_inode(sb,count++) = cpu_to_fs16(sbi, ino);
|
*sv_sb_fic_inode(sb,count++) = cpu_to_fs16(sbi, ino);
|
||||||
@ -128,7 +128,7 @@ void sysv_free_inode(struct inode * inode)
|
|||||||
dirty_sb(sb);
|
dirty_sb(sb);
|
||||||
memset(raw_inode, 0, sizeof(struct sysv_inode));
|
memset(raw_inode, 0, sizeof(struct sysv_inode));
|
||||||
mark_buffer_dirty(bh);
|
mark_buffer_dirty(bh);
|
||||||
unlock_super(sb);
|
mutex_unlock(&sbi->s_lock);
|
||||||
brelse(bh);
|
brelse(bh);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,13 +147,13 @@ struct inode * sysv_new_inode(const struct inode * dir, umode_t mode)
|
|||||||
if (!inode)
|
if (!inode)
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
lock_super(sb);
|
mutex_lock(&sbi->s_lock);
|
||||||
count = fs16_to_cpu(sbi, *sbi->s_sb_fic_count);
|
count = fs16_to_cpu(sbi, *sbi->s_sb_fic_count);
|
||||||
if (count == 0 || (*sv_sb_fic_inode(sb,count-1) == 0)) {
|
if (count == 0 || (*sv_sb_fic_inode(sb,count-1) == 0)) {
|
||||||
count = refill_free_cache(sb);
|
count = refill_free_cache(sb);
|
||||||
if (count == 0) {
|
if (count == 0) {
|
||||||
iput(inode);
|
iput(inode);
|
||||||
unlock_super(sb);
|
mutex_unlock(&sbi->s_lock);
|
||||||
return ERR_PTR(-ENOSPC);
|
return ERR_PTR(-ENOSPC);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -174,7 +174,7 @@ struct inode * sysv_new_inode(const struct inode * dir, umode_t mode)
|
|||||||
sysv_write_inode(inode, &wbc); /* ensure inode not allocated again */
|
sysv_write_inode(inode, &wbc); /* ensure inode not allocated again */
|
||||||
mark_inode_dirty(inode); /* cleared by sysv_write_inode() */
|
mark_inode_dirty(inode); /* cleared by sysv_write_inode() */
|
||||||
/* That's it. */
|
/* That's it. */
|
||||||
unlock_super(sb);
|
mutex_unlock(&sbi->s_lock);
|
||||||
return inode;
|
return inode;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -185,7 +185,7 @@ unsigned long sysv_count_free_inodes(struct super_block * sb)
|
|||||||
struct sysv_inode * raw_inode;
|
struct sysv_inode * raw_inode;
|
||||||
int ino, count, sb_count;
|
int ino, count, sb_count;
|
||||||
|
|
||||||
lock_super(sb);
|
mutex_lock(&sbi->s_lock);
|
||||||
|
|
||||||
sb_count = fs16_to_cpu(sbi, *sbi->s_sb_total_free_inodes);
|
sb_count = fs16_to_cpu(sbi, *sbi->s_sb_total_free_inodes);
|
||||||
|
|
||||||
@ -213,7 +213,7 @@ unsigned long sysv_count_free_inodes(struct super_block * sb)
|
|||||||
if (count != sb_count)
|
if (count != sb_count)
|
||||||
goto Einval;
|
goto Einval;
|
||||||
out:
|
out:
|
||||||
unlock_super(sb);
|
mutex_unlock(&sbi->s_lock);
|
||||||
return count;
|
return count;
|
||||||
|
|
||||||
Einval:
|
Einval:
|
||||||
|
@ -36,7 +36,7 @@ static int sysv_sync_fs(struct super_block *sb, int wait)
|
|||||||
struct sysv_sb_info *sbi = SYSV_SB(sb);
|
struct sysv_sb_info *sbi = SYSV_SB(sb);
|
||||||
unsigned long time = get_seconds(), old_time;
|
unsigned long time = get_seconds(), old_time;
|
||||||
|
|
||||||
lock_super(sb);
|
mutex_lock(&sbi->s_lock);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we are going to write out the super block,
|
* If we are going to write out the super block,
|
||||||
@ -51,7 +51,7 @@ static int sysv_sync_fs(struct super_block *sb, int wait)
|
|||||||
mark_buffer_dirty(sbi->s_bh2);
|
mark_buffer_dirty(sbi->s_bh2);
|
||||||
}
|
}
|
||||||
|
|
||||||
unlock_super(sb);
|
mutex_unlock(&sbi->s_lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -368,6 +368,7 @@ static int sysv_fill_super(struct super_block *sb, void *data, int silent)
|
|||||||
|
|
||||||
sbi->s_sb = sb;
|
sbi->s_sb = sb;
|
||||||
sbi->s_block_base = 0;
|
sbi->s_block_base = 0;
|
||||||
|
mutex_init(&sbi->s_lock);
|
||||||
sb->s_fs_info = sbi;
|
sb->s_fs_info = sbi;
|
||||||
|
|
||||||
sb_set_blocksize(sb, BLOCK_SIZE);
|
sb_set_blocksize(sb, BLOCK_SIZE);
|
||||||
|
@ -58,6 +58,7 @@ struct sysv_sb_info {
|
|||||||
u32 s_nzones; /* same as s_sbd->s_fsize */
|
u32 s_nzones; /* same as s_sbd->s_fsize */
|
||||||
u16 s_namelen; /* max length of dir entry */
|
u16 s_namelen; /* max length of dir entry */
|
||||||
int s_forced_ro;
|
int s_forced_ro;
|
||||||
|
struct mutex s_lock;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user