From patchwork Tue Nov 2 09:02:24 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pavel Shilovsky X-Patchwork-Id: 296862 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id oA292QV8015411 for ; Tue, 2 Nov 2010 09:02:27 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752437Ab0KBJCZ (ORCPT ); Tue, 2 Nov 2010 05:02:25 -0400 Received: from mail-ww0-f44.google.com ([74.125.82.44]:58959 "EHLO mail-ww0-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752428Ab0KBJCZ (ORCPT ); Tue, 2 Nov 2010 05:02:25 -0400 Received: by mail-ww0-f44.google.com with SMTP id 15so7092120wwe.1 for ; Tue, 02 Nov 2010 02:02:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:date:message-id :subject:from:to:content-type; bh=qAZSmFFbGxfU/s0bn7KYELLt5h1ytoUmto4Lg9P4TMA=; b=jAL+VLDY89Fak5eU/E9HMGtivMCLPL6qeqbLlH75m0R87luNxl72au7rASNuj5CMRh Zyju5DG8JAeHCTrRyRfQKjidhw4fMJyJgbT9r6kX+p6albMftHCrI1V3sU2dcP6Xt/9o go98e6R0xzKAAz7qVxBXCcoE5xq13I8uD6DHg= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=hPLdt6bXtintNdtAF2TWDnxFAWn6/r/WC0sLjjG4km3nNe8EmVCW5uk7MHyisq4zsr DW9RPqIRlXoVsovzsYwl0CftErYbolrLJCuXiJT9R6fe66ACuigEm2g4pGo5MYV5VadH P+zrXG1KGWq4avKnOvuCRjN7Df0o6oQnETBW0= MIME-Version: 1.0 Received: by 10.216.240.75 with SMTP id d53mr190454wer.4.1288688544097; Tue, 02 Nov 2010 02:02:24 -0700 (PDT) Received: by 10.216.70.136 with HTTP; Tue, 2 Nov 2010 02:02:24 -0700 (PDT) Date: Tue, 2 Nov 2010 12:02:24 +0300 Message-ID: Subject: [PATCH 4/5] CIFS: New write logic From: Pavel Shilovsky To: linux-cifs@vger.kernel.org Sender: linux-cifs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-cifs@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Tue, 02 Nov 2010 09:02:27 +0000 (UTC) diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 1b44a92..e1ecd35 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c @@ -602,12 +602,37 @@ static ssize_t cifs_file_aio_read(struct kiocb *iocb, const struct iovec *iov, static ssize_t cifs_file_aio_write(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos) { - struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode; - ssize_t written; + struct inode *inode; + struct cifs_sb_info *cifs_sb; + ssize_t written, cache_written; + loff_t saved_pos; + + inode = iocb->ki_filp->f_path.dentry->d_inode; + + if (CIFS_I(inode)->clientCanCacheAll) + return generic_file_aio_write(iocb, iov, nr_segs, pos); + + cifs_sb = CIFS_SB(iocb->ki_filp->f_path.dentry->d_sb); + + if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO) == 0) { + written = generic_file_aio_write(iocb, iov, nr_segs, pos); + filemap_write_and_wait(inode->i_mapping); + return written; + } + + saved_pos = pos; + written = cifs_user_write(iocb->ki_filp, iov->iov_base, + iov->iov_len, &pos); + + if (written > 0) { + cache_written = generic_file_aio_write(iocb, iov, + nr_segs, saved_pos); + if (cache_written != written) + cERROR(1, "Cache written and server written data " + "lengths are different"); + } else + iocb->ki_pos = pos; - written = generic_file_aio_write(iocb, iov, nr_segs, pos); - if (!CIFS_I(inode)->clientCanCacheAll) - filemap_fdatawrite(inode->i_mapping); return written; } diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 3970e68..4796748 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c @@ -1539,7 +1539,11 @@ static int cifs_write_end(struct file *file, struct address_space *mapping, struct page *page, void *fsdata) { int rc; - struct inode *inode = mapping->host; + struct inode *inode; + struct cifs_sb_info *cifs_sb; + + inode = mapping->host; + cifs_sb = CIFS_SB(inode->i_sb); cFYI(1, "write_end for page %p from pos %lld with %d bytes",