Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp29859859rwd; Wed, 5 Jul 2023 19:30:58 -0700 (PDT) X-Google-Smtp-Source: APBJJlG1lNyOgXMZQWpHwFahn7Thl3C6hF/Qy//LnxZxn+fgfliEvNX8jtjk4PL6MlQXsXb6goLr X-Received: by 2002:a25:6910:0:b0:c61:a522:6777 with SMTP id e16-20020a256910000000b00c61a5226777mr1044291ybc.50.1688610658089; Wed, 05 Jul 2023 19:30:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1688610658; cv=none; d=google.com; s=arc-20160816; b=Pnwm0fh9ZNryoEwAn/rvI+hwtQ5MImYIRK4uw71Q2hV+5IIq9LLQ5uksXxSH6F9MRE X+HT7ryQKef+I1fh+LdPfnXG9ERyQW+iS1Fp0Lv0rhibg8f4M0mCZjoD3dF4TfbwvMa1 xd+j4mUkS6JEScSFHGNjuhyk8rFHdh13IPQ88Hcpm2eXqabzlTMTZfkdOcYQ2kn/Lfnn XYQ4sClhmQZBbbZLrkcNBGCymSPSFgSJhvZTW8OJU3dpiAQxYYFs8slHoLD7395q4HdU 8chZEjVgfxxUsdvLEz1uP2aEF0gi5sE6HvFFxOlAWX/DQSjQrYbN8Xt/ExkqkmJ8Cc2Z Jq4A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=fGvu5z4a31Ssw4eZs4SnqP1D9TYmwqNiigGDm4gmwxI=; fh=5/tJX5opFV5w1frY3pTlI79vDLVOntPbYwD9w+dLvhs=; b=Kvd58cS/7lXQuRJVxsJ5Ioz2O9Pw01UmdHxMCwG0uRI3w6pk4CCDqolrCsPuHCFjtg NE8lRrD66Trzu6mGWf4YnlAHzozsfpO/J1YN4YQMr3tmB3eCpKOvENzuFWwh50KgNgVJ Cw6DsaGCWUdd62nI1fWY0QkOGt5s05tMI59ePriSOOmfhn6MltBpcN3itvxID5zOO/Hd bqswbnZEWqYa21lmtLG9E8K4FgLaobNgOPTtQZItxNYoSONE53OdELaFkTanWguruNzw wUsbBht6u6egJqg0CCOXOZ1fIqWkMXJ6+QxOvhhI7DysLQqbTkTzDFTz2O0IzgljI20E LXNQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=JKFbxrMt; 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 s37-20020a632165000000b0051b1966e6b6si477868pgm.521.2023.07.05.19.30.45; Wed, 05 Jul 2023 19:30:58 -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=JKFbxrMt; 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 S232740AbjGFCGj (ORCPT + 99 others); Wed, 5 Jul 2023 22:06:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57522 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232731AbjGFCGg (ORCPT ); Wed, 5 Jul 2023 22:06:36 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 63DC61BF0 for ; Wed, 5 Jul 2023 19:06:22 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 9B0E76181E for ; Thu, 6 Jul 2023 02:06:21 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id CDE69C433C7; Thu, 6 Jul 2023 02:06:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1688609181; bh=iwuSru53wlGdhxWaHtyELnJ/GKgelakvMYZf6Rep1b4=; h=From:To:Cc:Subject:Date:From; b=JKFbxrMt/mE2WXgdMg0XGZXYtLCCczvhrwVrEMVa2fO+vZLCVfVrfK+FrGta6RKjl kWNvznbJ+ZBT4TDn3jbTm5vICLLlQ74nA3oZWcsMSFfUpj0zaBzPIC2OsBbaMSZOjK K7BU2QTfF/HrZwRXG16rM2RFy3r3XU7b6i2SAznCh5MthvS1ULxPDls4c1JMH6Fm8R sZWZbO6UvmAfjuynAJdbhdQLZK65ePuhy9bYAIZKWZwJ64jMB4JMQulExORDVAP/as ITglnMvaAs2ZvwqCerDF3xoV9fmODThb8QswxnrI5zmUMdYj4QIvDJptawWfPNgQal L62k2zZAmRQDw== From: Chao Yu To: jaegeuk@kernel.org Cc: linux-f2fs-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org, Chao Yu Subject: [PATCH v3] f2fs: fix to avoid mmap vs set_compress_option case Date: Thu, 6 Jul 2023 10:06:14 +0800 Message-Id: <20230706020614.2950782-1-chao@kernel.org> X-Mailer: git-send-email 2.40.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, 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 Compression option in inode should not be changed after they have been used, however, it may happen in below race case: Thread A Thread B - f2fs_ioc_set_compress_option - check f2fs_is_mmap_file() - check get_dirty_pages() - check F2FS_HAS_BLOCKS() - f2fs_file_mmap - set_inode_flag(FI_MMAP_FILE) - fault - do_page_mkwrite - f2fs_vm_page_mkwrite - f2fs_get_block_locked - fault_dirty_shared_page - set_page_dirty - update i_compress_algorithm - update i_log_cluster_size - update i_cluster_size Avoid such race condition by covering f2fs_file_mmap() w/ i_sem lock, meanwhile add mmap file check condition in f2fs_may_compress() as well. Fixes: e1e8debec656 ("f2fs: add F2FS_IOC_SET_COMPRESS_OPTION ioctl") Signed-off-by: Chao Yu --- v3: - fix potential deadlock. fs/f2fs/f2fs.h | 3 ++- fs/f2fs/file.c | 23 ++++++++++++++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index c7cb2177b252..d372bedb0fe4 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -4483,7 +4483,8 @@ static inline bool f2fs_low_mem_mode(struct f2fs_sb_info *sbi) static inline bool f2fs_may_compress(struct inode *inode) { if (IS_SWAPFILE(inode) || f2fs_is_pinned_file(inode) || - f2fs_is_atomic_file(inode) || f2fs_has_inline_data(inode)) + f2fs_is_atomic_file(inode) || f2fs_has_inline_data(inode) || + f2fs_is_mmap_file(inode)) return false; return S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode); } diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 093039dee992..d9073afe021f 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -526,7 +526,11 @@ static int f2fs_file_mmap(struct file *file, struct vm_area_struct *vma) file_accessed(file); vma->vm_ops = &f2fs_file_vm_ops; + + f2fs_down_read(&F2FS_I(inode)->i_sem); set_inode_flag(inode, FI_MMAP_FILE); + f2fs_up_read(&F2FS_I(inode)->i_sem); + return 0; } @@ -1919,12 +1923,19 @@ static int f2fs_setflags_common(struct inode *inode, u32 iflags, u32 mask) int err = f2fs_convert_inline_inode(inode); if (err) return err; - if (!f2fs_may_compress(inode)) - return -EINVAL; - if (S_ISREG(inode->i_mode) && F2FS_HAS_BLOCKS(inode)) + + f2fs_down_write(&F2FS_I(inode)->i_sem); + if (!f2fs_may_compress(inode) || + (S_ISREG(inode->i_mode) && + F2FS_HAS_BLOCKS(inode))) { + f2fs_up_write(&F2FS_I(inode)->i_sem); return -EINVAL; - if (set_compress_context(inode)) - return -EOPNOTSUPP; + } + err = set_compress_context(inode); + f2fs_up_write(&F2FS_I(inode)->i_sem); + + if (err) + return err; } } @@ -3976,6 +3987,7 @@ static int f2fs_ioc_set_compress_option(struct file *filp, unsigned long arg) file_start_write(filp); inode_lock(inode); + f2fs_down_write(&F2FS_I(inode)->i_sem); if (f2fs_is_mmap_file(inode) || get_dirty_pages(inode)) { ret = -EBUSY; goto out; @@ -3995,6 +4007,7 @@ static int f2fs_ioc_set_compress_option(struct file *filp, unsigned long arg) f2fs_warn(sbi, "compression algorithm is successfully set, " "but current kernel doesn't support this algorithm."); out: + f2fs_up_write(&F2FS_I(inode)->i_sem); inode_unlock(inode); file_end_write(filp); -- 2.25.1