From nobody Thu Dec 29 20:56:23 2022 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4Njgfb72lrz2lFbw; Thu, 29 Dec 2022 20:56:23 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Njgfb6YSLz3kXR; Thu, 29 Dec 2022 20:56:23 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1672347383; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=q9kxt5raqGGsNph/8sGBY2s8QevtlzdaFUYTGFVJhJs=; b=W10cWpN+sg3O3kYNRjbWuyqapbCKx0TwhWR01mTiA0RtX2pgQtvZrLJCVt3G8sAEDT9eLe Ra2cy7HFMBVtibL3hz4JeuEbjxqmfJ1uNbw4h1rs3C+LcVLQE/WiSzlGtqHCrrQohp+Aah I/fZ7Om74MuDBnMVWqO6sQBRT7xz9ItjxlpqDbGH7YeTYIh2evp+BLS7naIPIumYItea7x ZY3t6pyyh6zMygsQRtm+13ajpXNzv7yJC/dLP4UM5s7+KUIF4XybkzxWrAtO4UZ/3sGnCY +l7lVyomu3gNzkUiG1KAYTNJp3XotBPZqVVSo6KOWZia/UQmJz/xUD8LoL4sMQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1672347383; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=q9kxt5raqGGsNph/8sGBY2s8QevtlzdaFUYTGFVJhJs=; b=oBG8IZnW7oNz0CYDd1xC4bdQTcDE3AHFSmMsT2vrrdCg0F5oh52MFt+ML//VuenjD37Z4F J3lbwiZC+4SfvGAXgjHfO3QJVJSXyRHg2cGYxhcSParvpY6K9Y2GxO9bTyuOjnuhoZszCV 78ypEvrf6xg+SdA6hrpUdewVWgEqFsZldCA7WDGHPmATpPC4yVcNWNLBrQJxSTRBWX1nCW 1oJDOC0sGua6zuyPQAg5xnLHxE51b56G6Q9V0h1nd0b7vAZEkEo4ifHAQ5PbYKAphQdOlC httFvVYkpkkF07UBLmb1c6EPp6cSRgOqVpY2YJj6T+pvR/H1W0PR7jtnRKB7SA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1672347383; a=rsa-sha256; cv=none; b=G0HsXyp+cIaKzcPJJH5TckxPvybWbd6adEX7V6RmMw66v+5/GSh/1aL/mGpwt9RHCMG1rz 5AeRFRqHftWx9a8JOl0+8fn4Zl98wq7eSGuH9pau0thtNeRQu4A3jf3qa3kZMZwGwRB3Kr PKxootqj/kmmKe2HZvKzyaIFWqD2k8jC29P7kkYPUsfeU8OA2E7XK/MJQyE2VgbjjZU3v2 pccuA49fmk2vOP7Y5cu5cpv+FjjDvi2LaoN7JNfa7DGDm+8xteGbtS4/18+/Rgj9LBys5M foUllDWIUIS7vk8d5fwOWSOuJXSTv92cULudyYArPecbIp9kdHBUoC1M0pKr8A== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4Njgfb5cC0zjgX; Thu, 29 Dec 2022 20:56:23 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 2BTKuNIl047437; Thu, 29 Dec 2022 20:56:23 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 2BTKuN3H047436; Thu, 29 Dec 2022 20:56:23 GMT (envelope-from git) Date: Thu, 29 Dec 2022 20:56:23 GMT Message-Id: <202212292056.2BTKuN3H047436@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: 37b9fb169686 - main - Add descrip_check_write_mp() helper List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 37b9fb169686e867987c8a1a9868f81137b9df2b Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=37b9fb169686e867987c8a1a9868f81137b9df2b commit 37b9fb169686e867987c8a1a9868f81137b9df2b Author: Konstantin Belousov AuthorDate: 2022-12-28 18:13:01 +0000 Commit: Konstantin Belousov CommitDate: 2022-12-29 20:55:39 +0000 Add descrip_check_write_mp() helper ... which verifies that given file table does not have file descriptors referencing vnodes on the specified mount point. It is up to the caller to ensure that the check is not racy. Reviewed by: mckusick Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D37896 --- sys/kern/kern_descrip.c | 23 +++++++++++++++++++++++ sys/sys/filedesc.h | 2 ++ 2 files changed, 25 insertions(+) diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index 63a7f8b2a6d7..0be59e930dd4 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -4172,6 +4172,29 @@ mountcheckdirs(struct vnode *olddp, struct vnode *newdp) vrele(olddp); } +int +descrip_check_write_mp(struct filedesc *fdp, struct mount *mp) +{ + struct file *fp; + struct vnode *vp; + int error, i; + + error = 0; + FILEDESC_SLOCK(fdp); + FILEDESC_FOREACH_FP(fdp, i, fp) { + if (fp->f_type != DTYPE_VNODE || + (atomic_load_int(&fp->f_flag) & FWRITE) == 0) + continue; + vp = fp->f_vnode; + if (vp->v_mount == mp) { + error = EDEADLK; + break; + } + } + FILEDESC_SUNLOCK(fdp); + return (error); +} + struct filedesc_to_leader * filedesc_to_leader_alloc(struct filedesc_to_leader *old, struct filedesc *fdp, struct proc *leader) diff --git a/sys/sys/filedesc.h b/sys/sys/filedesc.h index 52bd3c97a9ac..ffea8d7e0195 100644 --- a/sys/sys/filedesc.h +++ b/sys/sys/filedesc.h @@ -225,6 +225,7 @@ enum { #define falloc(td, resultfp, resultfd, flags) \ falloc_caps(td, resultfp, resultfd, flags, NULL) +struct mount; struct thread; static __inline void @@ -241,6 +242,7 @@ void filecaps_free(struct filecaps *fcaps); int closef(struct file *fp, struct thread *td); void closef_nothread(struct file *fp); +int descrip_check_write_mp(struct filedesc *fdp, struct mount *mp); int dupfdopen(struct thread *td, struct filedesc *fdp, int dfd, int mode, int openerror, int *indxp); int falloc_caps(struct thread *td, struct file **resultfp, int *resultfd,