linux-api.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [man-pages PATCH] statx, inode: document the new STATX_INO_VERSION field
@ 2022-08-26 21:47 Jeff Layton
  2022-08-28 15:22 ` John Stoffel
  0 siblings, 1 reply; 3+ messages in thread
From: Jeff Layton @ 2022-08-26 21:47 UTC (permalink / raw)
  To: tytso, adilger.kernel, djwong, david, trondmy, neilb, viro,
	zohar, xiubli, chuck.lever, lczerner, jack, brauner, linux-man
  Cc: linux-api, linux-btrfs, linux-fsdevel, linux-kernel, linux-ceph,
	linux-ext4, linux-nfs, linux-xfs

We're planning to expose the inode change attribute via statx. Document
what this value means and what an observer can infer from a change in
its value.

Signed-off-by: Jeff Layton <jlayton@kernel.org>
---
 man2/statx.2 | 13 +++++++++++++
 man7/inode.7 | 10 ++++++++++
 2 files changed, 23 insertions(+)

diff --git a/man2/statx.2 b/man2/statx.2
index 0d1b4591f74c..644fb251f114 100644
--- a/man2/statx.2
+++ b/man2/statx.2
@@ -62,6 +62,7 @@ struct statx {
     __u32 stx_dev_major;   /* Major ID */
     __u32 stx_dev_minor;   /* Minor ID */
     __u64 stx_mnt_id;      /* Mount ID */
+    __u64 stx_ino_version; /* Inode change attribute */
 };
 .EE
 .in
@@ -247,6 +248,7 @@ STATX_BTIME	Want stx_btime
 STATX_ALL	The same as STATX_BASIC_STATS | STATX_BTIME.
 	It is deprecated and should not be used.
 STATX_MNT_ID	Want stx_mnt_id (since Linux 5.8)
+STATX_INO_VERSION	Want stx_ino_version (since Linux 6.1)
 .TE
 .in
 .PP
@@ -411,6 +413,17 @@ and corresponds to the number in the first field in one of the records in
 For further information on the above fields, see
 .BR inode (7).
 .\"
+.TP
+.I stx_ino_version
+The inode version, also known as the inode change attribute. This
+value is intended to change any time there is an inode status change. Any
+operation that would cause the stx_ctime to change should also cause
+stx_ino_version to change, even when there is no apparent change to the
+stx_ctime due to timestamp granularity.
+.IP
+Note that an observer cannot infer anything about the nature or
+magnitude of the change from the value of this field. A change in this value
+only indicates that there may have been an explicit change in the inode.
 .SS File attributes
 The
 .I stx_attributes
diff --git a/man7/inode.7 b/man7/inode.7
index 9b255a890720..d296bb6df70c 100644
--- a/man7/inode.7
+++ b/man7/inode.7
@@ -184,6 +184,16 @@ Last status change timestamp (ctime)
 This is the file's last status change timestamp.
 It is changed by writing or by setting inode information
 (i.e., owner, group, link count, mode, etc.).
+.TP
+Inode version (i_version)
+(not returned in the \fIstat\fP structure); \fIstatx.stx_ino_version\fP
+.IP
+This is the inode change attribute. Any operation that would result in a ctime
+change should also result in a change to this value. The value must change even
+in the case where the ctime change is not evident due to timestamp granularity.
+An observer cannot infer anything from the actual value about the nature or
+magnitude of the change. If it is different from the last time it was checked,
+then something may have made an explicit change to the inode.
 .PP
 The timestamp fields report time measured with a zero point at the
 .IR Epoch ,
-- 
2.37.2


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [man-pages PATCH] statx, inode: document the new STATX_INO_VERSION field
  2022-08-26 21:47 [man-pages PATCH] statx, inode: document the new STATX_INO_VERSION field Jeff Layton
@ 2022-08-28 15:22 ` John Stoffel
  2022-08-29 12:37   ` Jeff Layton
  0 siblings, 1 reply; 3+ messages in thread
From: John Stoffel @ 2022-08-28 15:22 UTC (permalink / raw)
  To: Jeff Layton
  Cc: tytso, adilger.kernel, djwong, david, trondmy, neilb, viro,
	zohar, xiubli, chuck.lever, lczerner, jack, brauner, linux-man,
	linux-api, linux-btrfs, linux-fsdevel, linux-kernel, linux-ceph,
	linux-ext4, linux-nfs, linux-xfs

>>>>> "Jeff" == Jeff Layton <jlayton@kernel.org> writes:

Jeff> We're planning to expose the inode change attribute via statx. Document
Jeff> what this value means and what an observer can infer from a change in
Jeff> its value.

It might be nice to put in some more example verbiage of how this
would be used by userland.  For example, if you do a statx() call and
notice that the ino_version has changed... what would you do next to
find out what changed?  

Would you have to keep around an old copy of the statx() results and
then compare them to find the changes?  When talking to userland
people, don't assume they know anything about the kernel internals
here.  


Jeff> Signed-off-by: Jeff Layton <jlayton@kernel.org>
Jeff> ---
Jeff>  man2/statx.2 | 13 +++++++++++++
Jeff>  man7/inode.7 | 10 ++++++++++
Jeff>  2 files changed, 23 insertions(+)

Jeff> diff --git a/man2/statx.2 b/man2/statx.2
Jeff> index 0d1b4591f74c..644fb251f114 100644
Jeff> --- a/man2/statx.2
Jeff> +++ b/man2/statx.2
Jeff> @@ -62,6 +62,7 @@ struct statx {
Jeff>      __u32 stx_dev_major;   /* Major ID */
Jeff>      __u32 stx_dev_minor;   /* Minor ID */
Jeff>      __u64 stx_mnt_id;      /* Mount ID */
Jeff> +    __u64 stx_ino_version; /* Inode change attribute */
Jeff>  };
Jeff>  .EE
Jeff>  .in
Jeff> @@ -247,6 +248,7 @@ STATX_BTIME	Want stx_btime
Jeff>  STATX_ALL	The same as STATX_BASIC_STATS | STATX_BTIME.
Jeff>  	It is deprecated and should not be used.
Jeff>  STATX_MNT_ID	Want stx_mnt_id (since Linux 5.8)
Jeff> +STATX_INO_VERSION	Want stx_ino_version (since Linux 6.1)
Jeff>  .TE
Jeff>  .in
Jeff>  .PP
Jeff> @@ -411,6 +413,17 @@ and corresponds to the number in the first field in one of the records in
Jeff>  For further information on the above fields, see
Jeff>  .BR inode (7).
Jeff>  .\"
Jeff> +.TP
Jeff> +.I stx_ino_version
Jeff> +The inode version, also known as the inode change attribute. This
Jeff> +value is intended to change any time there is an inode status change. Any
Jeff> +operation that would cause the stx_ctime to change should also cause
Jeff> +stx_ino_version to change, even when there is no apparent change to the
Jeff> +stx_ctime due to timestamp granularity.
Jeff> +.IP
Jeff> +Note that an observer cannot infer anything about the nature or
Jeff> +magnitude of the change from the value of this field. A change in this value
Jeff> +only indicates that there may have been an explicit change in the inode.
Jeff>  .SS File attributes
Jeff>  The
Jeff>  .I stx_attributes
Jeff> diff --git a/man7/inode.7 b/man7/inode.7
Jeff> index 9b255a890720..d296bb6df70c 100644
Jeff> --- a/man7/inode.7
Jeff> +++ b/man7/inode.7
Jeff> @@ -184,6 +184,16 @@ Last status change timestamp (ctime)
Jeff>  This is the file's last status change timestamp.
Jeff>  It is changed by writing or by setting inode information
Jeff>  (i.e., owner, group, link count, mode, etc.).
Jeff> +.TP
Jeff> +Inode version (i_version)
Jeff> +(not returned in the \fIstat\fP structure); \fIstatx.stx_ino_version\fP
Jeff> +.IP
Jeff> +This is the inode change attribute. Any operation that would result in a ctime
Jeff> +change should also result in a change to this value. The value must change even
Jeff> +in the case where the ctime change is not evident due to timestamp granularity.
Jeff> +An observer cannot infer anything from the actual value about the nature or
Jeff> +magnitude of the change. If it is different from the last time it was checked,
Jeff> +then something may have made an explicit change to the inode.
Jeff>  .PP
Jeff>  The timestamp fields report time measured with a zero point at the
Jeff>  .IR Epoch ,
Jeff> -- 
Jeff> 2.37.2


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [man-pages PATCH] statx, inode: document the new STATX_INO_VERSION field
  2022-08-28 15:22 ` John Stoffel
