aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRick Macklem <rmacklem@FreeBSD.org>2026-07-12 22:45:28 +0000
committerRick Macklem <rmacklem@FreeBSD.org>2026-07-12 22:45:28 +0000
commit74654ba3b1b3bcf6ba8870a54310accbb6adbf0b (patch)
treeaed5adabfa29333d0ee54590a3e1507cb09a8479
parent87fb416ac8828d07fdf23a2c0d35d88efafce2af (diff)
chflags: Add a new UF_DONTCACHE flag
This internet draft (which is close to being an RFC) specifies a new NFSv4.2 attribute which tells the NFSv4.2 client to not cache file data. (Similar to O_DIRECT, but triggered by this attribute set on the file on the NFSv4.2 server and not by the application's open(2).) https://datatracker.ietf.org/doc/draft-ietf-nfsv4-uncacheable-files/ This patch adds a new chflags(1) flag called UF_DONTCACHE to implement this. Patches for NFS and ZFS will be done separately. Reviewed by: kib MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D58181
-rw-r--r--lib/libc/gen/strtofflags.c4
-rw-r--r--sys/fs/tmpfs/tmpfs_subr.c2
-rw-r--r--sys/sys/stat.h1
-rw-r--r--sys/ufs/ufs/ufs_vnops.c2
4 files changed, 6 insertions, 3 deletions
diff --git a/lib/libc/gen/strtofflags.c b/lib/libc/gen/strtofflags.c
index 73b4db54ccdd..ca12401c37e5 100644
--- a/lib/libc/gen/strtofflags.c
+++ b/lib/libc/gen/strtofflags.c
@@ -80,7 +80,9 @@ static struct {
{ "nosparse", 0, UF_SPARSE },
{ "nousparse", 0, UF_SPARSE },
{ "nosystem", 0, UF_SYSTEM },
- { "nousystem", 0, UF_SYSTEM }
+ { "nousystem", 0, UF_SYSTEM },
+ { "nodontcache", 0, UF_DONTCACHE },
+ { "noudontcache", 0, UF_DONTCACHE }
};
#define nmappings (sizeof(mapping) / sizeof(mapping[0]))
diff --git a/sys/fs/tmpfs/tmpfs_subr.c b/sys/fs/tmpfs/tmpfs_subr.c
index dd281d18d87d..c9a9a3114fb3 100644
--- a/sys/fs/tmpfs/tmpfs_subr.c
+++ b/sys/fs/tmpfs/tmpfs_subr.c
@@ -2042,7 +2042,7 @@ tmpfs_chflags(struct vnode *vp, u_long flags, struct ucred *cred,
if ((flags & ~(SF_APPEND | SF_ARCHIVED | SF_IMMUTABLE | SF_NOUNLINK |
UF_APPEND | UF_ARCHIVE | UF_HIDDEN | UF_IMMUTABLE | UF_NODUMP |
UF_NOUNLINK | UF_OFFLINE | UF_OPAQUE | UF_READONLY | UF_REPARSE |
- UF_SPARSE | UF_SYSTEM)) != 0)
+ UF_SPARSE | UF_SYSTEM | UF_DONTCACHE)) != 0)
return (EOPNOTSUPP);
/* Disallow this operation if the file system is mounted read-only. */
diff --git a/sys/sys/stat.h b/sys/sys/stat.h
index 0c58838094ed..457ec99365d2 100644
--- a/sys/sys/stat.h
+++ b/sys/sys/stat.h
@@ -327,6 +327,7 @@ struct nstat {
#define UF_REPARSE 0x00000400 /* Windows reparse point file bit */
#define UF_ARCHIVE 0x00000800 /* file needs to be archived */
#define UF_READONLY 0x00001000 /* Windows readonly file bit */
+#define UF_DONTCACHE 0x00002000 /* don't cache file data (NFSv4) */
/* This is the same as the MacOS X definition of UF_HIDDEN. */
#define UF_HIDDEN 0x00008000 /* file is hidden */
diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c
index 1d04e1b2785f..762b5bb5b5ec 100644
--- a/sys/ufs/ufs/ufs_vnops.c
+++ b/sys/ufs/ufs/ufs_vnops.c
@@ -667,7 +667,7 @@ ufs_setattr(
SF_NOUNLINK | SF_SNAPSHOT | UF_APPEND | UF_ARCHIVE |
UF_HIDDEN | UF_IMMUTABLE | UF_NODUMP | UF_NOUNLINK |
UF_OFFLINE | UF_OPAQUE | UF_READONLY | UF_REPARSE |
- UF_SPARSE | UF_SYSTEM)) != 0)
+ UF_SPARSE | UF_SYSTEM | UF_DONTCACHE)) != 0)
return (EOPNOTSUPP);
if (vp->v_mount->mnt_flag & MNT_RDONLY)
return (EROFS);