[PATCH] ocfs2: Fix a wrong cluster calculation.
authortao.ma@oracle.com <tao.ma@oracle.com>
Thu, 6 Sep 2007 00:02:25 +0000 (08:02 +0800)
committerMark Fasheh <mark.fasheh@oracle.com>
Tue, 11 Sep 2007 18:39:05 +0000 (11:39 -0700)
In ocfs2_alloc_write_write_ctxt, the written clusters length is calculated
by the byte length only. This may cause some problems if we start to write
at some position in the end of one cluster and last to a second cluster
while the "len" is smaller than a cluster size. In that case, we have to
write 2 clusters actually.
So we have to take the start position into consideration also.

Signed-off-by: Tao Ma <tao.ma@oracle.com>
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
fs/ocfs2/aops.c

index 460d440310f2897204dfc196f77e351c384eaa56..50cd8a209012ed0cd216c651483416c71baa0d28 100644 (file)
@@ -855,6 +855,7 @@ static int ocfs2_alloc_write_ctxt(struct ocfs2_write_ctxt **wcp,
                                  struct ocfs2_super *osb, loff_t pos,
                                  unsigned len, struct buffer_head *di_bh)
 {
+       u32 cend;
        struct ocfs2_write_ctxt *wc;
 
        wc = kzalloc(sizeof(struct ocfs2_write_ctxt), GFP_NOFS);
@@ -862,7 +863,8 @@ static int ocfs2_alloc_write_ctxt(struct ocfs2_write_ctxt **wcp,
                return -ENOMEM;
 
        wc->w_cpos = pos >> osb->s_clustersize_bits;
-       wc->w_clen = ocfs2_clusters_for_bytes(osb->sb, len);
+       cend = (pos + len - 1) >> osb->s_clustersize_bits;
+       wc->w_clen = cend - wc->w_cpos + 1;
        get_bh(di_bh);
        wc->w_di_bh = di_bh;