From mboxrd@z Thu Jan 1 00:00:00 1970 From: wcheng@sourceware.org Date: 17 Nov 2006 05:00:57 -0000 Subject: [Cluster-devel] cluster/gfs-kernel/src/gfs ops_file.c Message-ID: <20061117050057.27532.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: cluster Changes by: wcheng at sourceware.org 2006-11-17 05:00:57 Modified files: gfs-kernel/src/gfs: ops_file.c Log message: Bugzilla 214274: GFS has been splitting large writes into smaller atomic transactions. This would generate multiple aio completion calls (one for each transaction) that falsely notify application about data completion. Problem is reported by QA team as data corruption. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/ops_file.c.diff?cvsroot=cluster&r1=1.28&r2=1.29 --- cluster/gfs-kernel/src/gfs/ops_file.c 2006/10/27 16:22:17 1.28 +++ cluster/gfs-kernel/src/gfs/ops_file.c 2006/11/17 05:00:57 1.29 @@ -702,10 +702,13 @@ /* split large writes into smaller atomic transactions */ while (size) { - s = gfs_tune_get(sdp, gt_max_atomic_write); - if (s > size) + if (iocb) s = size; - + else { + s = gfs_tune_get(sdp, gt_max_atomic_write); + if (s > size) + s = size; + } error = do_write_direct_alloc(file, buf, s, offset, iocb); if (error < 0) goto out_gunlock; @@ -974,9 +977,13 @@ /* split large writes into smaller atomic transactions */ while (size) { - s = gfs_tune_get(sdp, gt_max_atomic_write); - if (s > size) + if (iocb) s = size; + else { + s = gfs_tune_get(sdp, gt_max_atomic_write); + if (s > size) + s = size; + } error = do_do_write_buf(file, buf, s, offset, iocb); if (error < 0)