Commit e83a5d51 authored by Dave Kleikamp's avatar Dave Kleikamp

JFS: Protect active_ag with a spinlock

Signed-off-by: default avatarDave Kleikamp <shaggy@austin.ibm.com>
parent 5f32f3d4
...@@ -65,11 +65,13 @@ static int jfs_open(struct inode *inode, struct file *file) ...@@ -65,11 +65,13 @@ static int jfs_open(struct inode *inode, struct file *file)
if (S_ISREG(inode->i_mode) && file->f_mode & FMODE_WRITE && if (S_ISREG(inode->i_mode) && file->f_mode & FMODE_WRITE &&
(inode->i_size == 0)) { (inode->i_size == 0)) {
struct jfs_inode_info *ji = JFS_IP(inode); struct jfs_inode_info *ji = JFS_IP(inode);
spin_lock_irq(&ji->ag_lock);
if (ji->active_ag == -1) { if (ji->active_ag == -1) {
ji->active_ag = ji->agno; ji->active_ag = ji->agno;
atomic_inc( atomic_inc(
&JFS_SBI(inode->i_sb)->bmap->db_active[ji->agno]); &JFS_SBI(inode->i_sb)->bmap->db_active[ji->agno]);
} }
spin_unlock_irq(&ji->ag_lock);
} }
return 0; return 0;
...@@ -78,11 +80,13 @@ static int jfs_release(struct inode *inode, struct file *file) ...@@ -78,11 +80,13 @@ static int jfs_release(struct inode *inode, struct file *file)
{ {
struct jfs_inode_info *ji = JFS_IP(inode); struct jfs_inode_info *ji = JFS_IP(inode);
spin_lock_irq(&ji->ag_lock);
if (ji->active_ag != -1) { if (ji->active_ag != -1) {
struct bmap *bmap = JFS_SBI(inode->i_sb)->bmap; struct bmap *bmap = JFS_SBI(inode->i_sb)->bmap;
atomic_dec(&bmap->db_active[ji->active_ag]); atomic_dec(&bmap->db_active[ji->active_ag]);
ji->active_ag = -1; ji->active_ag = -1;
} }
spin_unlock_irq(&ji->ag_lock);
return 0; return 0;
} }
......
...@@ -553,6 +553,7 @@ extBalloc(struct inode *ip, s64 hint, s64 * nblocks, s64 * blkno) ...@@ -553,6 +553,7 @@ extBalloc(struct inode *ip, s64 hint, s64 * nblocks, s64 * blkno)
if (S_ISREG(ip->i_mode) && (ji->fileset == FILESYSTEM_I)) { if (S_ISREG(ip->i_mode) && (ji->fileset == FILESYSTEM_I)) {
ag = BLKTOAG(daddr, sbi); ag = BLKTOAG(daddr, sbi);
spin_lock_irq(&ji->ag_lock);
if (ji->active_ag == -1) { if (ji->active_ag == -1) {
atomic_inc(&bmp->db_active[ag]); atomic_inc(&bmp->db_active[ag]);
ji->active_ag = ag; ji->active_ag = ag;
...@@ -561,6 +562,7 @@ extBalloc(struct inode *ip, s64 hint, s64 * nblocks, s64 * blkno) ...@@ -561,6 +562,7 @@ extBalloc(struct inode *ip, s64 hint, s64 * nblocks, s64 * blkno)
atomic_inc(&bmp->db_active[ag]); atomic_inc(&bmp->db_active[ag]);
ji->active_ag = ag; ji->active_ag = ag;
} }
spin_unlock_irq(&ji->ag_lock);
} }
return (0); return (0);
......
...@@ -53,6 +53,7 @@ struct jfs_inode_info { ...@@ -53,6 +53,7 @@ struct jfs_inode_info {
lid_t blid; /* lid of pseudo buffer? */ lid_t blid; /* lid of pseudo buffer? */
lid_t atlhead; /* anonymous tlock list head */ lid_t atlhead; /* anonymous tlock list head */
lid_t atltail; /* anonymous tlock list tail */ lid_t atltail; /* anonymous tlock list tail */
spinlock_t ag_lock; /* protects active_ag */
struct list_head anon_inode_list; /* inodes having anonymous txns */ struct list_head anon_inode_list; /* inodes having anonymous txns */
/* /*
* rdwrlock serializes xtree between reads & writes and synchronizes * rdwrlock serializes xtree between reads & writes and synchronizes
......
...@@ -141,10 +141,13 @@ static void jfs_destroy_inode(struct inode *inode) ...@@ -141,10 +141,13 @@ static void jfs_destroy_inode(struct inode *inode)
{ {
struct jfs_inode_info *ji = JFS_IP(inode); struct jfs_inode_info *ji = JFS_IP(inode);
spin_lock_irq(&ji->ag_lock);
if (ji->active_ag != -1) { if (ji->active_ag != -1) {
struct bmap *bmap = JFS_SBI(inode->i_sb)->bmap; struct bmap *bmap = JFS_SBI(inode->i_sb)->bmap;
atomic_dec(&bmap->db_active[ji->active_ag]); atomic_dec(&bmap->db_active[ji->active_ag]);
ji->active_ag = -1;
} }
spin_unlock_irq(&ji->ag_lock);
#ifdef CONFIG_JFS_POSIX_ACL #ifdef CONFIG_JFS_POSIX_ACL
if (ji->i_acl != JFS_ACL_NOT_CACHED) { if (ji->i_acl != JFS_ACL_NOT_CACHED) {
...@@ -559,6 +562,7 @@ static void init_once(void *foo, kmem_cache_t * cachep, unsigned long flags) ...@@ -559,6 +562,7 @@ static void init_once(void *foo, kmem_cache_t * cachep, unsigned long flags)
init_rwsem(&jfs_ip->rdwrlock); init_rwsem(&jfs_ip->rdwrlock);
init_MUTEX(&jfs_ip->commit_sem); init_MUTEX(&jfs_ip->commit_sem);
init_rwsem(&jfs_ip->xattr_sem); init_rwsem(&jfs_ip->xattr_sem);
spin_lock_init(&jfs_ip->ag_lock);
jfs_ip->active_ag = -1; jfs_ip->active_ag = -1;
#ifdef CONFIG_JFS_POSIX_ACL #ifdef CONFIG_JFS_POSIX_ACL
jfs_ip->i_acl = JFS_ACL_NOT_CACHED; jfs_ip->i_acl = JFS_ACL_NOT_CACHED;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment