From patchwork Sat Feb 16 17:07:32 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Elder X-Patchwork-Id: 2152221 Return-Path: X-Original-To: patchwork-ceph-devel@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork1.kernel.org (Postfix) with ESMTP id 0B20B3FDF1 for ; Sat, 16 Feb 2013 17:07:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753812Ab3BPRHg (ORCPT ); Sat, 16 Feb 2013 12:07:36 -0500 Received: from mail-qc0-f179.google.com ([209.85.216.179]:45230 "EHLO mail-qc0-f179.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753801Ab3BPRHf (ORCPT ); Sat, 16 Feb 2013 12:07:35 -0500 Received: by mail-qc0-f179.google.com with SMTP id b40so1564654qcq.24 for ; Sat, 16 Feb 2013 09:07:34 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:subject :content-type:content-transfer-encoding:x-gm-message-state; bh=Jz1EvWz/Nn9C9tlCTiRthjI2xYUilFvmvYQph0byZsA=; b=mmxGHapknFK0fHXyqXu7yB08kvX7rhhBLruTszpVOoiLoI3lPuTqJLwmUMQE7VrsGe SDQi+9ENGoO2WVaH3QgpPJxl+bymV4SgZA4G2ZJH5u5YQ7ZQM4NuTYLtMtgNYAv/T25N 6a4tfHtV9pDz4/k+yicZ34qVxG5NhP5Ou/OH4hjtmGhhaB27ctZ1lMDoVP2Y9WxwUprO D2EcRqwxxdGI4XB9MxxfMsZaRfCGj8TJFl+PgHV50GltHG3qzInVBSsZtC1D4bMeGx2U Aa9AW4qsYEtk1MQNbCHf5QC2EL43U83FpqpMr9vHNCz480O73hGqmqipng2afW2GyTVD QaTQ== X-Received: by 10.224.58.201 with SMTP id i9mr3379354qah.81.1361034454112; Sat, 16 Feb 2013 09:07:34 -0800 (PST) Received: from [172.22.22.4] (c-71-195-31-37.hsd1.mn.comcast.net. [71.195.31.37]) by mx.google.com with ESMTPS id t2sm21298794qav.1.2013.02.16.09.07.32 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 16 Feb 2013 09:07:33 -0800 (PST) Message-ID: <511FBCD4.5040709@inktank.com> Date: Sat, 16 Feb 2013 11:07:32 -0600 From: Alex Elder User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130106 Thunderbird/17.0.2 MIME-Version: 1.0 To: ceph-devel@vger.kernel.org Subject: [PATCH] ceph: simplify ceph_sync_write() page_align, calculation X-Gm-Message-State: ALoCoQkxkzPK8sbWHuIsQK6LxpVJcbrPe2IuIh/GNDZdmoQq33Q+wVkFrkxz6LrzL0fuCJZZ784b Sender: ceph-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: ceph-devel@vger.kernel.org In ceph_sync_write() there is some magic that computes page_align for an osd request. But a little analysis shows it can be simplified. First, we have: io_align = pos & ~PAGE_MASK; which is used here: page_align = (pos - io_align + buf_align) & ~PAGE_MASK; Note (pos - io_align) simply rounds "pos" down to the nearest multiple of the page size. We also have: buf_align = (unsigned long)data & ~PAGE_MASK; Adding buf_align to that rounded-down "pos" value will stay within the same page; the result will just be offset by the page offset for the "data" pointer. The final mask therefore leaves just the value of "buf_align". The same simplification can be done in striped_read(). One more simplification. Note that the result of calc_pages_for() is invariant of which page the offset starts in--the only thing that matters is the offset within the starting page. We will have put the proper page offset to use into "page_align", so just use that in calculating num_pages. This resolves: http://tracker.ceph.com/issues/4166 Signed-off-by: Alex Elder Reviewed-by: Josh Durgin --- fs/ceph/file.c | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/fs/ceph/file.c b/fs/ceph/file.c index 9c4325e..6123ad4 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c @@ -331,10 +331,7 @@ static int striped_read(struct inode *inode, io_align = off & ~PAGE_MASK; more: - if (o_direct) - page_align = (pos - io_align + buf_align) & ~PAGE_MASK; - else - page_align = pos & ~PAGE_MASK; + page_align = o_direct ? buf_align : io_align; this_len = left; ret = ceph_osdc_readpages(&fsc->client->osdc, ceph_vino(inode), &ci->i_layout, pos, &this_len, @@ -526,15 +523,10 @@ more: io_align = pos & ~PAGE_MASK; buf_align = (unsigned long)data & ~PAGE_MASK; len = left; - if (file->f_flags & O_DIRECT) { - /* write from beginning of first page, regardless of - io alignment */ - page_align = (pos - io_align + buf_align) & ~PAGE_MASK; - num_pages = calc_pages_for((unsigned long)data, len); - } else { - page_align = pos & ~PAGE_MASK; - num_pages = calc_pages_for(pos, len); - } + + /* write from beginning of first page, regardless of io alignment */ + page_align = file->f_flags & O_DIRECT ? buf_align : io_align; + num_pages = calc_pages_for(page_align, len); req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout, ceph_vino(inode), pos, &len, CEPH_OSD_OP_WRITE, flags,