+++ /dev/null
-From ac60e745d0187b11d9e7f9fcb37e64cc7c02ded0 Mon Sep 17 00:00:00 2001
-From: Jan Kara <jack@suse.cz>
-Date: Wed, 17 Jun 2009 19:09:19 +0200
-Subject: [PATCH 3/6] ocfs2: Initialize blocks allocated to local quota file
-
-When we extend local quota file, we should initialize data
-in newly allocated block. Firstly because on recovery we could
-parse bogus data, secondly so that block checksums are properly
-computed.
-
-Signed-off-by: Jan Kara <jack@suse.cz>
----
- fs/ocfs2/quota_local.c | 98 ++++++++++++++++++++++++++++++++++++++++-------
- 1 files changed, 83 insertions(+), 15 deletions(-)
-
-Index: linux-2.6.27-SLE11_BRANCH/fs/ocfs2/quota_local.c
-===================================================================
---- linux-2.6.27-SLE11_BRANCH.orig/fs/ocfs2/quota_local.c 2009-07-16 13:26:06.000000000 +0200
-+++ linux-2.6.27-SLE11_BRANCH/fs/ocfs2/quota_local.c 2009-07-16 14:00:23.000000000 +0200
-@@ -930,7 +930,7 @@
- struct ocfs2_local_disk_chunk *dchunk;
- int status;
- handle_t *handle;
-- struct buffer_head *bh = NULL;
-+ struct buffer_head *bh = NULL, *dbh = NULL;
- u64 p_blkno;
-
- /* We are protected by dqio_sem so no locking needed */
-@@ -973,7 +973,7 @@
-
- dchunk = (struct ocfs2_local_disk_chunk *)bh->b_data;
-
-- handle = ocfs2_start_trans(OCFS2_SB(sb), 2);
-+ handle = ocfs2_start_trans(OCFS2_SB(sb), 3);
- if (IS_ERR(handle)) {
- status = PTR_ERR(handle);
- mlog_errno(status);
-@@ -998,6 +998,38 @@
- goto out_trans;
- }
-
-+ /* Initialize new block with structures */
-+ down_read(&OCFS2_I(lqinode)->ip_alloc_sem);
-+ status = ocfs2_extent_map_get_blocks(lqinode, oinfo->dqi_blocks + 1,
-+ &p_blkno, NULL, NULL);
-+ up_read(&OCFS2_I(lqinode)->ip_alloc_sem);
-+ if (status < 0) {
-+ mlog_errno(status);
-+ goto out_trans;
-+ }
-+ dbh = sb_getblk(sb, p_blkno);
-+ if (!dbh) {
-+ status = -ENOMEM;
-+ mlog_errno(status);
-+ goto out_trans;
-+ }
-+ ocfs2_set_new_buffer_uptodate(lqinode, dbh);
-+ status = ocfs2_journal_access(handle, lqinode, dbh,
-+ OCFS2_JOURNAL_ACCESS_CREATE);
-+ if (status < 0) {
-+ mlog_errno(status);
-+ goto out_trans;
-+ }
-+ lock_buffer(dbh);
-+ memset(dbh->b_data, 0, sb->s_blocksize - OCFS2_QBLK_RESERVED_SPACE);
-+ unlock_buffer(dbh);
-+ status = ocfs2_journal_dirty(handle, dbh);
-+ if (status < 0) {
-+ mlog_errno(status);
-+ goto out_trans;
-+ }
-+
-+ /* Update local quotafile info */
- oinfo->dqi_blocks += 2;
- oinfo->dqi_chunks++;
- status = ocfs2_local_write_info(sb, type);
-@@ -1022,6 +1054,7 @@
- ocfs2_commit_trans(OCFS2_SB(sb), handle);
- out:
- brelse(bh);
-+ brelse(dbh);
- kmem_cache_free(ocfs2_qf_chunk_cachep, chunk);
- return ERR_PTR(status);
- }
-@@ -1039,6 +1072,8 @@
- struct ocfs2_local_disk_chunk *dchunk;
- int epb = ol_quota_entries_per_block(sb);
- unsigned int chunk_blocks;
-+ struct buffer_head *bh;
-+ u64 p_blkno;
- int status;
- handle_t *handle;
-
-@@ -1066,12 +1101,46 @@
- mlog_errno(status);
- goto out;
- }
-- handle = ocfs2_start_trans(OCFS2_SB(sb), 2);
-+
-+ /* Get buffer from the just added block */
-+ down_read(&OCFS2_I(lqinode)->ip_alloc_sem);
-+ status = ocfs2_extent_map_get_blocks(lqinode, oinfo->dqi_blocks,
-+ &p_blkno, NULL, NULL);
-+ up_read(&OCFS2_I(lqinode)->ip_alloc_sem);
-+ if (status < 0) {
-+ mlog_errno(status);
-+ goto out;
-+ }
-+ bh = sb_getblk(sb, p_blkno);
-+ if (!bh) {
-+ status = -ENOMEM;
-+ mlog_errno(status);
-+ goto out;
-+ }
-+ ocfs2_set_new_buffer_uptodate(lqinode, bh);
-+
-+ handle = ocfs2_start_trans(OCFS2_SB(sb), 3);
- if (IS_ERR(handle)) {
- status = PTR_ERR(handle);
- mlog_errno(status);
- goto out;
- }
-+ /* Zero created block */
-+ status = ocfs2_journal_access(handle, lqinode, bh,
-+ OCFS2_JOURNAL_ACCESS_CREATE);
-+ if (status < 0) {
-+ mlog_errno(status);
-+ goto out_trans;
-+ }
-+ lock_buffer(bh);
-+ memset(bh->b_data, 0, sb->s_blocksize);
-+ unlock_buffer(bh);
-+ status = ocfs2_journal_dirty(handle, bh);
-+ if (status < 0) {
-+ mlog_errno(status);
-+ goto out_trans;
-+ }
-+ /* Update chunk header */
- status = ocfs2_journal_access(handle, lqinode, chunk->qc_headerbh,
- OCFS2_JOURNAL_ACCESS_WRITE);
- if (status < 0) {
-@@ -1088,6 +1157,7 @@
- mlog_errno(status);
- goto out_trans;
- }
-+ /* Update file header */
- oinfo->dqi_blocks++;
- status = ocfs2_local_write_info(sb, type);
- if (status < 0) {