From patchwork Sun Jul 1 14:21:44 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zheng Liu X-Patchwork-Id: 168433 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 0C4482C01C1 for ; Mon, 2 Jul 2012 00:13:43 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932426Ab2GAONm (ORCPT ); Sun, 1 Jul 2012 10:13:42 -0400 Received: from mail-pz0-f46.google.com ([209.85.210.46]:43746 "EHLO mail-pz0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932418Ab2GAONl (ORCPT ); Sun, 1 Jul 2012 10:13:41 -0400 Received: by mail-pz0-f46.google.com with SMTP id y13so6337998dad.19 for ; Sun, 01 Jul 2012 07:13:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; bh=Mo2NiGJ2j4sa+xJSvCSZhH17iIx0Xj0iJdgwZoZgYiI=; b=czD45vZ1XE5SdAU7+Mem3HnVHY4h2yK0ODoe7hS1GSh8xh1SB4nKY331G3lnqDfSnz bT82VVypKUssNqmYtNsqoNaF8OMv02YaYSubI7L1eqpujZlkbUmZ7xaQrr1336H2f5yA eBVw7VCBN3xy29ihzCuSfVYXtHLQ15u6bgvU64ANDCq9LrukSg9nwF/+V3ucd2nn214y tQj+vgDDIx/nvbIV3LxwUa2o0U1gtjgO8cS6jCTtviNjyBE/5lFXt36RTdRX2uE5WsGt tlENg0sj21olRsMF1/4qf+6/Z8IiktXxrxSZkKvC0L9bSF2mnLB4ecg7ny24NNhjP+xN Ijpg== Received: by 10.68.130.67 with SMTP id oc3mr22169765pbb.18.1341152021336; Sun, 01 Jul 2012 07:13:41 -0700 (PDT) Received: from localhost.localdomain ([202.55.20.10]) by mx.google.com with ESMTPS id qa5sm10615757pbb.19.2012.07.01.07.13.38 (version=TLSv1/SSLv3 cipher=OTHER); Sun, 01 Jul 2012 07:13:40 -0700 (PDT) From: Zheng Liu To: linux-ext4@vger.kernel.org Cc: Tao Ma , Eric Sandeen , Robin Dong , Zheng Liu Subject: [PATCH 1/3 v3] ext4: split ext4_file_write into buffered IO and direct IO Date: Sun, 1 Jul 2012 22:21:44 +0800 Message-Id: <1341152506-32649-2-git-send-email-wenqing.lz@taobao.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1341152506-32649-1-git-send-email-wenqing.lz@taobao.com> References: <1341152506-32649-1-git-send-email-wenqing.lz@taobao.com> Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org From: Zheng Liu ext4_file_dio_write is defined in order to split buffered IO and direct IO in ext4. This patch just refactor some stuff in write path. CC: Tao Ma CC: Eric Sandeen CC: Robin Dong Signed-off-by: Zheng Liu --- fs/ext4/file.c | 60 +++++++++++++++++++++++++++++++++++-------------------- 1 files changed, 38 insertions(+), 22 deletions(-) diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 8c7642a..a10dc77 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -90,34 +90,16 @@ ext4_unaligned_aio(struct inode *inode, const struct iovec *iov, } static ssize_t -ext4_file_write(struct kiocb *iocb, const struct iovec *iov, - unsigned long nr_segs, loff_t pos) +ext4_file_dio_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; int unaligned_aio = 0; ssize_t ret; - /* - * If we have encountered a bitmap-format file, the size limit - * is smaller than s_maxbytes, which is for extent-mapped files. - */ - - if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) { - struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); - size_t length = iov_length(iov, nr_segs); - - if ((pos > sbi->s_bitmap_maxbytes || - (pos == sbi->s_bitmap_maxbytes && length > 0))) - return -EFBIG; - - if (pos + length > sbi->s_bitmap_maxbytes) { - nr_segs = iov_shorten((struct iovec *)iov, nr_segs, - sbi->s_bitmap_maxbytes - pos); - } - } else if (unlikely((iocb->ki_filp->f_flags & O_DIRECT) && - !is_sync_kiocb(iocb))) { + if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS) && + !is_sync_kiocb(iocb)) unaligned_aio = ext4_unaligned_aio(inode, iov, nr_segs, pos); - } /* Unaligned direct AIO must be serialized; see comment above */ if (unaligned_aio) { @@ -141,6 +123,40 @@ ext4_file_write(struct kiocb *iocb, const struct iovec *iov, return ret; } +static ssize_t +ext4_file_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 ret; + + /* + * If we have encountered a bitmap-format file, the size limit + * is smaller than s_maxbytes, which is for extent-mapped files. + */ + + if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) { + struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); + size_t length = iov_length(iov, nr_segs); + + if ((pos > sbi->s_bitmap_maxbytes || + (pos == sbi->s_bitmap_maxbytes && length > 0))) + return -EFBIG; + + if (pos + length > sbi->s_bitmap_maxbytes) { + nr_segs = iov_shorten((struct iovec *)iov, nr_segs, + sbi->s_bitmap_maxbytes - pos); + } + } + + if (unlikely(iocb->ki_filp->f_flags & O_DIRECT)) + ret = ext4_file_dio_write(iocb, iov, nr_segs, pos); + else + ret = generic_file_aio_write(iocb, iov, nr_segs, pos); + + return ret; +} + static const struct vm_operations_struct ext4_file_vm_ops = { .fault = filemap_fault, .page_mkwrite = ext4_page_mkwrite,