|
@@ -1841,11 +1841,13 @@ ext4_ext_put_in_cache(struct inode *inode, ext4_lblk_t block,
|
|
{
|
|
{
|
|
struct ext4_ext_cache *cex;
|
|
struct ext4_ext_cache *cex;
|
|
BUG_ON(len == 0);
|
|
BUG_ON(len == 0);
|
|
|
|
+ spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
|
|
cex = &EXT4_I(inode)->i_cached_extent;
|
|
cex = &EXT4_I(inode)->i_cached_extent;
|
|
cex->ec_type = type;
|
|
cex->ec_type = type;
|
|
cex->ec_block = block;
|
|
cex->ec_block = block;
|
|
cex->ec_len = len;
|
|
cex->ec_len = len;
|
|
cex->ec_start = start;
|
|
cex->ec_start = start;
|
|
|
|
+ spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -1902,12 +1904,17 @@ ext4_ext_in_cache(struct inode *inode, ext4_lblk_t block,
|
|
struct ext4_extent *ex)
|
|
struct ext4_extent *ex)
|
|
{
|
|
{
|
|
struct ext4_ext_cache *cex;
|
|
struct ext4_ext_cache *cex;
|
|
|
|
+ int ret = EXT4_EXT_CACHE_NO;
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * We borrow i_block_reservation_lock to protect i_cached_extent
|
|
|
|
+ */
|
|
|
|
+ spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
|
|
cex = &EXT4_I(inode)->i_cached_extent;
|
|
cex = &EXT4_I(inode)->i_cached_extent;
|
|
|
|
|
|
/* has cache valid data? */
|
|
/* has cache valid data? */
|
|
if (cex->ec_type == EXT4_EXT_CACHE_NO)
|
|
if (cex->ec_type == EXT4_EXT_CACHE_NO)
|
|
- return EXT4_EXT_CACHE_NO;
|
|
|
|
|
|
+ goto errout;
|
|
|
|
|
|
BUG_ON(cex->ec_type != EXT4_EXT_CACHE_GAP &&
|
|
BUG_ON(cex->ec_type != EXT4_EXT_CACHE_GAP &&
|
|
cex->ec_type != EXT4_EXT_CACHE_EXTENT);
|
|
cex->ec_type != EXT4_EXT_CACHE_EXTENT);
|
|
@@ -1918,11 +1925,11 @@ ext4_ext_in_cache(struct inode *inode, ext4_lblk_t block,
|
|
ext_debug("%u cached by %u:%u:%llu\n",
|
|
ext_debug("%u cached by %u:%u:%llu\n",
|
|
block,
|
|
block,
|
|
cex->ec_block, cex->ec_len, cex->ec_start);
|
|
cex->ec_block, cex->ec_len, cex->ec_start);
|
|
- return cex->ec_type;
|
|
|
|
|
|
+ ret = cex->ec_type;
|
|
}
|
|
}
|
|
-
|
|
|
|
- /* not in cache */
|
|
|
|
- return EXT4_EXT_CACHE_NO;
|
|
|
|
|
|
+errout:
|
|
|
|
+ spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|