Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1619373 > unrolled thread
| Started by | Deepa Dinamani <deepa.kernel@gmail.com> |
|---|---|
| First post | 2017-04-08 21:40 +0200 |
| Last post | 2017-04-08 21:50 +0200 |
| Articles | 4 — 1 participant |
Back to article view | Back to linux.kernel
[PATCH v5 0/5] vfs: Add timestamp range check support Deepa Dinamani <deepa.kernel@gmail.com> - 2017-04-08 21:40 +0200
[PATCH v5 5/5] utimes: Clamp the timestamps before update Deepa Dinamani <deepa.kernel@gmail.com> - 2017-04-08 21:50 +0200
[PATCH v5 3/5] ext4: Initialize timestamps limits Deepa Dinamani <deepa.kernel@gmail.com> - 2017-04-08 21:50 +0200
[PATCH v5 1/5] vfs: Add file timestamp range support Deepa Dinamani <deepa.kernel@gmail.com> - 2017-04-08 21:50 +0200
| From | Deepa Dinamani <deepa.kernel@gmail.com> |
|---|---|
| Date | 2017-04-08 21:40 +0200 |
| Subject | [PATCH v5 0/5] vfs: Add timestamp range check support |
| Message-ID | <tu4nf-13d-3@gated-at.bofh.it> |
The series is aimed at adding timestamp checking and policy related to it to vfs. The series was developed with discussions and guidance from Arnd Bergmann. The original thread is at https://lkml.org/lkml/2016/11/2/294 Associated test: xfstests generic/402 Note that the above test will be run and will fail all filesystems that do not have correct limits specified in the xfstests or the kernel or that don't support times beyond the test dates. I will be submitting a follow up xfstest and kernel patches to update all filesystems. Currently ext4 is the only filesystem that reflects correct limits. The branch is available at https://github.com/deepa-hub/vfs.git refs/heads/vfs_timestamp_policy Changes since v4: * Added documentation for boot param Changes since v3: * Remove redundant initializations in libfs.c * Change early_param to __setup similar to other root mount options. * Fix documentation warning Changes since v2: * Introduce early boot param override for checks. * Drop afs patch for timestamp limits. Changes since v1: * return EROFS on mount errors * fix mtime copy/paste error in utimes Deepa Dinamani (5): vfs: Add file timestamp range support vfs: Add checks for filesystem timestamp limits ext4: Initialize timestamps limits vfs: Add timestamp_truncate() api utimes: Clamp the timestamps before update Documentation/admin-guide/kernel-parameters.txt | 8 +++++ fs/ext4/ext4.h | 4 +++ fs/ext4/super.c | 7 +++- fs/inode.c | 47 ++++++++++++++++++++++++- fs/internal.h | 2 ++ fs/namespace.c | 12 +++++++ fs/super.c | 9 +++++ fs/utimes.c | 17 ++++++--- include/linux/fs.h | 4 +++ include/linux/time64.h | 6 ++++ include/uapi/linux/fs.h | 6 +++- kernel/sysctl.c | 7 ++++ 12 files changed, 122 insertions(+), 7 deletions(-) -- 2.7.4
[toc] | [next] | [standalone]
| From | Deepa Dinamani <deepa.kernel@gmail.com> |
|---|---|
| Date | 2017-04-08 21:50 +0200 |
| Subject | [PATCH v5 5/5] utimes: Clamp the timestamps before update |
| Message-ID | <tu4wV-16S-3@gated-at.bofh.it> |
| In reply to | #1619373 |
POSIX.1 section for futimens, utimensat and utimes says:
The file's relevant timestamp shall be set to the
greatest value supported by the file system that is
not greater than the specified time.
Clamp the timestamps accordingly before assignment.
Note that the clamp_t macro is used for clamping here as vfs
is not yet using struct timespec64 internally. This is
required for compilation purposes.
Also note that clamp won't do the right thing for timestamps
beyond 2038 on 32-bit machines until the vfs uses timespec64.
After the vfs is transitioned to use timespec64 for timestamps,
clamp_t() can be replaced by clamp().
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
---
fs/utimes.c | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/fs/utimes.c b/fs/utimes.c
index 32b15b3..052fe5d 100644
--- a/fs/utimes.c
+++ b/fs/utimes.c
@@ -53,6 +53,7 @@ static int utimes_common(const struct path *path, struct timespec *times)
int error;
struct iattr newattrs;
struct inode *inode = path->dentry->d_inode;
+ struct super_block *sb = inode->i_sb;
struct inode *delegated_inode = NULL;
error = mnt_want_write(path->mnt);
@@ -68,16 +69,24 @@ static int utimes_common(const struct path *path, struct timespec *times)
if (times[0].tv_nsec == UTIME_OMIT)
newattrs.ia_valid &= ~ATTR_ATIME;
else if (times[0].tv_nsec != UTIME_NOW) {
- newattrs.ia_atime.tv_sec = times[0].tv_sec;
- newattrs.ia_atime.tv_nsec = times[0].tv_nsec;
+ newattrs.ia_atime.tv_sec =
+ clamp_t(time64_t, times[0].tv_sec, sb->s_time_min, sb->s_time_max);
+ if (times[0].tv_sec >= sb->s_time_max)
+ newattrs.ia_atime.tv_nsec = 0;
+ else
+ newattrs.ia_atime.tv_nsec = times[0].tv_nsec;
newattrs.ia_valid |= ATTR_ATIME_SET;
}
if (times[1].tv_nsec == UTIME_OMIT)
newattrs.ia_valid &= ~ATTR_MTIME;
else if (times[1].tv_nsec != UTIME_NOW) {
- newattrs.ia_mtime.tv_sec = times[1].tv_sec;
- newattrs.ia_mtime.tv_nsec = times[1].tv_nsec;
+ newattrs.ia_mtime.tv_sec =
+ clamp_t(time64_t, times[1].tv_sec, sb->s_time_min, sb->s_time_max);
+ if (times[1].tv_sec >= sb->s_time_max)
+ newattrs.ia_mtime.tv_nsec = 0;
+ else
+ newattrs.ia_mtime.tv_nsec = times[1].tv_nsec;
newattrs.ia_valid |= ATTR_MTIME_SET;
}
/*
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | Deepa Dinamani <deepa.kernel@gmail.com> |
|---|---|
| Date | 2017-04-08 21:50 +0200 |
| Subject | [PATCH v5 3/5] ext4: Initialize timestamps limits |
| Message-ID | <tu4wV-16S-11@gated-at.bofh.it> |
| In reply to | #1619373 |
ext4 has different overflow limits for max filesystem
timestamps based on the extra bytes available.
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
Cc: "Theodore Ts'o" <tytso@mit.edu>
Cc: Andreas Dilger <adilger.kernel@dilger.ca>
Cc: linux-ext4@vger.kernel.org
---
fs/ext4/ext4.h | 4 ++++
fs/ext4/super.c | 7 ++++++-
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index fb69ee2..3292d4e 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -1640,6 +1640,10 @@ static inline void ext4_clear_state_flags(struct ext4_inode_info *ei)
#define EXT4_GOOD_OLD_INODE_SIZE 128
+#define EXT4_EXTRA_TIMESTAMP_MAX (((s64)1 << 34) - 1 + S32_MIN)
+#define EXT4_NON_EXTRA_TIMESTAMP_MAX Y2038_EXPIRY_TIMESTAMP
+#define EXT4_TIMESTAMP_MIN S32_MIN
+
/*
* Feature set definitions
*/
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 73cae0c..0c1a864 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -3687,8 +3687,13 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
sbi->s_inode_size);
goto failed_mount;
}
- if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE)
+ if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE) {
sb->s_time_gran = 1 << (EXT4_EPOCH_BITS - 2);
+ sb->s_time_max = EXT4_EXTRA_TIMESTAMP_MAX;
+ } else
+ sb->s_time_max = EXT4_NON_EXTRA_TIMESTAMP_MAX;
+
+ sb->s_time_min = EXT4_TIMESTAMP_MIN;
}
sbi->s_desc_size = le16_to_cpu(es->s_desc_size);
--
2.7.4
[toc] | [prev] | [next] | [standalone]
| From | Deepa Dinamani <deepa.kernel@gmail.com> |
|---|---|
| Date | 2017-04-08 21:50 +0200 |
| Subject | [PATCH v5 1/5] vfs: Add file timestamp range support |
| Message-ID | <tu4wV-16S-7@gated-at.bofh.it> |
| In reply to | #1619373 |
Add fields to the superblock to track the min and max
timestamps supported by filesystems.
Initially, when a superblock is allocated, initialize
it to the max and min values the fields can hold.
Individual filesystems override these to match their
actual limits.
Pseudo filesystems are assumed to always support the
min and max allowable values for the fields.
Note that the time ranges are saved in type time64_t
rather than time_t.
This is required because if we save ranges in time_t
then we would not be able to save timestamp ranges
for files that support timestamps beyond y2038.
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
---
fs/super.c | 2 ++
include/linux/fs.h | 3 +++
include/linux/time64.h | 2 ++
3 files changed, 7 insertions(+)
diff --git a/fs/super.c b/fs/super.c
index b8b6a08..f9c2241 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -247,6 +247,8 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags,
s->s_maxbytes = MAX_NON_LFS;
s->s_op = &default_op;
s->s_time_gran = 1000000000;
+ s->s_time_min = TIME64_MIN;
+ s->s_time_max = TIME64_MAX;
s->cleancache_poolid = CLEANCACHE_NO_POOL;
s->s_shrink.seeks = DEFAULT_SEEKS;
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 3c18fa6..63f83440 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1337,6 +1337,9 @@ struct super_block {
/* Granularity of c/m/atime in ns.
Cannot be worse than a second */
u32 s_time_gran;
+ /* Time limits for c/m/atime in seconds. */
+ time64_t s_time_min;
+ time64_t s_time_max;
/*
* The next field is for VFS *only*. No filesystems have any business
diff --git a/include/linux/time64.h b/include/linux/time64.h
index 980c71b..25433b18 100644
--- a/include/linux/time64.h
+++ b/include/linux/time64.h
@@ -38,6 +38,8 @@ struct itimerspec64 {
/* Located here for timespec[64]_valid_strict */
#define TIME64_MAX ((s64)~((u64)1 << 63))
+#define TIME64_MIN (-TIME64_MAX - 1)
+
#define KTIME_MAX ((s64)~((u64)1 << 63))
#define KTIME_SEC_MAX (KTIME_MAX / NSEC_PER_SEC)
--
2.7.4
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web