forked from mirrors/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
					
				
					 5 changed files with 20 additions and 18 deletions
				
			
		| 
						 | 
				
			
			@ -60,12 +60,12 @@ void sysv_free_block(struct super_block * sb, sysv_zone_t nr)
 | 
			
		|||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	lock_super(sb);
 | 
			
		||||
	mutex_lock(&sbi->s_lock);
 | 
			
		||||
	count = fs16_to_cpu(sbi, *sbi->s_bcache_count);
 | 
			
		||||
 | 
			
		||||
	if (count > sbi->s_flc_size) {
 | 
			
		||||
		printk("sysv_free_block: flc_count > flc_size\n");
 | 
			
		||||
		unlock_super(sb);
 | 
			
		||||
		mutex_unlock(&sbi->s_lock);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	/* 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);
 | 
			
		||||
		if (!bh) {
 | 
			
		||||
			printk("sysv_free_block: getblk() failed\n");
 | 
			
		||||
			unlock_super(sb);
 | 
			
		||||
			mutex_unlock(&sbi->s_lock);
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		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);
 | 
			
		||||
	fs32_add(sbi, sbi->s_free_blocks, 1);
 | 
			
		||||
	dirty_sb(sb);
 | 
			
		||||
	unlock_super(sb);
 | 
			
		||||
	mutex_unlock(&sbi->s_lock);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
	unsigned count;
 | 
			
		||||
 | 
			
		||||
	lock_super(sb);
 | 
			
		||||
	mutex_lock(&sbi->s_lock);
 | 
			
		||||
	count = fs16_to_cpu(sbi, *sbi->s_bcache_count);
 | 
			
		||||
 | 
			
		||||
	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. */
 | 
			
		||||
	fs32_add(sbi, sbi->s_free_blocks, -1);
 | 
			
		||||
	dirty_sb(sb);
 | 
			
		||||
	unlock_super(sb);
 | 
			
		||||
	mutex_unlock(&sbi->s_lock);
 | 
			
		||||
	return nr;
 | 
			
		||||
 | 
			
		||||
Enospc:
 | 
			
		||||
	unlock_super(sb);
 | 
			
		||||
	mutex_unlock(&sbi->s_lock);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -173,7 +173,7 @@ unsigned long sysv_count_free_blocks(struct super_block * sb)
 | 
			
		|||
	if (sbi->s_type == FSTYPE_AFS)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	lock_super(sb);
 | 
			
		||||
	mutex_lock(&sbi->s_lock);
 | 
			
		||||
	sb_count = fs32_to_cpu(sbi, *sbi->s_free_blocks);
 | 
			
		||||
 | 
			
		||||
	if (0)
 | 
			
		||||
| 
						 | 
				
			
			@ -211,7 +211,7 @@ unsigned long sysv_count_free_blocks(struct super_block * sb)
 | 
			
		|||
	if (count != sb_count)
 | 
			
		||||
		goto Ecount;
 | 
			
		||||
done:
 | 
			
		||||
	unlock_super(sb);
 | 
			
		||||
	mutex_unlock(&sbi->s_lock);
 | 
			
		||||
	return count;
 | 
			
		||||
 | 
			
		||||
Einval:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -118,7 +118,7 @@ void sysv_free_inode(struct inode * inode)
 | 
			
		|||
		       "%s\n", inode->i_sb->s_id);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	lock_super(sb);
 | 
			
		||||
	mutex_lock(&sbi->s_lock);
 | 
			
		||||
	count = fs16_to_cpu(sbi, *sbi->s_sb_fic_count);
 | 
			
		||||
	if (count < sbi->s_fic_size) {
 | 
			
		||||
		*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);
 | 
			
		||||
	memset(raw_inode, 0, sizeof(struct sysv_inode));
 | 
			
		||||
	mark_buffer_dirty(bh);
 | 
			
		||||
	unlock_super(sb);
 | 
			
		||||
	mutex_unlock(&sbi->s_lock);
 | 
			
		||||
	brelse(bh);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -147,13 +147,13 @@ struct inode * sysv_new_inode(const struct inode * dir, umode_t mode)
 | 
			
		|||
	if (!inode)
 | 
			
		||||
		return ERR_PTR(-ENOMEM);
 | 
			
		||||
 | 
			
		||||
	lock_super(sb);
 | 
			
		||||
	mutex_lock(&sbi->s_lock);
 | 
			
		||||
	count = fs16_to_cpu(sbi, *sbi->s_sb_fic_count);
 | 
			
		||||
	if (count == 0 || (*sv_sb_fic_inode(sb,count-1) == 0)) {
 | 
			
		||||
		count = refill_free_cache(sb);
 | 
			
		||||
		if (count == 0) {
 | 
			
		||||
			iput(inode);
 | 
			
		||||
			unlock_super(sb);
 | 
			
		||||
			mutex_unlock(&sbi->s_lock);
 | 
			
		||||
			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 */
 | 
			
		||||
	mark_inode_dirty(inode);	/* cleared by sysv_write_inode() */
 | 
			
		||||
	/* That's it. */
 | 
			
		||||
	unlock_super(sb);
 | 
			
		||||
	mutex_unlock(&sbi->s_lock);
 | 
			
		||||
	return inode;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -185,7 +185,7 @@ unsigned long sysv_count_free_inodes(struct super_block * sb)
 | 
			
		|||
	struct sysv_inode * raw_inode;
 | 
			
		||||
	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);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -213,7 +213,7 @@ unsigned long sysv_count_free_inodes(struct super_block * sb)
 | 
			
		|||
	if (count != sb_count)
 | 
			
		||||
		goto Einval;
 | 
			
		||||
out:
 | 
			
		||||
	unlock_super(sb);
 | 
			
		||||
	mutex_unlock(&sbi->s_lock);
 | 
			
		||||
	return count;
 | 
			
		||||
 | 
			
		||||
Einval:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,7 +36,7 @@ static int sysv_sync_fs(struct super_block *sb, int wait)
 | 
			
		|||
	struct sysv_sb_info *sbi = SYSV_SB(sb);
 | 
			
		||||
	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,
 | 
			
		||||
| 
						 | 
				
			
			@ -51,7 +51,7 @@ static int sysv_sync_fs(struct super_block *sb, int wait)
 | 
			
		|||
		mark_buffer_dirty(sbi->s_bh2);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	unlock_super(sb);
 | 
			
		||||
	mutex_unlock(&sbi->s_lock);
 | 
			
		||||
 | 
			
		||||
	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_block_base = 0;
 | 
			
		||||
	mutex_init(&sbi->s_lock);
 | 
			
		||||
	sb->s_fs_info = sbi;
 | 
			
		||||
 | 
			
		||||
	sb_set_blocksize(sb, BLOCK_SIZE);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -58,6 +58,7 @@ struct sysv_sb_info {
 | 
			
		|||
	u32            s_nzones;	/* same as s_sbd->s_fsize */
 | 
			
		||||
	u16	       s_namelen;       /* max length of dir entry */
 | 
			
		||||
	int	       s_forced_ro;
 | 
			
		||||
	struct mutex s_lock;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue