if (ctx->local_store)
                unmap_mapping_range(ctx->local_store, 0, LS_SIZE, 1);
        if (ctx->mfc)
-               unmap_mapping_range(ctx->mfc, 0, 0x4000, 1);
+               unmap_mapping_range(ctx->mfc, 0, 0x1000, 1);
        if (ctx->cntl)
-               unmap_mapping_range(ctx->cntl, 0, 0x4000, 1);
+               unmap_mapping_range(ctx->cntl, 0, 0x1000, 1);
        if (ctx->signal1)
-               unmap_mapping_range(ctx->signal1, 0, 0x4000, 1);
+               unmap_mapping_range(ctx->signal1, 0, PAGE_SIZE, 1);
        if (ctx->signal2)
-               unmap_mapping_range(ctx->signal2, 0, 0x4000, 1);
+               unmap_mapping_range(ctx->signal2, 0, PAGE_SIZE, 1);
+       if (ctx->mss)
+               unmap_mapping_range(ctx->mss, 0, 0x1000, 1);
+       if (ctx->psmap)
+               unmap_mapping_range(ctx->psmap, 0, 0x20000, 1);
 }
 
 int spu_acquire_exclusive(struct spu_context *ctx)
 
        struct spufs_inode_info *i = SPUFS_I(inode);
        struct spu_context *ctx = i->i_ctx;
        file->private_data = ctx;
-       file->f_mapping = inode->i_mapping;
        ctx->local_store = inode->i_mapping;
+       smp_wmb();
        return 0;
 }
 
        struct spu_context *ctx = i->i_ctx;
 
        file->private_data = ctx;
-       file->f_mapping = inode->i_mapping;
        ctx->cntl = inode->i_mapping;
+       smp_wmb();
        return simple_attr_open(inode, file, spufs_cntl_get,
                                        spufs_cntl_set, "0x%08lx");
 }
        struct spufs_inode_info *i = SPUFS_I(inode);
        struct spu_context *ctx = i->i_ctx;
        file->private_data = ctx;
-       file->f_mapping = inode->i_mapping;
        ctx->signal1 = inode->i_mapping;
+       smp_wmb();
        return nonseekable_open(inode, file);
 }
 
        struct spufs_inode_info *i = SPUFS_I(inode);
        struct spu_context *ctx = i->i_ctx;
        file->private_data = ctx;
-       file->f_mapping = inode->i_mapping;
        ctx->signal2 = inode->i_mapping;
+       smp_wmb();
        return nonseekable_open(inode, file);
 }
 
 static int spufs_mss_open(struct inode *inode, struct file *file)
 {
        struct spufs_inode_info *i = SPUFS_I(inode);
+       struct spu_context *ctx = i->i_ctx;
 
        file->private_data = i->i_ctx;
+       ctx->mss = inode->i_mapping;
+       smp_wmb();
        return nonseekable_open(inode, file);
 }
 
 static int spufs_psmap_open(struct inode *inode, struct file *file)
 {
        struct spufs_inode_info *i = SPUFS_I(inode);
+       struct spu_context *ctx = i->i_ctx;
 
        file->private_data = i->i_ctx;
+       ctx->psmap = inode->i_mapping;
+       smp_wmb();
        return nonseekable_open(inode, file);
 }
 
                return -EBUSY;
 
        file->private_data = ctx;
+       ctx->mfc = inode->i_mapping;
+       smp_wmb();
        return nonseekable_open(inode, file);
 }