Received: by 10.223.164.202 with SMTP id h10csp2770875wrb; Tue, 28 Nov 2017 00:41:50 -0800 (PST) X-Google-Smtp-Source: AGs4zMY8BaflFnvamV1GlqS8oUJFXf9HB36Hu775O5/GANk/iZ6qENItWkt67S5Ut/Ak6vuoYKlo X-Received: by 10.98.8.67 with SMTP id c64mr40281130pfd.50.1511858510298; Tue, 28 Nov 2017 00:41:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511858510; cv=none; d=google.com; s=arc-20160816; b=Hjk8+X9DxvCL3L3FCZkadWDOPRqdl6DumD894JYzDTXzJ2awS5oFny8Y2cqvTWkDWm zR+m8WGci2k6ZBMbGJEtgsxhP/zt0kP+npk6/QSKogCZuXjNPMwPnSQemm+jNH52H+v3 qrAO4DjOmdTlS/UccIA31CHslVfD6EYjraGbcXfh2MZrGzmIYqEgWSLoxUnEDWLQjKJ9 nUIWFJZ3yS5tUUkZ38TIQeFb2Q7SRDxEocViVfyVGoK15f/NMhsikafd4AsGpPi4F2d6 V4QFy0X1uoVR31GnZ4i59YAx1CVMc5vtvnNE+pJPxwZGk/ytDALY/rZEDUsjqVetaVlJ ggJw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dkim-signature :arc-authentication-results; bh=A/oiIBcDoySqszb1n/LA0Ln8UzwlZ0AnGgjbIFHhRmI=; b=aU0nfnSvJ2oq3s3AG0HAt/HwRkiFD9hGEH5USMNyeiu/N3Zz5AQ98Fkg+g0LyK4CnL UHj7vKozZCG2xIJMSKh+oq8TaX2WkpY9K5m8WRmyQfSb0DrcKVleu7N+UHM2yB/27mg0 NZJxkq97hXMyYs3uTNFr/k9vJMzTdeQeXzAcqdus4n2xyjJsR5DqcrgLAKZNYx8E3uWb Kc+3jeR37R1R4FHKLIoJO1mB/dCna0JD1AQY+6lHPWj7owk2X+mjPXcmi4IBtoeQnkqQ jCPn9lvetiVaFoWzM7Ph9Td7LSN7bXvU7dmqmiSbzcFC59MyY+D7TuQfItqL6jduaNRW eSMA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=RdwSPtuw; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c4si23863340pgu.231.2017.11.28.00.41.38; Tue, 28 Nov 2017 00:41:50 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=RdwSPtuw; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751901AbdK1IkL (ORCPT + 78 others); Tue, 28 Nov 2017 03:40:11 -0500 Received: from mail-ot0-f196.google.com ([74.125.82.196]:34037 "EHLO mail-ot0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751558AbdK1IkK (ORCPT ); Tue, 28 Nov 2017 03:40:10 -0500 Received: by mail-ot0-f196.google.com with SMTP id o23so26752721otd.1 for ; Tue, 28 Nov 2017 00:40:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=A/oiIBcDoySqszb1n/LA0Ln8UzwlZ0AnGgjbIFHhRmI=; b=RdwSPtuwAxyFgYp/INqyPU7SyeK00wV7CoVxONMb+kQ3UkRpyA2HaZ3MjsjArEGdCN Vj88jbUnUlHahZxGFYAj35NpSqEBvbDBDJFBU2JZNBCM0aGVmjnNMqK7+j4WIJqnbAXl A3zXI0id+Q+lwoKNEY+YH+7CK13IiPOnI8u1C6EpqHnlRpsjb7P2ccKIjntRXeyWkaI3 TF/sruo4Km1rsgM0beYT0SkX9nySRrfT70/XOjwRx7Jz4ngrkf5YQvYCta4+oKv0bJfk tOuhe9PzXwRADjlfvtTYoPqNj3PmDznzljKG1Yhrk/8uurJ57IUJXGyW7hxDnFp+4TKO Q5Aw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=A/oiIBcDoySqszb1n/LA0Ln8UzwlZ0AnGgjbIFHhRmI=; b=no5xtfYbNre0M3ZX8QtZdeuTOLD+M86c3wOYetWT5MnSg9VfteP1VVZuTdpbTxeyxv tJRnKv1J5A4umqYfwOM2JSc1gDgqtb93t6BbZb9w02FBSzUwCm8wpdbB7cv7dQ0GB3XH 9dlCtRdJc6ygQrYjPNwrjIvtGhgYdH3tl/KkaHzZ+9u94FNSLqBMZLjCoMuBqehzCmk0 bnwkbQRZdrpxdrN3hs4cyMlDwp1y8xkE24mjoR2YnFko1UvXzFiWW1QxbBbjktiKQ/9d tYMLEVz7sVdNqHTiypKnyMtSRZcBS7NfJ6vDqfNt7kYkCqNHB83a4EHPDX6FqEBxNNNi 2bHg== X-Gm-Message-State: AJaThX6qpOrywAKUGzFPK7fBP5m2wqvKSTxlOE2FZBAN4LwjPBmj3GTf ARGj5AF2eCMS6yaHttHhQjy3FDfg X-Received: by 10.157.50.16 with SMTP id t16mr30185678otc.44.1511858409428; Tue, 28 Nov 2017 00:40:09 -0800 (PST) Received: from JosephdeMacBook-Pro.local ([205.204.117.12]) by smtp.gmail.com with ESMTPSA id q185sm10876864oih.36.2017.11.28.00.40.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 28 Nov 2017 00:40:08 -0800 (PST) Subject: Re: [Ocfs2-devel] [PATCH 2/3] ocfs2: add ocfs2_overwrite_io function To: Gang He , jlbec@evilplan.org, hch@lst.de, Goldwyn Rodrigues , mfasheh@versity.com Cc: ocfs2-devel@oss.oracle.com, linux-kernel@vger.kernel.org References: <1511775987-841-1-git-send-email-ghe@suse.com> <1511775987-841-3-git-send-email-ghe@suse.com> <123f1322-d453-4aca-ac95-63d6f90fd8a2@gmail.com> <5A1D49E5020000F90009AC66@prv-mh.provo.novell.com> <805fb849-dcc7-cbbc-02af-1c6116a88957@gmail.com> <5A1D7FC2020000F90009AD91@prv-mh.provo.novell.com> From: Joseph Qi Message-ID: <1437e732-35ea-9022-3358-dbe7d2708009@gmail.com> Date: Tue, 28 Nov 2017 16:40:04 +0800 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:52.0) Gecko/20100101 Thunderbird/52.4.0 MIME-Version: 1.0 In-Reply-To: <5A1D7FC2020000F90009AD91@prv-mh.provo.novell.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 17/11/28 15:24, Gang He wrote: > Hello Joseph, > > >>>> > >> >> On 17/11/28 11:35, Gang He wrote: >>> Hello Joseph, >>> >>> >>>>>> >>>> Hi Gang, >>>> >>>> On 17/11/27 17:46, Gang He wrote: >>>>> Add ocfs2_overwrite_io function, which is used to judge if >>>>> overwrite allocated blocks, otherwise, the write will bring extra >>>>> block allocation overhead. >>>>> >>>>> Signed-off-by: Gang He >>>>> --- >>>>> fs/ocfs2/extent_map.c | 67 >>>> +++++++++++++++++++++++++++++++++++++++++++++++++++ >>>>> fs/ocfs2/extent_map.h | 3 +++ >>>>> 2 files changed, 70 insertions(+) >>>>> >>>>> diff --git a/fs/ocfs2/extent_map.c b/fs/ocfs2/extent_map.c >>>>> index e4719e0..98bf325 100644 >>>>> --- a/fs/ocfs2/extent_map.c >>>>> +++ b/fs/ocfs2/extent_map.c >>>>> @@ -832,6 +832,73 @@ int ocfs2_fiemap(struct inode *inode, struct >>>> fiemap_extent_info *fieinfo, >>>>> return ret; >>>>> } >>>>> >>>>> +/* Is IO overwriting allocated blocks? */ >>>>> +int ocfs2_overwrite_io(struct inode *inode, u64 map_start, u64 map_len, >>>>> + int wait) >>>>> +{ >>>>> + int ret = 0, is_last; >>>>> + u32 mapping_end, cpos; >>>>> + struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); >>>>> + struct buffer_head *di_bh = NULL; >>>>> + struct ocfs2_extent_rec rec; >>>>> + >>>>> + if (wait) >>>>> + ret = ocfs2_inode_lock(inode, &di_bh, 0); >>>>> + else >>>>> + ret = ocfs2_try_inode_lock(inode, &di_bh, 0); >>>>> + if (ret) >>>>> + goto out; >>>>> + >>>>> + if (wait) >>>>> + down_read(&OCFS2_I(inode)->ip_alloc_sem); >>>>> + else { >>>>> + if (!down_read_trylock(&OCFS2_I(inode)->ip_alloc_sem)) { >>>>> + ret = -EAGAIN; >>>>> + goto out_unlock1; >>>>> + } >>>>> + } >>>>> + >>>>> + if ((OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) && >>>>> + ((map_start + map_len) <= i_size_read(inode))) >>>>> + goto out_unlock2; >>>>> + >>>>> + cpos = map_start >> osb->s_clustersize_bits; >>>>> + mapping_end = ocfs2_clusters_for_bytes(inode->i_sb, >>>>> + map_start + map_len); >>>>> + is_last = 0; >>>>> + while (cpos < mapping_end && !is_last) { >>>>> + ret = ocfs2_get_clusters_nocache(inode, di_bh, cpos, >>>>> + NULL, &rec, &is_last); >>>>> + if (ret) { >>>>> + mlog_errno(ret); >>>>> + goto out_unlock2; >>>>> + } >>>>> + >>>>> + if (rec.e_blkno == 0ULL) >>>>> + break; >>>>> + >>>>> + if (rec.e_flags & OCFS2_EXT_REFCOUNTED) >>>>> + break; >>>>> + >>>>> + cpos = le32_to_cpu(rec.e_cpos) + >>>>> + le16_to_cpu(rec.e_leaf_clusters); >>>>> + } >>>>> + >>>>> + if (cpos < mapping_end) >>>>> + ret = 1; >>>>> + >>>>> +out_unlock2: >>>>> + brelse(di_bh); >>>>> + >>>>> + up_read(&OCFS2_I(inode)->ip_alloc_sem); >>>>> + >>>>> +out_unlock1: >>>> Should brelse(di_bh) be here? >>> If the code jumps to out_unlock1 directly, the di_bh pointer should be NULL, >> it is not necessary to release. >>> >> Umm... No, once going out here, we have already taken inode lock. So >> di_bh should be released. > Sorry, you are right. > >> >>>> >>>>> + ocfs2_inode_unlock(inode, 0); >>>>> + >>>>> +out: >>>>> + return (ret ? 0 : 1); >>>> I don't think EAGAIN and other error code can be handled the same. We >>>> have to distinguish them. >>> Ok, I think we can add one line log to report the error in case the error is >> not EAGAIN. >>> >> My point is, there is no need to try again in several cases, e.g. EROFS >> returned by ocfs2_get_clusters_nocache. > In this function ocfs2_overwrite_io() only can return True(1) or False(0), then I think we can only give a error print before return true/false. > It is not necessary to return another value, but should let the user know any possible error message. >This is because you just ignore the error and convert it to 0 or 1. But in your next patch, if !ocfs2_overwrite_io(), it will return EGAIN to upper layer and let it try again. But in some cases, e.g. EROFS, trying again is meaningless. That's why we can't simply return 0 or 1 here. Also we have to distinguish the error code in the next patch. > Thanks > Gang > >> >>>> >>>> Thanks, >>>> Joseph >>>> >>>>> +} >>>>> + >>>>> int ocfs2_seek_data_hole_offset(struct file *file, loff_t *offset, int >>>> whence) >>>>> { >>>>> struct inode *inode = file->f_mapping->host; >>>>> diff --git a/fs/ocfs2/extent_map.h b/fs/ocfs2/extent_map.h >>>>> index 67ea57d..fd9e86a 100644 >>>>> --- a/fs/ocfs2/extent_map.h >>>>> +++ b/fs/ocfs2/extent_map.h >>>>> @@ -53,6 +53,9 @@ int ocfs2_extent_map_get_blocks(struct inode *inode, u64 >>>> v_blkno, u64 *p_blkno, >>>>> int ocfs2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, >>>>> u64 map_start, u64 map_len); >>>>> >>>>> +int ocfs2_overwrite_io(struct inode *inode, u64 map_start, u64 map_len, >>>>> + int wait); >>>>> + >>>>> int ocfs2_seek_data_hole_offset(struct file *file, loff_t *offset, int >>>> origin); >>>>> >>>>> int ocfs2_xattr_get_clusters(struct inode *inode, u32 v_cluster, >>>>> >>> From 1585298081929052357@xxx Tue Nov 28 08:34:24 +0000 2017 X-GM-THRID: 1585212205986077742 X-Gmail-Labels: Inbox,Category Forums,HistoricalUnread