Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756028Ab0GFHUX (ORCPT ); Tue, 6 Jul 2010 03:20:23 -0400 Received: from rcsinet10.oracle.com ([148.87.113.121]:49958 "EHLO rcsinet10.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754151Ab0GFHUW (ORCPT ); Tue, 6 Jul 2010 03:20:22 -0400 Date: Tue, 6 Jul 2010 00:17:41 -0700 From: Joel Becker To: Tao Ma Cc: Dave Chinner , Linus Torvalds , Linux Kernel , ocfs2-devel@oss.oracle.com, Dave Chinner , Christoph Hellwig , Mark Fasheh Subject: Re: [PATCH 1/2] ocfs2: Zero the tail cluster when extending past i_size v2 Message-ID: <20100706071741.GF13023@mail.oracle.com> Mail-Followup-To: Tao Ma , Dave Chinner , Linus Torvalds , Linux Kernel , ocfs2-devel@oss.oracle.com, Dave Chinner , Christoph Hellwig , Mark Fasheh References: <20100628173529.GA10573@mail.oracle.com> <20100629002421.GY6590@dastard> <20100629005403.GC24343@mail.oracle.com> <20100629015615.GZ6590@dastard> <20100629020420.GE24343@mail.oracle.com> <20100629022757.GA6590@dastard> <20100629071817.GA4150@mail.oracle.com> <20100702224912.GC5800@mail.oracle.com> <20100703213219.GB21262@mail.oracle.com> <4C3156D0.5090001@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C3156D0.5090001@oracle.com> X-Burt-Line: Trees are cool. X-Red-Smith: Ninety feet between bases is perhaps as close as man has ever come to perfection. User-Agent: Mutt/1.5.20 (2009-06-14) X-Source-IP: acsmt353.oracle.com [141.146.40.153] X-Auth-Type: Internal IP X-CT-RefId: str=0001.0A090205.4C32D8FB.0167:SCFMA4539814,ss=1,fgs=0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3351 Lines: 97 On Mon, Jul 05, 2010 at 11:51:44AM +0800, Tao Ma wrote: > >+ /* > >+ * If tail_blkno is in the cluster past i_size, we don't need > >+ * to touch the cluster containing i_size at all. > >+ */ > >+ tail_cpos = i_size_read(inode)>> osb->s_clustersize_bits; > >+ if (ocfs2_blocks_to_clusters(inode->i_sb, tail_blkno)> tail_cpos) > >+ tail_cpos = ocfs2_blocks_to_clusters(inode->i_sb, > >+ tail_blkno); > Can we always set tail_cpos in one line? > tail_cpos = ocfs2_blocks_to_clusters(inode->i_sb, tail_blkno)? > tail_cpos is either the same cluster as i_size or the next cluster > and both works for tail_blkno I guess? I had the same thought on Friday, but the current version passes testing and I was wary of changing that. > >+ /* Is there a cluster to zero? */ > >+ if (!p_cpos) > >+ goto out; > For unwritten extent, we also need to clear the pages? If yes, the > solution doesn't complete if we have 2 unwritten extent, one > contains i_size while one passes i_size. Here we only clear the > pages for the 1st unwritten extent and leave the 2nd one untouched. We probably don't need to zero unwritten extents. We cannot have an extent past i_size, can we? > From here to the call of CoW is a bit hard to understand. In 'if', > num_clusters is set for CoW and in 'else', blocks_to_zero is set. So > it isn't easy for the reader to tell why these 2 clauses are setting > different values. So how about my code below? It looks more > straightforward I think. > >+ if ((tail_cpos + num_clusters)> pos_cpos) { > >+ num_clusters = pos_cpos - tail_cpos; > >+ if (pos_blkno> > >+ ocfs2_clusters_to_blocks(inode->i_sb, pos_cpos)) > >+ num_clusters += 1; > >+ } else { > >+ blocks_to_zero = > >+ ocfs2_clusters_to_blocks(inode->i_sb, > >+ tail_cpos + num_clusters); > >+ blocks_to_zero -= tail_blkno; > >+ } > >+ > >+ /* Now CoW the clusters we're about to zero */ > >+ if (ext_flags& OCFS2_EXT_REFCOUNTED) { > >+ rc = ocfs2_refcount_cow(inode, di_bh, tail_cpos, > >+ num_clusters, UINT_MAX); > >+ if (rc) { > >+ mlog_errno(rc); > >+ goto out; > >+ } > >+ } > /* Decrease blocks_to_zero if there is some hole after extent */ > if (tail_cpos + num_clusters <= pos_cpos) { > blocks_to_zero = > ocfs2_clusters_to_blocks(inode->i_sb, > tail_cpos + num_clusters); > blocks_to_zero -= tail_blkno; > } Not a bad split-out here. > /* Now CoW if we have some refcounted clusters. */ > if (ext_flags & OCFS2_EXT_REFCOUNTED) { > /* > * We add one more cluster here since it will be > * written shortly and if the pos_blkno isn't aligned > * to the cluster size, we have to zero the blocks > * before it. > */ > if (tail_cpos + num_clusters > pos_cpos) > num_clusters = pos_cpos - tail_cpos + 1; But you dropped the check for pos_blkno alignment. Unconditionally adding the +1 doesn't seem like a good idea. Joel -- "Where are my angels? Where's my golden one? And where is my hope Now that my heroes are gone?" Joel Becker Consulting Software Developer Oracle E-mail: joel.becker@oracle.com Phone: (650) 506-8127 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/