From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id CBF9CC46CD2 for ; Tue, 2 Jan 2024 17:11:29 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 693E88D0016; Tue, 2 Jan 2024 12:11:29 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 643EE8D0006; Tue, 2 Jan 2024 12:11:29 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 50BA28D0016; Tue, 2 Jan 2024 12:11:29 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 3EF398D0006 for ; Tue, 2 Jan 2024 12:11:29 -0500 (EST) Received: from smtpin30.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 147B1A1696 for ; Tue, 2 Jan 2024 17:11:29 +0000 (UTC) X-FDA: 81635012298.30.B9F8AE6 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by imf10.hostedemail.com (Postfix) with ESMTP id 02FCDC002D for ; Tue, 2 Jan 2024 17:11:26 +0000 (UTC) Authentication-Results: imf10.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=b4DJR3SU; dmarc=pass (policy=none) header.from=redhat.com; spf=pass (imf10.hostedemail.com: domain of dhowells@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=dhowells@redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1704215487; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=Q4UcCxfloG77cC/pfD32WuEtxWkG2YAQtUa4GDcGdRQ=; b=c+TYvEN8RRsP/h2L0TrXPuFa4Y6FPUbNiwOf3x4mVcZXIHdnCSeajtPv5wxSj8RqpCLyoX 3ic4pz8XjWOCEmGCQe5xvZZdy0tf1e37ZtbJ/ikeh8p1+mem7yTulNrTyM7pjfQkHOg04G Hiwl/Jf9GRaYbQYX1zLIUTfvUe2osxw= ARC-Authentication-Results: i=1; imf10.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=b4DJR3SU; dmarc=pass (policy=none) header.from=redhat.com; spf=pass (imf10.hostedemail.com: domain of dhowells@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=dhowells@redhat.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1704215487; a=rsa-sha256; cv=none; b=XukXBlaD2yZQOahAdwqikejW2DKSy7zB5imafHN8MH7hkly9cDsMcVGaeMwqD3i9uSKWh/ PtgU0qaQdNZUA41BvF6wHDPUdpNcKKK6ZWuRjDEaXtXOLLwwAKO96EsXB63uJqxiE2ZW7T vBwu5i9ob5T9qq4Rf056gAHPIPgZxtE= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1704215486; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Q4UcCxfloG77cC/pfD32WuEtxWkG2YAQtUa4GDcGdRQ=; b=b4DJR3SUPbwp5AwD1V28o76xGnJYvDnVEk7UFRtTS33IgNGM6NZb5M4fSQcd5C4jaY/xVk A+6jdAEtIHWKtCV4wHsCV/gLteQes/Fl0LKoRN3cCYkS9wuaCWJT3ioix8OMZJLR5vOBmy h19vMdn7oc8PgkR2FCbAjI7jmkoPHc8= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-536-DPwMbcfePQyaxNssfUs5vA-1; Tue, 02 Jan 2024 12:11:21 -0500 X-MC-Unique: DPwMbcfePQyaxNssfUs5vA-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 9AA2085CBA2; Tue, 2 Jan 2024 17:11:20 +0000 (UTC) Received: from warthog.procyon.org.uk (unknown [10.42.28.68]) by smtp.corp.redhat.com (Postfix) with ESMTP id B6A1940C6EBA; Tue, 2 Jan 2024 17:11:17 +0000 (UTC) Organization: Red Hat UK Ltd. Registered Address: Red Hat UK Ltd, Amberley Place, 107-111 Peascod Street, Windsor, Berkshire, SI4 1TE, United Kingdom. Registered in England and Wales under Company Registration No. 3798903 From: David Howells In-Reply-To: <750e8251-ba30-4f53-a17b-73c79e3739ce@linux.alibaba.com> References: <750e8251-ba30-4f53-a17b-73c79e3739ce@linux.alibaba.com> <20231221132400.1601991-1-dhowells@redhat.com> <20231221132400.1601991-34-dhowells@redhat.com> To: Gao Xiang Cc: dhowells@redhat.com, Matthew Wilcox , Marc Dionne , Paulo Alcantara , Shyam Prasad N , Tom Talpey , Dominique Martinet , Eric Van Hensbergen , Ilya Dryomov , Christian Brauner , linux-cachefs@redhat.com, linux-afs@lists.infradead.org, linux-cifs@vger.kernel.org, linux-nfs@vger.kernel.org, ceph-devel@vger.kernel.org, v9fs@lists.linux.dev, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Jeff Layton , Steve French Subject: Re: [PATCH v5 33/40] netfs, cachefiles: Pass upper bound length to allow expansion MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-ID: <198743.1704215477.1@warthog.procyon.org.uk> Content-Transfer-Encoding: quoted-printable Date: Tue, 02 Jan 2024 17:11:17 +0000 Message-ID: <198744.1704215477@warthog.procyon.org.uk> X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.2 X-Rspamd-Queue-Id: 02FCDC002D X-Rspam-User: X-Rspamd-Server: rspam05 X-Stat-Signature: rsgj63u4mx1pz69odcaonfcos3h9k6ka X-HE-Tag: 1704215486-359804 X-HE-Meta: U2FsdGVkX18ljgHXNdnaFgIKGbMqXw4wS1QapvhK06FD3k92JTOGhFCKDkGbDxEQIZy90lUGVbOdloPRfSBj23czoRvVRTRFLQGSlsWIxQggaG9QnvR30mYIB2CIABr3b+VylDkXkY+DilSy75Rsr5h6qY9XTmuiCazhtueGaFWnOs0lmy3+e/QbkLfPIgnM6jlpAj8G/p8+QzG0+Jg2Imac3SGskJ6Lq+0U0VRhSm7x/9UbvcNIziFivJHcpzQ++iN5IYay1ZAJ3hl7abLitAOFUVFiYbqU3DPP3phrxa8mIChmIsjXy12qDZH0GSaTmDJBDoTWkloEZxQGFb5+uE6rwX0782WHhls219e16u2+N/rpHnoMyGEnXyPlMIYXY/EMTeiiKcpULEAn2fAvFdLGd6YvkOq+6vxtHA4VCVXezGdgwnWQwMmp4fi7i8uhrZ3gHT7vPzSOWiS2uhQZzo3uk/+Bq/0ZD20KYQv4+kYlE5Fq0K0wYiCDBzJZb80GxtUX1tVNzUpID2CPHLhy3LU+QDHtErlmtP4KICFYMu6HD6IHHkuJJUPG5DJ/QxM7CnqivIsZ8AYHjxrmMpl9OeY07a1rjK+e0KOu/vQtd3TJCcF38Te4CryUKulcIOqMGduYs6ZNi0xnOFwPBbEaSgYfcrDk/RfJdG/a3ud+LBiekCx48xFrhNAvZ4lqPy9a7s8Lbqcopt8xnRNqHa1DB3ecNoKB+EJ5L33v0P7haYlXOpEYg3zWECgh3SvU32Ge/xoifiq5gdZb6Q+8JW6QKUuoTTUUdszCDxqCdqheBB0mK9w/lzXnAampaHZOx5hzyv7SMe81Iq1SddZor1UZ0OoxUUBnaqSx0gy6um/jxGOa/kHBwsoGQUUk+bJK6X/avCsvV9ZmQ7H6977OORRFkVyYdBRvy/8mN18oKp1UBGukmD6WLSPfUzTSms3bPRkFXJkDmiI6cufZ6qJNXjO ovY5HZ8S T6fSbnj6ImlVQ0+M2UP4WkIwk8Wlu4vtTc0qe3hvGwMaM/8sPGrCVTtDcSnJrVEqhc6BTRACYx6xjnPhgZ7el0a9OCRuGrCNdaQuztcqHrZ2/DuDmFhtqzsBmz3fU/qLL6ptl4T+8yjffXTmMX5Ez9bGvaHgwmKGS6xhOb8wxBbFstQFOuEdAvXrcdg== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Gao Xiang wrote: > > down =3D start - round_down(start, PAGE_SIZE); > > *_start =3D start - down; > > *_len =3D round_up(down + len, PAGE_SIZE); > > + if (down < start || *_len > upper_len) > > + return -ENOBUFS; > = > Sorry for bothering. We just found some strange when testing > today-next EROFS over fscache. > = > I'm not sure the meaning of > if (down < start > = > For example, if start is page-aligned, down =3D=3D 0. > = > so as long as start > 0 and page-aligned, it will return > -ENOBUFS. Does it an intended behavior? Yeah, I think that's wrong. Does the attached help? David --- diff --git a/fs/cachefiles/io.c b/fs/cachefiles/io.c index bffffedce4a9..7529b40bc95a 100644 --- a/fs/cachefiles/io.c +++ b/fs/cachefiles/io.c @@ -522,16 +522,22 @@ int __cachefiles_prepare_write(struct cachefiles_obj= ect *object, bool no_space_allocated_yet) { struct cachefiles_cache *cache =3D object->volume->cache; - loff_t start =3D *_start, pos; - size_t len =3D *_len, down; + unsigned long long start =3D *_start, pos; + size_t len =3D *_len; int ret; = /* Round to DIO size */ - down =3D start - round_down(start, PAGE_SIZE); - *_start =3D start - down; - *_len =3D round_up(down + len, PAGE_SIZE); - if (down < start || *_len > upper_len) + start =3D round_down(*_start, PAGE_SIZE); + if (start !=3D *_start) { + kleave(" =3D -ENOBUFS [down]"); + return -ENOBUFS; + } + if (*_len > upper_len) { + kleave(" =3D -ENOBUFS [up]"); return -ENOBUFS; + } + + *_len =3D round_up(len, PAGE_SIZE); = /* We need to work out whether there's sufficient disk space to perform * the write - but we can skip that check if we have space already @@ -542,7 +548,7 @@ int __cachefiles_prepare_write(struct cachefiles_objec= t *object, = pos =3D cachefiles_inject_read_error(); if (pos =3D=3D 0) - pos =3D vfs_llseek(file, *_start, SEEK_DATA); + pos =3D vfs_llseek(file, start, SEEK_DATA); if (pos < 0 && pos >=3D (loff_t)-MAX_ERRNO) { if (pos =3D=3D -ENXIO) goto check_space; /* Unallocated tail */ @@ -550,7 +556,7 @@ int __cachefiles_prepare_write(struct cachefiles_objec= t *object, cachefiles_trace_seek_error); return pos; } - if ((u64)pos >=3D (u64)*_start + *_len) + if (pos >=3D start + *_len) goto check_space; /* Unallocated region */ = /* We have a block that's at least partially filled - if we're low on @@ -563,13 +569,13 @@ int __cachefiles_prepare_write(struct cachefiles_obj= ect *object, = pos =3D cachefiles_inject_read_error(); if (pos =3D=3D 0) - pos =3D vfs_llseek(file, *_start, SEEK_HOLE); + pos =3D vfs_llseek(file, start, SEEK_HOLE); if (pos < 0 && pos >=3D (loff_t)-MAX_ERRNO) { trace_cachefiles_io_error(object, file_inode(file), pos, cachefiles_trace_seek_error); return pos; } - if ((u64)pos >=3D (u64)*_start + *_len) + if (pos >=3D start + *_len) return 0; /* Fully allocated */ = /* Partially allocated, but insufficient space: cull. */ @@ -577,7 +583,7 @@ int __cachefiles_prepare_write(struct cachefiles_objec= t *object, ret =3D cachefiles_inject_remove_error(); if (ret =3D=3D 0) ret =3D vfs_fallocate(file, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, - *_start, *_len); + start, *_len); if (ret < 0) { trace_cachefiles_io_error(object, file_inode(file), ret, cachefiles_trace_fallocate_error);