Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp9594007rwd; Wed, 21 Jun 2023 09:15:24 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7Yt+/bt/+A/mtNi8fV9ZdJWWIqBt4lsoFKkzzx0kvsovnvaZNDI5zuR6x8Q/PE5zWDJe3B X-Received: by 2002:a17:902:82c5:b0:1b0:6c3:e851 with SMTP id u5-20020a17090282c500b001b006c3e851mr10964229plz.18.1687364123643; Wed, 21 Jun 2023 09:15:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1687364123; cv=none; d=google.com; s=arc-20160816; b=gjPOEeds4JlvH0oNKDW2NNZYJDafagKdRts9oJ6kj89nq4yhtoJFfEmE+Q7WVu5vZ7 EIYzHhb8ZySZVvdt6pIirTpiWMAvRAUr4x2hGZOSQlsp5i4Hq5+pf+xcd7EE5xcUDAU+ mxEgDWD478vpDRN5IESdAo10uRACJ14Gu8C0Z+5ogSgo8f371hGYhkZ8hOKrsv/H1rxw TFCJDHO7nCJXCLXLLUWD5GsWqnGWKG87vRI2VlVpPrwuwCl328/HEbKqigUaLWfOr+/C 1PsHwyXdnG6l+4a2076GWGyT03bC/fj/8s+v5V8tefMoCpNzNtMJ8sifsC5X/kLVGp4k CXGA== 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=E2ffYzY+NLviIbJWs/b47Qxtu1PCv/M9VOSMErw+FQU=; b=r1wYNqdTiY3kEUkJ1m+UCo7iFXKtd4L0/W8AUELjK0AKUCeKHWu0PxGs2ebuvNiREX P/3FjKiJffc1iMqbqG+rT9KPllB9qKt6mQWfH9dpAsvZMTbEGAWPLuGxJmmUzw6Mbg0P lSaS56UHcWewnQgVNtVUSG3vHwPRSGC08LrdVcMvzINIqtjL1WX9R5cy8OI1gk91r/UN oYwiBJ/g9haQwJWHADTMLVRUF8yI89xRtOzfIUhc2KMwWXYZoYjdf90NzpLoIWlqt050 ugGqh5xfev31j6XcH6wDBS4GZ22WG5+eTTJLI/Xc72aTy0avQnnnNpeiiQLzMkixxmf1 cC6A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@yandex.ru header.s=mail header.b=gZ5mWM39; 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=yandex.ru Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id jo10-20020a170903054a00b001a97e24eb34si4200713plb.201.2023.06.21.09.15.10; Wed, 21 Jun 2023 09:15:23 -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=@yandex.ru header.s=mail header.b=gZ5mWM39; 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=yandex.ru Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233366AbjFUPaJ (ORCPT + 99 others); Wed, 21 Jun 2023 11:30:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37388 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233464AbjFUP37 (ORCPT ); Wed, 21 Jun 2023 11:29:59 -0400 Received: from forward204a.mail.yandex.net (forward204a.mail.yandex.net [178.154.239.89]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B47E591; Wed, 21 Jun 2023 08:29:57 -0700 (PDT) Received: from forward101a.mail.yandex.net (forward101a.mail.yandex.net [IPv6:2a02:6b8:c0e:500:1:45:d181:d101]) by forward204a.mail.yandex.net (Yandex) with ESMTP id 2CFD649D3E; Wed, 21 Jun 2023 18:22:38 +0300 (MSK) Received: from mail-nwsmtp-smtp-production-main-31.vla.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-31.vla.yp-c.yandex.net [IPv6:2a02:6b8:c18:58f:0:640:3768:0]) by forward101a.mail.yandex.net (Yandex) with ESMTP id 56C6646CF4; Wed, 21 Jun 2023 18:22:33 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-31.vla.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id UMkSjYADYGk0-GjkRuaP5; Wed, 21 Jun 2023 18:22:32 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1687360952; bh=E2ffYzY+NLviIbJWs/b47Qxtu1PCv/M9VOSMErw+FQU=; h=Message-Id:Date:Cc:Subject:To:From; b=gZ5mWM39yAuSQzgfedC4TGkRkpMziuFoxUrlfshBHKf/lbqOg+MM6K8z2G1Y2EDyk J0S35a0CkWO3fVv662QTH35NwWg5srPoHi7xyYQhdq7E7DMcjYEi6BP1WD2pdg6xjG Z0Sm+rcU4ppNDzGGRvwet+6G1lplpt5dP1aEAC+I= Authentication-Results: mail-nwsmtp-smtp-production-main-31.vla.yp-c.yandex.net; dkim=pass header.i=@yandex.ru From: Stas Sergeev To: linux-kernel@vger.kernel.org Cc: Stas Sergeev , Jeff Layton , Chuck Lever , Alexander Viro , Christian Brauner , linux-fsdevel@vger.kernel.org, Shuah Khan , linux-kselftest@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH 0/2] v2: F_OFD_GETLK extension to read lock info Date: Wed, 21 Jun 2023 20:22:11 +0500 Message-Id: <20230621152214.2720319-1-stsp2@yandex.ru> X-Mailer: git-send-email 2.39.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-0.5 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,RCVD_IN_VALIDITY_RPBL,SPF_HELO_NONE, SPF_PASS,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=no 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 This extension allows to use F_UNLCK on query, which currently returns EINVAL. Instead it can be used to query the locks on a particular fd - something that is not currently possible. The basic idea is that on F_OFD_GETLK, F_UNLCK would "conflict" with (or query) any types of the lock on the same fd, and ignore any locks on other fds. Use-cases: 1. CRIU-alike scenario when you want to read the locking info from an fd for the later reconstruction. This can now be done by setting l_start and l_len to 0 to cover entire file range, and do F_OFD_GETLK. In the loop you need to advance l_start past the returned lock ranges, to eventually collect all locked ranges. 2. Implementing the lock checking/enforcing policy. Say you want to implement an "auditor" module in your program, that checks that the I/O is done only after the proper locking is applied on a file region. In this case you need to know if the particular region is locked on that fd, and if so - with what type of the lock. If you would do that currently (without this extension) then you can only check for the write locks, and for that you need to probe the lock on your fd and then open the same file via another fd and probe there. That way you can identify the write lock on a particular fd, but such trick is non-atomic and complex. As for finding out the read lock on a particular fd - impossible. This extension allows to do such queries without any extra efforts. 3. Implementing the mandatory locking policy. Suppose you want to make a policy where the write lock inhibits any unlocked readers and writers. Currently you need to check if the write lock is present on some other fd, and if it is not there - allow the I/O operation. But because the write lock can appear at any moment, you need to do that under some global lock, which can be released only when the I/O operation is finished. With the proposed extension you can instead just check the write lock on your own fd first, and if it is there - allow the I/O operation on that fd without using any global lock. Only if there is no write lock on this fd, then you need to take global lock and check for a write lock on other fds. The second patch adds a test-case for OFD locks. It tests both the generic things and the proposed extension. The third patch is a proposed man page update for fcntl(2) (not for the linux source tree) Changes in v2: - Dropped the l_pid extension patch and updated test-case accordingly. Stas Sergeev (2): fs/locks: F_UNLCK extension for F_OFD_GETLK selftests: add OFD lock tests fs/locks.c | 23 +++- tools/testing/selftests/locking/Makefile | 2 + tools/testing/selftests/locking/ofdlocks.c | 132 +++++++++++++++++++++ 3 files changed, 154 insertions(+), 3 deletions(-) create mode 100644 tools/testing/selftests/locking/ofdlocks.c CC: Jeff Layton CC: Chuck Lever CC: Alexander Viro CC: Christian Brauner CC: linux-fsdevel@vger.kernel.org CC: linux-kernel@vger.kernel.org CC: Shuah Khan CC: linux-kselftest@vger.kernel.org CC: linux-api@vger.kernel.org -- 2.39.2