From nobody Thu May 7 20:26:43 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D7D26C433F5 for ; Thu, 19 May 2022 09:24:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236006AbiESJYR (ORCPT ); Thu, 19 May 2022 05:24:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60976 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235992AbiESJYO (ORCPT ); Thu, 19 May 2022 05:24:14 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id A3E49A76ED for ; Thu, 19 May 2022 02:24:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1652952252; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=17jbVsw+moEo6hJdd/lN8c/+3+IYlduGpqbhyDnKS8E=; b=K0cmh4zrnteiWxB6Q4dFZihhTcvJ2tk3u2PoQGIw+H9LB31llvmgJLMa+OMoCZEMAkIqw0 ZCtYBzHB11OEuJSEXK1EYO5zypnvgApKwQQxAVWfLdiKZh+Fouvl7dVkw9+g9yrLCPlfGF TdfWM+xGGewWPZRtvpQoJZz/5XHxt/o= Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-153-2UpCg0R-MquPz8GcXgB4WQ-1; Thu, 19 May 2022 05:24:11 -0400 X-MC-Unique: 2UpCg0R-MquPz8GcXgB4WQ-1 Received: by mail-wm1-f72.google.com with SMTP id v124-20020a1cac82000000b003948b870a8dso4260279wme.2 for ; Thu, 19 May 2022 02:24:11 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=17jbVsw+moEo6hJdd/lN8c/+3+IYlduGpqbhyDnKS8E=; b=NOaLjEhATRwWrBFFzihWHGQ57ei4ILE4YFOZb/8EwoDJUXFLFg7HiWwNDuSHUNdmNV Umw/VgJE+MGFk+V/vmmzJC6PPlUpu9qAFUBLlAVag8k6Zi81PMIebfXxiD/4KYBftmRJ 9Ucu5X3ElPx4kRJTwe43wMhspnXhgcepIAj7Et9leWcLUEU5hmLUdt9Ne51r496K8ZZ4 i0JLJj6qzJwZPSxOCP1bCktdVs/4IKctoAy1BkPAZNl3rMBChK/ODfp5usrvfjZb6ujS 4w9MtQ+t3Zpime1wVpu9wIdk/FaPjvQUzH5FopSgZjecS9YYC1oA/hE2NE8EylFZOUAR TjRA== X-Gm-Message-State: AOAM530zDv/xcka1EdwqAtY+k213Ox6qMLH8pSG6+dj+TNURzGJ7QVC/ ChCInPrQ0xkZW57ZgJ6N2buGDeSjmnCJaSGm6X0A/4kvon/GVt/JR/YyXQ3xCzD/ie0lYP8iOp7 3HKx461njpy+UHnZVoGtmwinD+67g7Y5ydWCLY310AL8f53lsWQbpWTJP7tvQbFHNrLU4xf8egg E= X-Received: by 2002:adf:d090:0:b0:20d:3d4:8845 with SMTP id y16-20020adfd090000000b0020d03d48845mr3268331wrh.162.1652952250463; Thu, 19 May 2022 02:24:10 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx+cy933X3rEwzU9/Ah7qzOGFkRbtoIk3v5PlWkKn+OSJkQqFhd2q0Nx9n+x09aDxK01OAu4A== X-Received: by 2002:adf:d090:0:b0:20d:3d4:8845 with SMTP id y16-20020adfd090000000b0020d03d48845mr3268310wrh.162.1652952250251; Thu, 19 May 2022 02:24:10 -0700 (PDT) Received: from minerva.home (205.pool92-176-231.dynamic.orange.es. [92.176.231.205]) by smtp.gmail.com with ESMTPSA id n10-20020a5d6b8a000000b0020c5253d8fasm4104647wrx.70.2022.05.19.02.24.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 May 2022 02:24:09 -0700 (PDT) From: Javier Martinez Canillas To: linux-kernel@vger.kernel.org Cc: Colin Walters , Peter Jones , Alexander Larsson , Alberto Ruiz , Christian Kellner , Lennart Poettering , Chung-Chiang Cheng , Javier Martinez Canillas , OGAWA Hirofumi Subject: [RFC PATCH 1/3] fat: add a vfat_rename2() and make existing .rename callback a helper Date: Thu, 19 May 2022 11:23:41 +0200 Message-Id: <20220519092343.2776414-2-javierm@redhat.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220519092343.2776414-1-javierm@redhat.com> References: <20220519092343.2776414-1-javierm@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Currently vfat only supports the RENAME_NOREPLACE flag which is handled by the virtual file system layer but doesn't support the RENAME_EXCHANGE flag. Add a vfat_rename2() function to be used as the .rename callback and move the current vfat_rename() handler to a helper. This is in preparation for implementing the RENAME_NOREPLACE flag using a different helper function. Signed-off-by: Javier Martinez Canillas --- fs/fat/namei_vfat.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/fs/fat/namei_vfat.c b/fs/fat/namei_vfat.c index c573314806cf..88ccb2ee3537 100644 --- a/fs/fat/namei_vfat.c +++ b/fs/fat/namei_vfat.c @@ -889,9 +889,8 @@ static int vfat_mkdir(struct user_namespace *mnt_userns= , struct inode *dir, return err; } =20 -static int vfat_rename(struct user_namespace *mnt_userns, struct inode *ol= d_dir, - struct dentry *old_dentry, struct inode *new_dir, - struct dentry *new_dentry, unsigned int flags) +static int vfat_rename(struct inode *old_dir, struct dentry *old_dentry, + struct inode *new_dir, struct dentry *new_dentry) { struct buffer_head *dotdot_bh; struct msdos_dir_entry *dotdot_de; @@ -902,9 +901,6 @@ static int vfat_rename(struct user_namespace *mnt_usern= s, struct inode *old_dir, int err, is_dir, update_dotdot, corrupt =3D 0; struct super_block *sb =3D old_dir->i_sb; =20 - if (flags & ~RENAME_NOREPLACE) - return -EINVAL; - old_sinfo.bh =3D sinfo.bh =3D dotdot_bh =3D NULL; old_inode =3D d_inode(old_dentry); new_inode =3D d_inode(new_dentry); @@ -1021,13 +1017,24 @@ static int vfat_rename(struct user_namespace *mnt_u= serns, struct inode *old_dir, goto out; } =20 +static int vfat_rename2(struct user_namespace *mnt_userns, struct inode *o= ld_dir, + struct dentry *old_dentry, struct inode *new_dir, + struct dentry *new_dentry, unsigned int flags) +{ + if (flags & ~RENAME_NOREPLACE) + return -EINVAL; + + /* VFS already handled RENAME_NOREPLACE, handle it as a normal rename */ + return vfat_rename(old_dir, old_dentry, new_dir, new_dentry); +} + static const struct inode_operations vfat_dir_inode_operations =3D { .create =3D vfat_create, .lookup =3D vfat_lookup, .unlink =3D vfat_unlink, .mkdir =3D vfat_mkdir, .rmdir =3D vfat_rmdir, - .rename =3D vfat_rename, + .rename =3D vfat_rename2, .setattr =3D fat_setattr, .getattr =3D fat_getattr, .update_time =3D fat_update_time, --=20 2.35.1 From nobody Thu May 7 20:26:43 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B7516C433EF for ; Thu, 19 May 2022 09:24:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236028AbiESJYX (ORCPT ); Thu, 19 May 2022 05:24:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60940 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236001AbiESJYP (ORCPT ); Thu, 19 May 2022 05:24:15 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id CFCBA66691 for ; Thu, 19 May 2022 02:24:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1652952253; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=w/xhrdt07itf9QlFZRajP4erMObfKTorbLnIbRKwLGQ=; b=HGMt7GLDgZx7WOdAT2EsYD/0wVQKGNDX62vaPoQO47YaVZyF1ZGC8a6AdJM9j4LDCLW/DJ 3J9WOU+SYA5irceV6AACTjY5RayUnif5mr4/MSOUb44zv8tCwpxxziHXls4HNHqsN3lBDu KIy17yKRCgY3cajKIdedx3P0vkvDC64= Received: from mail-wr1-f70.google.com (mail-wr1-f70.google.com [209.85.221.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-92-k_VW5I2dNfq2oLAnDodf0A-1; Thu, 19 May 2022 05:24:12 -0400 X-MC-Unique: k_VW5I2dNfq2oLAnDodf0A-1 Received: by mail-wr1-f70.google.com with SMTP id e6-20020adfef06000000b0020d08e465e2so1343046wro.3 for ; Thu, 19 May 2022 02:24:12 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=w/xhrdt07itf9QlFZRajP4erMObfKTorbLnIbRKwLGQ=; b=uTxMaz7wPR+UEwdxEHnk/3olvXJbFAmHTDE4xbA5eEYIooKiyeDJ0HmwBOqFvq/HYD Q0cW14aLVQnYgS4ycslIBdG//ULEk9QGUck5Wa2n8ifZA+WA4HKiJQRm7hOanf6njWL1 YLlpkIETXGX41fRjzoTqN5sYappYml2aZ2CzYANf7BU0SbWueRU5wQG7ckfRpdwBR/iw eqDRn2fpaYgjvh/qYorN7ZZ3gdhwbQQXdpwoe5JdcTgkf6G0oyQDvDPVBgJRvKCU7OHG 3/0hNliwDHvPyFiZUSEFTTE+AfAaTI9HAriHsxt/qSOhap6PkzYVIwDpK8PbvdwHYK1E vAag== X-Gm-Message-State: AOAM530gP72/AlrixoT8MhxxR6Eheb8umcmAsi/fAxdONfBjbz+I7bq0 Ks1fC8e5gf0+f+OtLuI3dBoURqtA1Pous8cRzUiWvxsXSGyjm28efdUdn8IVuT2EggIGjrTfeqa qJOVOC+pJZUZh2iTSpnaPAezX9wK4S5PLYdxmhLRKNXtXVVJL/EfgJI0D7sSYArmzkwozNyXbi7 4= X-Received: by 2002:adf:d183:0:b0:20d:8dc:eb5c with SMTP id v3-20020adfd183000000b0020d08dceb5cmr3217834wrc.444.1652952251531; Thu, 19 May 2022 02:24:11 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx9KjewAa3UsgrAsT0rCnyFAOZdwCKgaZ2SXH4nprB/UJrNJr3qx40PioIubAm3dHXxl835uw== X-Received: by 2002:adf:d183:0:b0:20d:8dc:eb5c with SMTP id v3-20020adfd183000000b0020d08dceb5cmr3217804wrc.444.1652952251226; Thu, 19 May 2022 02:24:11 -0700 (PDT) Received: from minerva.home (205.pool92-176-231.dynamic.orange.es. [92.176.231.205]) by smtp.gmail.com with ESMTPSA id n10-20020a5d6b8a000000b0020c5253d8fasm4104647wrx.70.2022.05.19.02.24.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 May 2022 02:24:10 -0700 (PDT) From: Javier Martinez Canillas To: linux-kernel@vger.kernel.org Cc: Colin Walters , Peter Jones , Alexander Larsson , Alberto Ruiz , Christian Kellner , Lennart Poettering , Chung-Chiang Cheng , Javier Martinez Canillas , OGAWA Hirofumi Subject: [RFC PATCH 2/3] fat: add renameat2 RENAME_EXCHANGE flag support Date: Thu, 19 May 2022 11:23:42 +0200 Message-Id: <20220519092343.2776414-3-javierm@redhat.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220519092343.2776414-1-javierm@redhat.com> References: <20220519092343.2776414-1-javierm@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The renameat2 RENAME_EXCHANGE flag allows to atomically exchange two paths but is currently not supported by the Linux vfat filesystem driver. Add a vfat_rename_exchange() helper function that implements this support. The super block lock is acquired during the operation to ensure atomicity, and in the error path actions made are reversed also with the mutex held, making the whole operation transactional. Signed-off-by: Javier Martinez Canillas --- fs/fat/namei_vfat.c | 153 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 152 insertions(+), 1 deletion(-) diff --git a/fs/fat/namei_vfat.c b/fs/fat/namei_vfat.c index 88ccb2ee3537..6415a59eed13 100644 --- a/fs/fat/namei_vfat.c +++ b/fs/fat/namei_vfat.c @@ -1017,13 +1017,164 @@ static int vfat_rename(struct inode *old_dir, stru= ct dentry *old_dentry, goto out; } =20 +static int vfat_rename_exchange(struct inode *old_dir, struct dentry *old_= dentry, + struct inode *new_dir, struct dentry *new_dentry) +{ + struct buffer_head *old_dotdot_bh =3D NULL, *new_dotdot_bh =3D NULL; + struct msdos_dir_entry *old_dotdot_de =3D NULL, *new_dotdot_de =3D NULL; + struct inode *old_inode, *new_inode; + struct timespec64 ts =3D current_time(old_dir); + loff_t old_i_pos, new_i_pos; + int err, corrupt =3D 0; + struct super_block *sb =3D old_dir->i_sb; + + old_inode =3D d_inode(old_dentry); + new_inode =3D d_inode(new_dentry); + + /* Acquire super block lock for the operation to be atomic */ + mutex_lock(&MSDOS_SB(sb)->s_lock); + + /* if directories are not the same, get ".." info to update */ + if (old_dir !=3D new_dir) { + if (S_ISDIR(old_inode->i_mode)) + if (fat_get_dotdot_entry(old_inode, &old_dotdot_bh, &old_dotdot_de)) { + err =3D -EIO; + goto out; + } + + if (S_ISDIR(new_inode->i_mode)) + if (fat_get_dotdot_entry(new_inode, &new_dotdot_bh, &new_dotdot_de)) { + err =3D -EIO; + goto out; + } + } + + /* exchange the two dentries */ + old_i_pos =3D MSDOS_I(old_inode)->i_pos; + new_i_pos =3D MSDOS_I(new_inode)->i_pos; + + fat_detach(old_inode); + fat_detach(new_inode); + + fat_attach(old_inode, new_i_pos); + fat_attach(new_inode, old_i_pos); + + if (IS_DIRSYNC(old_dir)) { + err =3D fat_sync_inode(new_inode); + if (err) + goto error_exchange; + } else { + mark_inode_dirty(new_inode); + } + + if (IS_DIRSYNC(new_dir)) { + err =3D fat_sync_inode(old_inode); + if (err) + goto error_exchange; + } else { + mark_inode_dirty(old_inode); + } + + /* update ".." directory entry info */ + if (old_dotdot_de) { + fat_set_start(old_dotdot_de, MSDOS_I(new_dir)->i_logstart); + mark_buffer_dirty_inode(old_dotdot_bh, old_inode); + if (IS_DIRSYNC(new_dir)) { + err =3D sync_dirty_buffer(old_dotdot_bh); + if (err) + goto error_old_dotdot; + } + drop_nlink(old_dir); + inc_nlink(new_dir); + } + + if (new_dotdot_de) { + fat_set_start(new_dotdot_de, MSDOS_I(old_dir)->i_logstart); + mark_buffer_dirty_inode(new_dotdot_bh, new_inode); + if (IS_DIRSYNC(old_dir)) { + err =3D sync_dirty_buffer(new_dotdot_bh); + if (err) + goto error_new_dotdot; + } + drop_nlink(new_dir); + inc_nlink(old_dir); + } + + /* update inode version and timestamps */ + inode_inc_iversion(old_dir); + inode_inc_iversion(new_dir); + inode_inc_iversion(old_inode); + inode_inc_iversion(new_inode); + + fat_truncate_time(old_dir, &ts, S_CTIME | S_MTIME); + fat_truncate_time(new_dir, &ts, S_CTIME | S_MTIME); + + if (IS_DIRSYNC(old_dir)) + (void)fat_sync_inode(old_dir); + else + mark_inode_dirty(old_dir); + + if (IS_DIRSYNC(new_dir)) + (void)fat_sync_inode(new_dir); + else + mark_inode_dirty(new_dir); +out: + brelse(old_dotdot_bh); + brelse(new_dotdot_bh); + mutex_unlock(&MSDOS_SB(sb)->s_lock); + + return err; + +error_new_dotdot: + /* data cluster is shared, serious corruption */ + corrupt =3D 1; + + if (new_dotdot_de) { + fat_set_start(new_dotdot_de, MSDOS_I(new_dir)->i_logstart); + mark_buffer_dirty_inode(new_dotdot_bh, new_inode); + corrupt |=3D sync_dirty_buffer(new_dotdot_bh); + } + +error_old_dotdot: + /* data cluster is shared, serious corruption */ + corrupt =3D 1; + + if (old_dotdot_de) { + fat_set_start(old_dotdot_de, MSDOS_I(old_dir)->i_logstart); + mark_buffer_dirty_inode(old_dotdot_bh, old_inode); + corrupt |=3D sync_dirty_buffer(old_dotdot_bh); + } + +error_exchange: + fat_detach(old_inode); + fat_detach(new_inode); + + fat_attach(old_inode, old_i_pos); + fat_attach(new_inode, new_i_pos); + + if (corrupt) { + corrupt |=3D fat_sync_inode(old_inode); + corrupt |=3D fat_sync_inode(new_inode); + } + + if (corrupt < 0) { + fat_fs_error(new_dir->i_sb, + "%s: Filesystem corrupted (i_pos %lld, %lld)", + __func__, old_i_pos, new_i_pos); + } + goto out; +} + static int vfat_rename2(struct user_namespace *mnt_userns, struct inode *o= ld_dir, struct dentry *old_dentry, struct inode *new_dir, struct dentry *new_dentry, unsigned int flags) { - if (flags & ~RENAME_NOREPLACE) + if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE)) return -EINVAL; =20 + if (flags & RENAME_EXCHANGE) + return vfat_rename_exchange(old_dir, old_dentry, new_dir, new_dentry); + /* VFS already handled RENAME_NOREPLACE, handle it as a normal rename */ return vfat_rename(old_dir, old_dentry, new_dir, new_dentry); } --=20 2.35.1 From nobody Thu May 7 20:26:43 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id F1733C433F5 for ; Thu, 19 May 2022 09:24:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229770AbiESJY3 (ORCPT ); Thu, 19 May 2022 05:24:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:32790 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236009AbiESJYS (ORCPT ); Thu, 19 May 2022 05:24:18 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 98C2C5EDF5 for ; Thu, 19 May 2022 02:24:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1652952255; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ts/xzI6IsKO05VcLisAa+QvVgM0oUndTDtroZLGhf6A=; b=El7ohiEEj4p2HZA8o+z4VgND0BzWcDT6nUCIoUMV09nYkhsisQAloUpGcTaIdlz2fvOalU euZ++2gNFDL/szr5E2uC1dWToLaiXebykgYw5kTYuwjpDb8ApfdwSVPCIlBERMNWKiNyOJ 7Zf33BkJuk2Wnmx/Gh84ocgB5rXBRh0= Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-206-aYKSF-SdO8S0vZJhHYHMsw-1; Thu, 19 May 2022 05:24:14 -0400 X-MC-Unique: aYKSF-SdO8S0vZJhHYHMsw-1 Received: by mail-wm1-f72.google.com with SMTP id r64-20020a1c4443000000b00397335edc7dso252961wma.7 for ; Thu, 19 May 2022 02:24:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ts/xzI6IsKO05VcLisAa+QvVgM0oUndTDtroZLGhf6A=; b=Lk0fkZsSejsImOXYW5SjQVufVlb+XlOIXyyt++rdOrWBNZWe4qRElWU+owEbWPkzbZ UI2GNpgAKXbT/sA+p86XhpskrfyPcPiMZM0LlRbLSm/bdUcF3bHcYQPQY9kKcLxF5N1n JYovp5VkXA+mnZFItPAhWFDZ4Yq+GwlJrxGBD5S44BDKPAVSxxgxo2Ntc7R/fs8Mu46Z lVr4t91vTxG6x4hu9HGv79ZdtCqNTR2H4G6dqzHh94Y3uZq1+D+9K64NUULQnVool5DX gpcfonV+L8KDIa3BRpxfWj0IXvJI1kepCleT4H645qXD/c1OAAm0fOf1vTbAE16PNwb5 9ndQ== X-Gm-Message-State: AOAM531fGc5tU5YOuF6rMyK5Y5uXqe8HjmbvQzsqBwqdqYK6/h+1FHIe WV9S76xEdddKKR84X93BP0SKkl1Q7eUvJQ6D8LCp9U3DARiYOpMAMDW1Bah90vWB0cYhVQE4ZE1 FIOwN7P3CAcKj/PvNY9HtFPvmzzL3NSNs/icrBfnMr8NrbnYnKr7rmWnO0PUrzaahm2Ol54nTN+ A= X-Received: by 2002:a7b:c454:0:b0:394:1b5b:62ff with SMTP id l20-20020a7bc454000000b003941b5b62ffmr3309178wmi.47.1652952252707; Thu, 19 May 2022 02:24:12 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyyBa+3u7rNUVt7rNtgJP+7/Ryxg5DIZPKlnOhvQTxYYKxIzV9ErJkW/BM8YPRLp6oRw0odlg== X-Received: by 2002:a7b:c454:0:b0:394:1b5b:62ff with SMTP id l20-20020a7bc454000000b003941b5b62ffmr3309146wmi.47.1652952252364; Thu, 19 May 2022 02:24:12 -0700 (PDT) Received: from minerva.home (205.pool92-176-231.dynamic.orange.es. [92.176.231.205]) by smtp.gmail.com with ESMTPSA id n10-20020a5d6b8a000000b0020c5253d8fasm4104647wrx.70.2022.05.19.02.24.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 May 2022 02:24:12 -0700 (PDT) From: Javier Martinez Canillas To: linux-kernel@vger.kernel.org Cc: Colin Walters , Peter Jones , Alexander Larsson , Alberto Ruiz , Christian Kellner , Lennart Poettering , Chung-Chiang Cheng , Javier Martinez Canillas , OGAWA Hirofumi , Shuah Khan , linux-kselftest@vger.kernel.org Subject: [RFC PATCH 3/3] selftests/filesystems: add a vfat RENAME_EXCHANGE test Date: Thu, 19 May 2022 11:23:43 +0200 Message-Id: <20220519092343.2776414-4-javierm@redhat.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220519092343.2776414-1-javierm@redhat.com> References: <20220519092343.2776414-1-javierm@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add a test for the renameat2 RENAME_EXCHANGE support in vfat, but split it in a tool that just does the rename exchange and a script that is run by the kselftests framework on `make TARGETS=3D"filesystems/fat" kselftest`. That way the script can be easily extended to test other file operations. The script creates a 1 MiB disk image, that is then formated with a vfat filesystem and mounted using a loop device. That way all file operations are done on an ephemeral filesystem. Signed-off-by: Javier Martinez Canillas --- MAINTAINERS | 1 + tools/testing/selftests/Makefile | 1 + .../selftests/filesystems/fat/Makefile | 7 ++ .../testing/selftests/filesystems/fat/config | 2 + .../filesystems/fat/rename_exchange.c | 37 +++++++++ .../filesystems/fat/run_fat_tests.sh | 80 +++++++++++++++++++ 6 files changed, 128 insertions(+) create mode 100644 tools/testing/selftests/filesystems/fat/Makefile create mode 100644 tools/testing/selftests/filesystems/fat/config create mode 100644 tools/testing/selftests/filesystems/fat/rename_exchange= .c create mode 100755 tools/testing/selftests/filesystems/fat/run_fat_tests.sh diff --git a/MAINTAINERS b/MAINTAINERS index 4fdbbd6c1984..158771bb7755 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -20841,6 +20841,7 @@ M: OGAWA Hirofumi S: Maintained F: Documentation/filesystems/vfat.rst F: fs/fat/ +F: tools/testing/selftests/filesystems/fat/ =20 VFIO DRIVER M: Alex Williamson diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Mak= efile index 0aedcd76cf0f..fc59ad849a90 100644 --- a/tools/testing/selftests/Makefile +++ b/tools/testing/selftests/Makefile @@ -16,6 +16,7 @@ TARGETS +=3D exec TARGETS +=3D filesystems TARGETS +=3D filesystems/binderfs TARGETS +=3D filesystems/epoll +TARGETS +=3D filesystems/fat TARGETS +=3D firmware TARGETS +=3D fpu TARGETS +=3D ftrace diff --git a/tools/testing/selftests/filesystems/fat/Makefile b/tools/testi= ng/selftests/filesystems/fat/Makefile new file mode 100644 index 000000000000..93ee73c16828 --- /dev/null +++ b/tools/testing/selftests/filesystems/fat/Makefile @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: GPL-2.0 + +TEST_PROGS :=3D run_fat_tests.sh +TEST_GEN_PROGS_EXTENDED :=3D rename_exchange +CFLAGS +=3D -O2 -g -Wall -I../../../../usr/include/ + +include ../../lib.mk diff --git a/tools/testing/selftests/filesystems/fat/config b/tools/testing= /selftests/filesystems/fat/config new file mode 100644 index 000000000000..6cf95e787a17 --- /dev/null +++ b/tools/testing/selftests/filesystems/fat/config @@ -0,0 +1,2 @@ +CONFIG_BLK_DEV_LOOP=3Dy +CONFIG_VFAT_FS=3Dy diff --git a/tools/testing/selftests/filesystems/fat/rename_exchange.c b/to= ols/testing/selftests/filesystems/fat/rename_exchange.c new file mode 100644 index 000000000000..e488ad354fce --- /dev/null +++ b/tools/testing/selftests/filesystems/fat/rename_exchange.c @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Program that atomically exchanges two paths using + * the renameat2() system call RENAME_EXCHANGE flag. + * + * Copyright 2022 Red Hat Inc. + * Author: Javier Martinez Canillas + */ + +#define _GNU_SOURCE +#include +#include +#include + +void print_usage(const char *program) +{ + printf("Usage: %s [oldpath] [newpath]\n", program); + printf("Atomically exchange oldpath and newpath\n"); +} + +int main(int argc, char *argv[]) +{ + int ret; + + if (argc !=3D 3) { + print_usage(argv[0]); + exit(EXIT_FAILURE); + } + + ret =3D renameat2(AT_FDCWD, argv[1], AT_FDCWD, argv[2], RENAME_EXCHANGE); + if (ret) { + perror("rename exchange failed"); + exit(EXIT_FAILURE); + } + + exit(EXIT_SUCCESS); +} diff --git a/tools/testing/selftests/filesystems/fat/run_fat_tests.sh b/too= ls/testing/selftests/filesystems/fat/run_fat_tests.sh new file mode 100755 index 000000000000..8db49624409f --- /dev/null +++ b/tools/testing/selftests/filesystems/fat/run_fat_tests.sh @@ -0,0 +1,80 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +# +# Run filesystem operations tests on an 1 MiB disk image that is formatted= with +# a vfat filesystem and mounted in a temporary directory using a loop devi= ce. +# +# Copyright 2022 Red Hat Inc. +# Author: Javier Martinez Canillas + +set -e +set -u +set -o pipefail + +BASE_DIR=3D"$(dirname $0)" +TMP_DIR=3D"$(mktemp -d /tmp/fat_tests_tmp.XXXX)" +IMG_PATH=3D"${TMP_DIR}/fat.img" +MNT_PATH=3D"${TMP_DIR}/mnt" + +cleanup() +{ + mountpoint -q "${MNT_PATH}" && unmount_image + rm -rf "${TMP_DIR}" +} +trap cleanup SIGINT SIGTERM EXIT + +create_loopback() +{ + touch "${IMG_PATH}" + chattr +C "${IMG_PATH}" >/dev/null 2>&1 || true + + truncate -s 1M "${IMG_PATH}" + mkfs.vfat "${IMG_PATH}" >/dev/null 2>&1 +} + +mount_image() +{ + mkdir -p "${MNT_PATH}" + sudo mount -o loop "${IMG_PATH}" "${MNT_PATH}" +} + +rename_exchange_test() +{ + local rename_exchange=3D"${BASE_DIR}/rename_exchange" + local old_path=3D"${MNT_PATH}/old_file" + local new_path=3D"${MNT_PATH}/new_file" + + echo old | sudo tee "${old_path}" >/dev/null 2>&1 + echo new | sudo tee "${new_path}" >/dev/null 2>&1 + sudo "${rename_exchange}" "${old_path}" "${new_path}" >/dev/null 2>&1 + grep new "${old_path}" >/dev/null 2>&1 + grep old "${new_path}" >/dev/null 2>&1 +} + +rename_exchange_subdir_test() +{ + local rename_exchange=3D"${BASE_DIR}/rename_exchange" + local dir_path=3D"${MNT_PATH}/subdir" + local old_path=3D"${MNT_PATH}/old_file" + local new_path=3D"${dir_path}/new_file" + + sudo mkdir -p "${dir_path}" + echo old | sudo tee "${old_path}" >/dev/null 2>&1 + echo new | sudo tee "${new_path}" >/dev/null 2>&1 + sudo "${rename_exchange}" "${old_path}" "${new_path}" >/dev/null 2>&1 + grep new "${old_path}" >/dev/null 2>&1 + grep old "${new_path}" >/dev/null 2>&1 +} + +unmount_image() +{ + sudo umount "${MNT_PATH}" &> /dev/null +} + +create_loopback +mount_image +rename_exchange_test +rename_exchange_subdir_test +unmount_image + +exit 0 --=20 2.35.1