@ 2022-08-29 12:37   ` Jeff Layton
  0 siblings, 0 replies; 3+ messages in thread
From: Jeff Layton @ 2022-08-29 12:37 UTC (permalink / raw)
  To: John Stoffel
  Cc: tytso, adilger.kernel, djwong, david, trondmy, neilb, viro,
	zohar, xiubli, chuck.lever, lczerner, jack, brauner, linux-man,
	linux-api, linux-btrfs, linux-fsdevel, linux-kernel, linux-ceph,
	linux-ext4, linux-nfs, linux-xfs

On Sun, 2022-08-28 at 11:22 -0400, John Stoffel wrote:
> > > > > > "Jeff" == Jeff Layton <jlayton@kernel.org> writes:
> 
> Jeff> We're planning to expose the inode change attribute via statx.
> Document
> Jeff> what this value means and what an observer can infer from a
> change in
> Jeff> its value.
> 
> It might be nice to put in some more example verbiage of how this
> would be used by userland.  For example, if you do a statx() call and
> notice that the ino_version has changed... what would you do next to
> find out what changed?  
> 
> Would you have to keep around an old copy of the statx() results and
> then compare them to find the changes?  When talking to userland
> people, don't assume they know anything about the kernel internals
> here.  
> 

How you'd use this really depends on the application, but yes, you'd
need to at least know what an old stx_ino_version was in order to detect
that there has been a change to it.

Today, i_version is mostly of use for knowing when you should invalidate
cached file info. Think of it as something like ctime, but with infinite
granularity. If it changes then something substantive _might_ have
changed in the inode. It's possible it's nothing your application cares
about, so you'd likely have to deal with "false" changes to this anyway.

In the case of NFS, it will invalidate its data and metadata caches when
this value changes. This is why this why false iversion bumps are so
expensive for NFS, particularly if you're dealing with large files.
Everything has to be re-fetched from the server when it changes.

In the case of IMA, it will re-measure the data in the inode to make
sure that it hasn't changed. That involves reading the whole file in and
running a checksum over it.

You could envision a backup tool using this to do incremental backups,
for instance. Keep a db of stx_ino:stx_ino_version for the files and you
could scan a filesystem and see which files need their backups updated.

Or, use it as a way to do stable file copies: Get the stx_ino_version
for a file, copy it somewhere and then get the stx_ino_version again.
Did it change? Redo the copy. That might be a nice option to add to
rsync, actually.

> 
> Jeff> Signed-off-by: Jeff Layton <jlayton@kernel.org>
> Jeff> ---
> Jeff>  man2/statx.2 | 13 +++++++++++++
> Jeff>  man7/inode.7 | 10 ++++++++++
> Jeff>  2 files changed, 23 insertions(+)
> 
> Jeff> diff --git a/man2/statx.2 b/man2/statx.2
> Jeff> index 0d1b4591f74c..644fb251f114 100644
> Jeff> --- a/man2/statx.2
> Jeff> +++ b/man2/statx.2
> Jeff> @@ -62,6 +62,7 @@ struct statx {
> Jeff>      __u32 stx_dev_major;   /* Major ID */
> Jeff>      __u32 stx_dev_minor;   /* Minor ID */
> Jeff>      __u64 stx_mnt_id;      /* Mount ID */
> Jeff> +    __u64 stx_ino_version; /* Inode change attribute */
> Jeff>  };
> Jeff>  .EE
> Jeff>  .in
> Jeff> @@ -247,6 +248,7 @@ STATX_BTIME	Want stx_btime
> Jeff>  STATX_ALL	The same as STATX_BASIC_STATS | STATX_BTIME.
> Jeff>  	It is deprecated and should not be used.
> Jeff>  STATX_MNT_ID	Want stx_mnt_id (since Linux 5.8)
> Jeff> +STATX_INO_VERSION	Want stx_ino_version (since Linux
> 6.1)
> Jeff>  .TE
> Jeff>  .in
> Jeff>  .PP
> Jeff> @@ -411,6 +413,17 @@ and corresponds to the number in the first
> field in one of the records in
> Jeff>  For further information on the above fields, see
> Jeff>  .BR inode (7).
> Jeff>  .\"
> Jeff> +.TP
> Jeff> +.I stx_ino_version
> Jeff> +The inode version, also known as the inode change attribute.
> This
> Jeff> +value is intended to change any time there is an inode status
> change. Any
> Jeff> +operation that would cause the stx_ctime to change should also
> cause
> Jeff> +stx_ino_version to change, even when there is no apparent
> change to the
> Jeff> +stx_ctime due to timestamp granularity.
> Jeff> +.IP
> Jeff> +Note that an observer cannot infer anything about the nature or
> Jeff> +magnitude of the change from the value of this field. A change
> in this value
> Jeff> +only indicates that there may have been an explicit change in
> the inode.
> Jeff>  .SS File attributes
> Jeff>  The
> Jeff>  .I stx_attributes
> Jeff> diff --git a/man7/inode.7 b/man7/inode.7
> Jeff> index 9b255a890720..d296bb6df70c 100644
> Jeff> --- a/man7/inode.7
> Jeff> +++ b/man7/inode.7
> Jeff> @@ -184,6 +184,16 @@ Last status change timestamp (ctime)
> Jeff>  This is the file's last status change timestamp.
> Jeff>  It is changed by writing or by setting inode information
> Jeff>  (i.e., owner, group, link count, mode, etc.).
> Jeff> +.TP
> Jeff> +Inode version (i_version)
> Jeff> +(not returned in the \fIstat\fP structure);
> \fIstatx.stx_ino_version\fP
> Jeff> +.IP
> Jeff> +This is the inode change attribute. Any operation that would
> result in a ctime
> Jeff> +change should also result in a change to this value. The value
> must change even
> Jeff> +in the case where the ctime change is not evident due to
> timestamp granularity.
> Jeff> +An observer cannot infer anything from the actual value about
> the nature or
> Jeff> +magnitude of the change. If it is different from the last time
> it was checked,
> Jeff> +then something may have made an explicit change to the inode.
> Jeff>  .PP
> Jeff>  The timestamp fields report time measured with a zero point at
> the
> Jeff>  .IR Epoch ,
> Jeff> -- 
> Jeff> 2.37.2
> 

-- 
Jeff Layton <jlayton@kernel.org>

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2022-08-29 12:51 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-26 21:47 [man-pages PATCH] statx, inode: document the new STATX_INO_VERSION field Jeff Layton
2022-08-28 15:22 ` John Stoffel
2022-08-29 12:37   ` Jeff Layton

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).