All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [patch 00/48] 2.6.27.32-stable review
@ 2009-09-08 14:47 Jayson King
  2009-09-09  3:08 ` Greg KH
  0 siblings, 1 reply; 65+ messages in thread
From: Jayson King @ 2009-09-08 14:47 UTC (permalink / raw)
  To: gregkh; +Cc: LKML, sunil.mushran, joel.becker

[-- Attachment #1: Type: text/plain, Size: 1409 bytes --]

Greetings,

Patch 41/48 (ocfs2: Initialize the...) of this series causes a build 
failure:

fs/ocfs2/aops.c: In function ‘ocfs2_write_cluster’:
fs/ocfs2/aops.c:1286: error: ‘should_zero’ undeclared (first use in this 
function)
fs/ocfs2/aops.c:1286: error: (Each undeclared identifier is reported 
only once
fs/ocfs2/aops.c:1286: error: for each function it appears in.)
fs/ocfs2/aops.c: In function ‘ocfs2_write_cluster_by_desc’:
fs/ocfs2/aops.c:1360: warning: passing argument 4 of 
‘ocfs2_write_cluster’ makes pointer from integer without a cast
fs/ocfs2/aops.c:1360: warning: passing argument 6 of 
‘ocfs2_write_cluster’ from incompatible pointer type
fs/ocfs2/aops.c:1360: warning: passing argument 7 of 
‘ocfs2_write_cluster’ makes integer from pointer without a cast
fs/ocfs2/aops.c:1360: error: too many arguments to function 
‘ocfs2_write_cluster’


A line from the upstream patch is missing in this patch:

  static int ocfs2_write_cluster(struct address_space *mapping,
                     u32 phys, unsigned int unwritten,
+                   unsigned int should_zero,
                     struct ocfs2_alloc_context *data_ac,
                     struct ocfs2_alloc_context *meta_ac,
                     struct ocfs2_write_ctxt *wc, u32 cpos,
                     loff_t user_pos, unsigned user_len)


Attached is the corrected patch with the above line placed back in.

Thanks

Jayson R. King

[-- Attachment #2: aops-new.patch --]
[-- Type: text/plain, Size: 5455 bytes --]

From: Sunil Mushran <sunil.mushran@oracle.com>

commit e7432675f8ca868a4af365759a8d4c3779a3d922 upstream.

In a non-sparse extend, we correctly allocate (and zero) the clusters between
the old_i_size and pos, but we don't zero the portions of the cluster we're
writing to outside of pos<->len.

It handles clustersize > pagesize and blocksize < pagesize.

[Cleaned up by Joel Becker.]

Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com>
Signed-off-by: Joel Becker <joel.becker@oracle.com>

---
 fs/ocfs2/aops.c |   66 +++++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 47 insertions(+), 19 deletions(-)

--- a/fs/ocfs2/aops.c
+++ b/fs/ocfs2/aops.c
@@ -908,18 +908,17 @@ struct ocfs2_write_cluster_desc {
 	 */
 	unsigned	c_new;
 	unsigned	c_unwritten;
+	unsigned	c_needs_zero;
 };
 
-static inline int ocfs2_should_zero_cluster(struct ocfs2_write_cluster_desc *d)
-{
-	return d->c_new || d->c_unwritten;
-}
-
 struct ocfs2_write_ctxt {
 	/* Logical cluster position / len of write */
 	u32				w_cpos;
 	u32				w_clen;
 
+	/* First cluster allocated in a nonsparse extend */
+	u32				w_first_new_cpos;
+
 	struct ocfs2_write_cluster_desc	w_desc[OCFS2_MAX_CLUSTERS_PER_PAGE];
 
 	/*
@@ -997,6 +996,7 @@ static int ocfs2_alloc_write_ctxt(struct
 		return -ENOMEM;
 
 	wc->w_cpos = pos >> osb->s_clustersize_bits;
+	wc->w_first_new_cpos = UINT_MAX;
 	cend = (pos + len - 1) >> osb->s_clustersize_bits;
 	wc->w_clen = cend - wc->w_cpos + 1;
 	get_bh(di_bh);
@@ -1234,19 +1234,17 @@ out:
  */
 static int ocfs2_write_cluster(struct address_space *mapping,
 			       u32 phys, unsigned int unwritten,
+			       unsigned int should_zero,
 			       struct ocfs2_alloc_context *data_ac,
 			       struct ocfs2_alloc_context *meta_ac,
 			       struct ocfs2_write_ctxt *wc, u32 cpos,
 			       loff_t user_pos, unsigned user_len)
 {
-	int ret, i, new, should_zero = 0;
+	int ret, i, new;
 	u64 v_blkno, p_blkno;
 	struct inode *inode = mapping->host;
 
 	new = phys == 0 ? 1 : 0;
-	if (new || unwritten)
-		should_zero = 1;
-
 	if (new) {
 		u32 tmp_pos;
 
@@ -1356,7 +1354,9 @@ static int ocfs2_write_cluster_by_desc(s
 			local_len = osb->s_clustersize - cluster_off;
 
 		ret = ocfs2_write_cluster(mapping, desc->c_phys,
-					  desc->c_unwritten, data_ac, meta_ac,
+					  desc->c_unwritten,
+					  desc->c_needs_zero,
+					  data_ac, meta_ac,
 					  wc, desc->c_cpos, pos, local_len);
 		if (ret) {
 			mlog_errno(ret);
@@ -1406,14 +1406,14 @@ static void ocfs2_set_target_boundaries(
 		 * newly allocated cluster.
 		 */
 		desc = &wc->w_desc[0];
-		if (ocfs2_should_zero_cluster(desc))
+		if (desc->c_needs_zero)
 			ocfs2_figure_cluster_boundaries(osb,
 							desc->c_cpos,
 							&wc->w_target_from,
 							NULL);
 
 		desc = &wc->w_desc[wc->w_clen - 1];
-		if (ocfs2_should_zero_cluster(desc))
+		if (desc->c_needs_zero)
 			ocfs2_figure_cluster_boundaries(osb,
 							desc->c_cpos,
 							NULL,
@@ -1481,13 +1481,28 @@ static int ocfs2_populate_write_desc(str
 			phys++;
 		}
 
+		/*
+		 * If w_first_new_cpos is < UINT_MAX, we have a non-sparse
+		 * file that got extended.  w_first_new_cpos tells us
+		 * where the newly allocated clusters are so we can
+		 * zero them.
+		 */
+		if (desc->c_cpos >= wc->w_first_new_cpos) {
+			BUG_ON(phys == 0);
+			desc->c_needs_zero = 1;
+		}
+
 		desc->c_phys = phys;
 		if (phys == 0) {
 			desc->c_new = 1;
+			desc->c_needs_zero = 1;
 			*clusters_to_alloc = *clusters_to_alloc + 1;
 		}
-		if (ext_flags & OCFS2_EXT_UNWRITTEN)
+
+		if (ext_flags & OCFS2_EXT_UNWRITTEN) {
 			desc->c_unwritten = 1;
+			desc->c_needs_zero = 1;
+		}
 
 		num_clusters--;
 	}
@@ -1644,10 +1659,13 @@ static int ocfs2_expand_nonsparse_inode(
 	if (newsize <= i_size_read(inode))
 		return 0;
 
-	ret = ocfs2_extend_no_holes(inode, newsize, newsize - len);
+	ret = ocfs2_extend_no_holes(inode, newsize, pos);
 	if (ret)
 		mlog_errno(ret);
 
+	wc->w_first_new_cpos =
+		ocfs2_clusters_for_bytes(inode->i_sb, i_size_read(inode));
+
 	return ret;
 }
 
@@ -1656,7 +1674,7 @@ int ocfs2_write_begin_nolock(struct addr
 			     struct page **pagep, void **fsdata,
 			     struct buffer_head *di_bh, struct page *mmap_page)
 {
-	int ret, credits = OCFS2_INODE_UPDATE_CREDITS;
+	int ret, cluster_of_pages, credits = OCFS2_INODE_UPDATE_CREDITS;
 	unsigned int clusters_to_alloc, extents_to_split;
 	struct ocfs2_write_ctxt *wc;
 	struct inode *inode = mapping->host;
@@ -1724,8 +1742,19 @@ int ocfs2_write_begin_nolock(struct addr
 
 	}
 
-	ocfs2_set_target_boundaries(osb, wc, pos, len,
-				    clusters_to_alloc + extents_to_split);
+	/*
+	 * We have to zero sparse allocated clusters, unwritten extent clusters,
+	 * and non-sparse clusters we just extended.  For non-sparse writes,
+	 * we know zeros will only be needed in the first and/or last cluster.
+	 */
+	if (clusters_to_alloc || extents_to_split ||
+	    wc->w_desc[0].c_needs_zero ||
+	    wc->w_desc[wc->w_clen - 1].c_needs_zero)
+		cluster_of_pages = 1;
+	else
+		cluster_of_pages = 0;
+
+	ocfs2_set_target_boundaries(osb, wc, pos, len, cluster_of_pages);
 
 	handle = ocfs2_start_trans(osb, credits);
 	if (IS_ERR(handle)) {
@@ -1753,8 +1782,7 @@ int ocfs2_write_begin_nolock(struct addr
 	 * extent.
 	 */
 	ret = ocfs2_grab_pages_for_write(mapping, wc, wc->w_cpos, pos,
-					 clusters_to_alloc + extents_to_split,
-					 mmap_page);
+					 cluster_of_pages, mmap_page);
 	if (ret) {
 		mlog_errno(ret);
 		goto out_commit;

^ permalink raw reply	[flat|nested] 65+ messages in thread
* Re: [patch 00/48] 2.6.27.32-stable review
@ 2009-09-09 14:30 Jayson King
  0 siblings, 0 replies; 65+ messages in thread
From: Jayson King @ 2009-09-09 14:30 UTC (permalink / raw)
  To: gregkh; +Cc: LKML

Greg KH wrote:
 >I thought the second one would solve the problem.
 >
 >What happened here, I took the upstream patch, was it incorrect? If so,
 >was there a patch, also upstream, that fixed this problem?
 >
 >totally confused,

No. The upstream patch was not incorrect, but it was incompletely 
applied to 2.6.27. The missing line is not missing in the upstream 
patch. The replacement for the patch I sent earlier puts the line back in.

Jayson R. King

(sorry if I am dropping anyone from CC. I am not subscribed to LKML)



^ permalink raw reply	[flat|nested] 65+ messages in thread

end of thread, other threads:[~2009-09-10 22:35 UTC | newest]

Thread overview: 65+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <20090904200712.724048145@mini.kroah.org>
2009-09-04 20:11 ` [patch 00/48] 2.6.27.32-stable review Greg KH
2009-09-04 20:07   ` [patch 01/48] ALSA: hda - Fix MacBookPro 3,1/4,1 quirk with ALC889A Greg KH
2009-09-04 20:07   ` [patch 02/48] clone(): fix race between copy_process() and de_thread() Greg KH
2009-09-04 20:07   ` [patch 03/48] ehea: Fix napi list corruption on ifconfig down Greg KH
2009-09-04 20:07   ` [patch 04/48] sound: pcm_lib: fix unsorted list constraint handling Greg KH
2009-09-04 20:07   ` [patch 05/48] SUNRPC: Fix rpc_task_force_reencode Greg KH
2009-09-04 20:07   ` [patch 06/48] KVM: VMX: Change cs reset state to be a data segment Greg KH
2009-09-04 20:07   ` [patch 07/48] KVM: VMX: Change segment dpl at reset to 3 Greg KH
2009-09-04 20:07   ` [patch 08/48] KVM: Load real mode segments correctly Greg KH
2009-09-04 20:07   ` [patch 09/48] KVM: Allocate guest memory as MAP_PRIVATE, not MAP_SHARED Greg KH
2009-09-04 20:07   ` [patch 10/48] KVM: Dont call get_user_pages(.force = 1) Greg KH
2009-09-04 20:07   ` [patch 11/48] KVM: MMU: Add locking around kvm_mmu_slot_remove_write_access() Greg KH
2009-09-04 20:07   ` [patch 12/48] KVM: MMU: Flush tlbs after clearing write permission when accessing dirty log Greg KH
2009-09-04 20:07   ` [patch 13/48] KVM: MMU: Fix setting the accessed bit on non-speculative sptes Greg KH
2009-09-04 20:07   ` [patch 14/48] KVM: Reduce kvm stack usage in kvm_arch_vm_ioctl() Greg KH
2009-09-06  5:47     ` Pavel Machek
2009-09-06 13:43       ` Dave Hansen
2009-09-04 20:07   ` [patch 15/48] KVM: Reduce stack usage in kvm_vcpu_ioctl() Greg KH
2009-09-04 20:07   ` [patch 16/48] KVM: Reduce stack usage in kvm_arch_vcpu_ioctl() Greg KH
2009-09-04 20:07   ` [patch 17/48] KVM: Reduce stack usage in kvm_pv_mmu_op() Greg KH
2009-09-04 20:07   ` [patch 18/48] KVM: add MC5_MISC msr read support Greg KH
2009-09-04 20:07   ` [patch 19/48] KVM: set debug registers after "schedulable" section Greg KH
2009-09-04 20:07   ` [patch 20/48] KVM: MMU: increase per-vcpu rmap cache alloc size Greg KH
2009-09-04 20:07   ` [patch 21/48] KVM: VMX: Set IGMT bit in EPT entry Greg KH
2009-09-04 20:07   ` [patch 22/48] KVM: Dont destroy vcpu in case vcpu_setup fails Greg KH
2009-09-04 20:07   ` [patch 23/48] KVM: VMX: Dont allow uninhibited access to EFER on i386 Greg KH
2009-09-04 20:07   ` [patch 24/48] KVM: SVM: Remove port 80 passthrough Greg KH
2009-09-04 20:07   ` [patch 25/48] KVM: Make EFER reads safe when EFER does not exist Greg KH
2009-09-04 20:07   ` [patch 26/48] KVM: VMX: Handle vmx instruction vmexits Greg KH
2009-09-04 20:07   ` [patch 27/48] KVM: Make paravirt tlb flush also reload the PAE PDPTRs Greg KH
2009-09-04 20:07   ` [patch 28/48] KVM: Fix PDPTR reloading on CR4 writes Greg KH
2009-09-04 20:07   ` [patch 29/48] KVM: MMU: do not free active mmu pages in free_mmu_pages() Greg KH
2009-09-04 20:07   ` [patch 30/48] KVM: Fix dirty bit tracking for slots with large pages Greg KH
2009-09-04 20:07   ` [patch 31/48] KVM: x86: check for cr3 validity in mmu_alloc_roots Greg KH
2009-09-04 20:07   ` [patch 32/48] KVM: MMU: protect kvm_mmu_change_mmu_pages with mmu_lock Greg KH
2009-09-04 20:07   ` [patch 33/48] appletalk: fix atalk_getname() leak Greg KH
2009-09-04 20:07   ` [patch 34/48] can: Fix raw_getname() leak Greg KH
2009-09-04 20:07   ` [patch 35/48] do_sigaltstack: avoid copying stack_t as a structure to user space Greg KH
2009-09-04 20:07   ` [patch 36/48] econet: Fix econet_getname() leak Greg KH
2009-09-04 20:07   ` [patch 37/48] irda: Fix irda_getname() leak Greg KH
2009-09-04 20:07   ` [patch 38/48] kthreads: fix kthread_create() vs kthread_stop() race Greg KH
2009-09-04 20:07   ` [patch 39/48] NET: llc, zero sockaddr_llc struct Greg KH
2009-09-04 20:07   ` [patch 40/48] netrom: Fix nr_getname() leak Greg KH
2009-09-04 20:07   ` [patch 41/48] ocfs2: Initialize the cluster were writing to in a non-sparse extend Greg KH
2009-09-04 21:00     ` Joel Becker
2009-09-06  8:32       ` Joel Becker
2009-09-06 18:17         ` Greg KH
2009-09-04 20:07   ` [patch 42/48] rose: Fix rose_getname() leak Greg KH
2009-09-04 20:07   ` [patch 43/48] ALSA: hda - Add missing vmaster initialization for ALC269 Greg KH
2009-09-04 20:07   ` [patch 44/48] parport: quickfix the proc registration bug Greg KH
2009-09-04 20:07   ` [patch 45/48] USB: removal of tty->low_latency hack dating back to the old serial code Greg KH
2009-09-04 20:07   ` [patch 46/48] Remove low_latency flag setting from nozomi and mxser drivers Greg KH
2009-09-04 20:07   ` [patch 47/48] SCSI: sr: report more accurate drive status after closing the tray Greg KH
2009-09-04 20:08   ` [patch 48/48] SUNRPC: Fix tcp reconnection Greg KH
2009-09-06 22:58   ` [patch 00/48] 2.6.27.32-stable review Tilman Schmidt
2009-09-10 22:33     ` Greg KH
2009-09-08 14:47 Jayson King
2009-09-09  3:08 ` Greg KH
2009-09-09  7:31   ` Michael Tokarev
2009-09-09 13:23     ` Greg KH
2009-09-09 18:28       ` Joel Becker
2009-09-09 18:36         ` Greg KH
2009-09-09 19:20           ` Chuck Ebbert
2009-09-09 20:15             ` Greg KH
  -- strict thread matches above, loose matches on Subject: below --
2009-09-09 14:30 Jayson King

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.