summaryrefslogtreecommitdiff
path: root/fs/ocfs2/quota_global.c
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2010-04-27 22:22:30 (GMT)
committerJan Kara <jack@suse.cz>2010-05-21 17:30:46 (GMT)
commitf64dd44eb748438783b10b3f7a4968d2656a3c95 (patch)
tree21d73e0ed7140c8a61331eacd65157cc0983a16d /fs/ocfs2/quota_global.c
parentbc8e5f07392f05c47c8bdeff4f7098db440d065c (diff)
downloadlinux-f64dd44eb748438783b10b3f7a4968d2656a3c95.tar.xz
ocfs2: Do not map blocks from local quota file on each write
There is no need to map offset of local dquot structure to on disk block in each quota write. It is enough to map it just once and store the physical block number in quota structure in memory. Moreover this simplifies locking as we do not have to take ip_alloc_sem from quota write path. Acked-by: Joel Becker <Joel.Becker@oracle.com> Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/ocfs2/quota_global.c')
-rw-r--r--fs/ocfs2/quota_global.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/fs/ocfs2/quota_global.c b/fs/ocfs2/quota_global.c
index 04ae76d..f461f96 100644
--- a/fs/ocfs2/quota_global.c
+++ b/fs/ocfs2/quota_global.c
@@ -25,6 +25,7 @@
#include "dlmglue.h"
#include "uptodate.h"
#include "super.h"
+#include "buffer_head_io.h"
#include "quota.h"
static struct workqueue_struct *ocfs2_quota_wq = NULL;
@@ -137,6 +138,19 @@ int ocfs2_read_quota_block(struct inode *inode, u64 v_block,
return rc;
}
+int ocfs2_read_quota_phys_block(struct inode *inode, u64 p_block,
+ struct buffer_head **bhp)
+{
+ int rc;
+
+ *bhp = NULL;
+ rc = ocfs2_read_blocks(INODE_CACHE(inode), p_block, 1, bhp, 0,
+ ocfs2_validate_quota_block);
+ if (rc)
+ mlog_errno(rc);
+ return rc;
+}
+
static int ocfs2_get_quota_block(struct inode *inode, int block,
struct buffer_head **bh)
{