Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp4526091rwd; Tue, 23 May 2023 08:49:29 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6nJkRgVnQ4WI8m6n5ZYyWStNvvcVS6faOcO3Q6WKnq5KwJd+PdhPqzg7VD024LpcD+Y2Wk X-Received: by 2002:a17:90a:e550:b0:244:d441:8f68 with SMTP id ei16-20020a17090ae55000b00244d4418f68mr19412801pjb.16.1684856968924; Tue, 23 May 2023 08:49:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1684856968; cv=none; d=google.com; s=arc-20160816; b=IlDDkcSHw6aRipbGtWmVgTY7zztga1VL5Mx1AnVzyIC7D1CixCE24ZZ8eJ9xPK+EHZ OSnSUk3c6uTPrkRSUspT+y5UZr5TALMGLhG3P18dwtexg8agx4+T7aZhf/bTDTyLa0TN 9c3MxZImU8UJCGkb0BvAqRMS3vA5l1gGx+zq08rKR7+VEznXGWs84m0pzG5QPmuGGzTw yOfi7Cz0Fu6pos6VQntXcIAVrFumdrZAkjAyA7EJgcwLPWfSSZTUdd4kwrgMLrNmqVmg XPlmrk8/HJpe5QZCZEKV9bSNj/1jBt2TgoGfG+KnEJ3dgAFgpsjFs3q2TYxn4dNwL/7R VU0w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=mG3+lAD7U3t4WSC9VplBgt7x67nBvVaq+nXZW6rVirc=; b=wYKylF0my/Avc9UFVGBt57tK6KZRQ43nqdFpNBtYA+7BlueNxStCbcQJIpCFF7QIz0 X6owvPr/QgOv9QaOOgQ6fSJ5CWf6b121QjwU3yaL7+pMp5HJ4ADra0y1JNgYgWrbElFD i+XZaj+cheAAgbwp+AwBzmB/urVrEzsMTtaKlv1XDW8oymFK7bFwhTdUl/FT8X4bHnAv 3w7lEPihN3InJUNAWn2q28IL98FIx3arnYPflBM0SriZLCV8rUoYX6CNxdQ4NSSfzI7n 5mFI0hMQgrHSM3rakwEuSfWPSW5021zfXlMTM1YoZYnhyyd3FTkpr8WNtJM8+gjYtmPW 2FLQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=elhoKLKi; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id bv4-20020a632e04000000b0052c40645e07si6614819pgb.57.2023.05.23.08.49.14; Tue, 23 May 2023 08:49:28 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=elhoKLKi; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237574AbjEWPjR (ORCPT + 99 others); Tue, 23 May 2023 11:39:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44828 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233770AbjEWPjQ (ORCPT ); Tue, 23 May 2023 11:39:16 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5A4AF11A; Tue, 23 May 2023 08:39:15 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id A5A25615E2; Tue, 23 May 2023 15:39:14 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9E4AAC433EF; Tue, 23 May 2023 15:39:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1684856354; bh=KOcyZ19L4AlfnOXdZXmoI91i3uvwElF0P4WDlZk+yvE=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=elhoKLKis6peqVdy57qfugtTGrsRwvvp2zEa7BY9RigRocQqK3VUS/qRTp8xpRk2P 2+AxAOrKvdlc7/ZBp6Pnpr6+x40qxAXhvsSU7WePHrE1ZBzFKIc1A9uYl4e3Qa32rb KMVoGOYQq2Q+IFTo3tPrNany/v4uTTBsZd1AKf2ch42DMUvD9ZHVz2KZ/3gZl9NBwM p6wJQq5vtdDksm+Er4dgcED1F6hF3Lj8AfWUOgK/S9ejnWcU713Yq4biEYiz1SfmbC nNvJqVXc8NK7tJwfSXfLApdT8NaqMam3zih2CgD4gbmiN6mcITR3eXeMvCufLB9MY7 lYxQiVYC5YhUQ== Date: Tue, 23 May 2023 17:39:08 +0200 From: Christian Brauner To: Dominique Martinet Cc: Alexander Viro , Jens Axboe , Pavel Begunkov , Stefan Roesch , Clay Harris , Dave Chinner , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, io-uring@vger.kernel.org Subject: Re: [PATCH v2 1/6] fs: split off vfs_getdents function of getdents64 syscall Message-ID: <20230523-entzug-komodowaran-96d003250f70@brauner> References: <20230422-uring-getdents-v2-0-2db1e37dc55e@codewreck.org> <20230422-uring-getdents-v2-1-2db1e37dc55e@codewreck.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20230422-uring-getdents-v2-1-2db1e37dc55e@codewreck.org> X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, May 10, 2023 at 07:52:49PM +0900, Dominique Martinet wrote: > This splits off the vfs_getdents function from the getdents64 system > call. > This will allow io_uring to call the vfs_getdents function. > > Co-authored-by: Stefan Roesch > Signed-off-by: Dominique Martinet > --- > fs/internal.h | 8 ++++++++ > fs/readdir.c | 34 ++++++++++++++++++++++++++-------- > 2 files changed, 34 insertions(+), 8 deletions(-) > > diff --git a/fs/internal.h b/fs/internal.h > index bd3b2810a36b..e8ca000e6613 100644 > --- a/fs/internal.h > +++ b/fs/internal.h > @@ -260,3 +260,11 @@ ssize_t __kernel_write_iter(struct file *file, struct iov_iter *from, loff_t *po > struct mnt_idmap *alloc_mnt_idmap(struct user_namespace *mnt_userns); > struct mnt_idmap *mnt_idmap_get(struct mnt_idmap *idmap); > void mnt_idmap_put(struct mnt_idmap *idmap); > + > +/* > + * fs/readdir.c > + */ > +struct linux_dirent64; > + > +int vfs_getdents(struct file *file, struct linux_dirent64 __user *dirent, > + unsigned int count); > diff --git a/fs/readdir.c b/fs/readdir.c > index 9c53edb60c03..ed0803d0011e 100644 > --- a/fs/readdir.c > +++ b/fs/readdir.c > @@ -21,6 +21,7 @@ > #include > #include > #include > +#include "internal.h" > > #include > > @@ -351,10 +352,16 @@ static bool filldir64(struct dir_context *ctx, const char *name, int namlen, > return false; > } > > -SYSCALL_DEFINE3(getdents64, unsigned int, fd, > - struct linux_dirent64 __user *, dirent, unsigned int, count) > + > +/** > + * vfs_getdents - getdents without fdget > + * @file : pointer to file struct of directory > + * @dirent : pointer to user directory structure > + * @count : size of buffer > + */ > +int vfs_getdents(struct file *file, struct linux_dirent64 __user *dirent, > + unsigned int count) > { > - struct fd f; > struct getdents_callback64 buf = { > .ctx.actor = filldir64, > .count = count, > @@ -362,11 +369,7 @@ SYSCALL_DEFINE3(getdents64, unsigned int, fd, > }; > int error; > > - f = fdget_pos(fd); > - if (!f.file) > - return -EBADF; > - > - error = iterate_dir(f.file, &buf.ctx); > + error = iterate_dir(file, &buf.ctx); So afaict this isn't enough. If you look into iterate_shared() you should see that it uses and updates f_pos. But that can't work for io_uring and also isn't how io_uring handles read and write. You probably need to use a local pos similar to what io_uring does in rw.c for rw->kiocb.ki_pos. But in contrast simply disallow any offsets for getdents completely. Thus not relying on f_pos anywhere at all.