From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sougata Santra Subject: [PATCH] hfsplus: fix concurrent acess of alloc_blocks Date: Mon, 17 Feb 2014 14:20:47 +0200 Message-ID: <1392639647.29849.11.camel@ultrabook> Reply-To: Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit Cc: Christoph Hellwig , , , Vyacheslav Dubeyko , "Joe Perches" , Alexey Khoroshilov To: Andrew Morton Return-path: Sender: linux-kernel-owner@vger.kernel.org List-Id: linux-fsdevel.vger.kernel.org Concurrent access to alloc_blocks in hfsplus_inode_info is protected by extents_lock mutex. This patch fixes two instances where alloc_blocks modification was not protected with this lock. This fixes possible allocation bitmap corruption in race conditions while extending and truncating files. Signed-off-by: Sougata Santra Reviewed-by: Christoph Hellwig --- fs/hfsplus/extents.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/fs/hfsplus/extents.c b/fs/hfsplus/extents.c index fbb212f..314c858 100644 --- a/fs/hfsplus/extents.c +++ b/fs/hfsplus/extents.c @@ -498,11 +498,13 @@ int hfsplus_file_extend(struct inode *inode) goto insert_extent; } out: - mutex_unlock(&hip->extents_lock); if (!res) { hip->alloc_blocks += len; + mutex_unlock(&hip->extents_lock); hfsplus_mark_inode_dirty(inode, HFSPLUS_I_ALLOC_DIRTY); + return 0; } + mutex_unlock(&hip->extents_lock); return res; insert_extent: @@ -592,9 +594,9 @@ void hfsplus_file_truncate(struct inode *inode) hfs_brec_remove(&fd); } hfs_find_exit(&fd); - mutex_unlock(&hip->extents_lock); hip->alloc_blocks = blk_cnt; + mutex_unlock(&hip->extents_lock); out: hip->phys_size = inode->i_size; hip->fs_blocks = (inode->i_size + sb->s_blocksize - 1) >> -- 1.8.1.4