git: 85575b7e0c7d - stable/13 - getdirentries: return ENOENT for unlinked but still open directory.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 17 Jun 2022 19:39:04 UTC
The branch stable/13 has been updated by dchagin:
URL: https://cgit.FreeBSD.org/src/commit/?id=85575b7e0c7d2e722559a44c2e246991eab2f2be
commit 85575b7e0c7d2e722559a44c2e246991eab2f2be
Author: Dmitry Chagin <dchagin@FreeBSD.org>
AuthorDate: 2022-06-17 19:33:51 +0000
Commit: Dmitry Chagin <dchagin@FreeBSD.org>
CommitDate: 2022-06-17 19:33:51 +0000
getdirentries: return ENOENT for unlinked but still open directory.
To be more compatible to IEEE Std 1003.1-2008 (“POSIX.1”).
Reviewed by: mjg, Pau Amma (doc)
Differential revision: https://reviews.freebsd.org/D34680
MFC after: 2 weeks
(cherry picked from commit c6487446d7e99537551d2e51a2f6c6569fcb89fc)
---
lib/libc/sys/getdirentries.2 | 2 ++
sys/kern/vfs_subr.c | 1 +
sys/kern/vfs_syscalls.c | 4 ++++
sys/sys/vnode.h | 1 +
4 files changed, 8 insertions(+)
diff --git a/lib/libc/sys/getdirentries.2 b/lib/libc/sys/getdirentries.2
index 4185fb84f0f9..76fe18bf6edb 100644
--- a/lib/libc/sys/getdirentries.2
+++ b/lib/libc/sys/getdirentries.2
@@ -193,6 +193,8 @@ An
error occurred while reading from or writing to the file system.
.It Bq Er EINTEGRITY
Corrupted data was detected while reading from the file system.
+.It Bq Er ENOENT
+Directory unlinked but still open.
.El
.Sh SEE ALSO
.Xr lseek 2 ,
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index 753e0062e808..ca2d86385f4c 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -6021,6 +6021,7 @@ vop_rmdir_post(void *ap, int rc)
vn_seqc_write_end(dvp);
vn_seqc_write_end(vp);
if (!rc) {
+ vp->v_vflag |= VV_UNLINKED;
VFS_KNOTE_LOCKED(dvp, NOTE_WRITE | NOTE_LINK);
VFS_KNOTE_LOCKED(vp, NOTE_DELETE);
}
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index 276383fce2a0..b8f2bf4f695c 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -4176,6 +4176,10 @@ unionread:
error = EINVAL;
goto fail;
}
+ if (__predict_false((vp->v_vflag & VV_UNLINKED) != 0)) {
+ error = ENOENT;
+ goto fail;
+ }
aiov.iov_base = buf;
aiov.iov_len = count;
auio.uio_iov = &aiov;
diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h
index 92978eae8846..6d3e7eac8b23 100644
--- a/sys/sys/vnode.h
+++ b/sys/sys/vnode.h
@@ -272,6 +272,7 @@ struct xvnode {
#define VV_FORCEINSMQ 0x1000 /* force the insmntque to succeed */
#define VV_READLINK 0x2000 /* fdescfs linux vnode */
#define VV_UNREF 0x4000 /* vunref, do not drop lock in inactive() */
+#define VV_UNLINKED 0x8000 /* unlinked but stil open directory */
#define VMP_LAZYLIST 0x0001 /* Vnode is on mnt's lazy list */