>From 3b69f7f0b2827d00daf20aa75991e8d184be5ad0 Mon Sep 17 00:00:00 2001 From: Hin-Tak Leung Date: Thu, 11 Oct 2012 01:46:49 +0100 Subject: [PATCH] serialize hfs_bnode_read_kmap Signed-off-by: Hin-Tak Leung --- fs/hfsplus/bnode.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/fs/hfsplus/bnode.c b/fs/hfsplus/bnode.c index 5c125ce..7c19ad9 100644 --- a/fs/hfsplus/bnode.c +++ b/fs/hfsplus/bnode.c @@ -17,6 +17,20 @@ #include "hfsplus_fs.h" #include "hfsplus_raw.h" +static DEFINE_MUTEX(hfs_bnode_read_kmap_mutex_mutex); + +static inline void +hfs_bnode_read_kmap_mutex_lock(void) +{ + mutex_lock(&hfs_bnode_read_kmap_mutex_mutex); +} + +static inline void +hfs_bnode_read_kmap_mutex_unlock(void) +{ + mutex_unlock(&hfs_bnode_read_kmap_mutex_mutex); +} + /* Copy a specified range of bytes from the raw data of a node */ void hfs_bnode_read(struct hfs_bnode *node, void *buf, int off, int len) { @@ -28,14 +42,18 @@ void hfs_bnode_read(struct hfs_bnode *node, void *buf, int off, int len) off &= ~PAGE_CACHE_MASK; l = min(len, (int)PAGE_CACHE_SIZE - off); + hfs_bnode_read_kmap_mutex_lock(); memcpy(buf, kmap(*pagep) + off, l); kunmap(*pagep); + hfs_bnode_read_kmap_mutex_unlock(); while ((len -= l) != 0) { buf += l; l = min(len, (int)PAGE_CACHE_SIZE); + hfs_bnode_read_kmap_mutex_lock(); memcpy(buf, kmap(*++pagep), l); kunmap(*pagep); + hfs_bnode_read_kmap_mutex_unlock(); } } -- 1.7.11.7