aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>2008-01-28 23:58:26 -0500
committerTheodore Ts'o <tytso@mit.edu>2008-01-28 23:58:26 -0500
commit0e855ac8b103ef579052936b59fe7c599ac422a4 (patch)
treeec29f82e1d7bb1987dcadc00497daf69d6955483 /include
parentc278bfecebfb1ed67c326ef472660878baa745cd (diff)
ext4: Convert truncate_mutex to read write semaphore.
We are currently taking the truncate_mutex for every read. This would have performance impact on large CPU configuration. Convert the lock to read write semaphore and take read lock when we are trying to read the file. Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Diffstat (limited to 'include')
-rw-r--r--include/linux/ext4_fs.h25
-rw-r--r--include/linux/ext4_fs_i.h6
2 files changed, 7 insertions, 24 deletions
diff --git a/include/linux/ext4_fs.h b/include/linux/ext4_fs.h
index 583049c1d366..300cc5a5adb9 100644
--- a/include/linux/ext4_fs.h
+++ b/include/linux/ext4_fs.h
@@ -1107,27 +1107,10 @@ extern void ext4_ext_init(struct super_block *);
1107extern void ext4_ext_release(struct super_block *); 1107extern void ext4_ext_release(struct super_block *);
1108extern long ext4_fallocate(struct inode *inode, int mode, loff_t offset, 1108extern long ext4_fallocate(struct inode *inode, int mode, loff_t offset,
1109 loff_t len); 1109 loff_t len);
1110static inline int 1110extern int ext4_get_blocks_wrap(handle_t *handle, struct inode *inode,
1111ext4_get_blocks_wrap(handle_t *handle, struct inode *inode, sector_t block, 1111 sector_t block, unsigned long max_blocks,
1112 unsigned long max_blocks, struct buffer_head *bh, 1112 struct buffer_head *bh, int create,
1113 int create, int extend_disksize) 1113 int extend_disksize);
1114{
1115 int retval;
1116 mutex_lock(&EXT4_I(inode)->truncate_mutex);
1117 if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) {
1118 retval = ext4_ext_get_blocks(handle, inode,
1119 (ext4_lblk_t)block, max_blocks,
1120 bh, create, extend_disksize);
1121 } else {
1122 retval = ext4_get_blocks_handle(handle, inode,
1123 (ext4_lblk_t)block, max_blocks,
1124 bh, create, extend_disksize);
1125 }
1126 mutex_unlock(&EXT4_I(inode)->truncate_mutex);
1127 return retval;
1128}
1129
1130
1131#endif /* __KERNEL__ */ 1114#endif /* __KERNEL__ */
1132 1115
1133#endif /* _LINUX_EXT4_FS_H */ 1116#endif /* _LINUX_EXT4_FS_H */
diff --git a/include/linux/ext4_fs_i.h b/include/linux/ext4_fs_i.h
index f1cd4934e46f..4377d249d378 100644
--- a/include/linux/ext4_fs_i.h
+++ b/include/linux/ext4_fs_i.h
@@ -139,16 +139,16 @@ struct ext4_inode_info {
139 __u16 i_extra_isize; 139 __u16 i_extra_isize;
140 140
141 /* 141 /*
142 * truncate_mutex is for serialising ext4_truncate() against 142 * i_data_sem is for serialising ext4_truncate() against
143 * ext4_getblock(). In the 2.4 ext2 design, great chunks of inode's 143 * ext4_getblock(). In the 2.4 ext2 design, great chunks of inode's
144 * data tree are chopped off during truncate. We can't do that in 144 * data tree are chopped off during truncate. We can't do that in
145 * ext4 because whenever we perform intermediate commits during 145 * ext4 because whenever we perform intermediate commits during
146 * truncate, the inode and all the metadata blocks *must* be in a 146 * truncate, the inode and all the metadata blocks *must* be in a
147 * consistent state which allows truncation of the orphans to restart 147 * consistent state which allows truncation of the orphans to restart
148 * during recovery. Hence we must fix the get_block-vs-truncate race 148 * during recovery. Hence we must fix the get_block-vs-truncate race
149 * by other means, so we have truncate_mutex. 149 * by other means, so we have i_data_sem.
150 */ 150 */
151 struct mutex truncate_mutex; 151 struct rw_semaphore i_data_sem;
152 struct inode vfs_inode; 152 struct inode vfs_inode;
153 153
154 unsigned long i_ext_generation; 154 unsigned long i_ext_generation;