From 49ca690b4b22ee6e597179059c9442e94c5bd423 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 14 May 2009 15:34:42 +0200 Subject: Introduce "struct stat_ex" as a replacement for SMB_STRUCT_STAT This patch introduces struct stat_ex { dev_t st_ex_dev; ino_t st_ex_ino; mode_t st_ex_mode; nlink_t st_ex_nlink; uid_t st_ex_uid; gid_t st_ex_gid; dev_t st_ex_rdev; off_t st_ex_size; struct timespec st_ex_atime; struct timespec st_ex_mtime; struct timespec st_ex_ctime; struct timespec st_ex_btime; /* birthtime */ blksize_t st_ex_blksize; blkcnt_t st_ex_blocks; }; typedef struct stat_ex SMB_STRUCT_STAT; It is really large because due to the friendly libc headers playing macro tricks with fields like st_ino, so I renamed them to st_ex_xxx. Why this change? To support birthtime, we already have quite a few #ifdef's at places where it does not really belong. With a stat struct that we control, we can consolidate the nanosecond timestamps and the birthtime deep in the VFS stat calls. At this moment it is triggered by a request to support the birthtime field for GPFS. GPFS does not extend the system level struct stat, but instead has a separate call that gets us the additional information beyond posix. Without being able to do that within the VFS stat calls, that support would have to be scattered around the main smbd code. It will very likely break all the onefs modules, but I think the changes will be reasonably easy to do. --- source3/include/includes.h | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) (limited to 'source3/include/includes.h') diff --git a/source3/include/includes.h b/source3/include/includes.h index 596c772d9e..a2f6048c27 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -435,13 +435,32 @@ typedef uint64_t br_off; * Type for stat structure. */ -#ifndef SMB_STRUCT_STAT -# if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_STAT64) && defined(HAVE_OFF64_T) -# define SMB_STRUCT_STAT struct stat64 -# else -# define SMB_STRUCT_STAT struct stat -# endif -#endif +struct stat_ex { + dev_t st_ex_dev; + ino_t st_ex_ino; + mode_t st_ex_mode; + nlink_t st_ex_nlink; + uid_t st_ex_uid; + gid_t st_ex_gid; + dev_t st_ex_rdev; + off_t st_ex_size; + struct timespec st_ex_atime; + struct timespec st_ex_mtime; + struct timespec st_ex_ctime; + struct timespec st_ex_btime; /* birthtime */ + blksize_t st_ex_blksize; + blkcnt_t st_ex_blocks; + + /* + * Add space for VFS internal extensions. The initial user of this + * would be the onefs modules, passing the snapid from the stat calls + * to the file_id_create call. Maybe we'll have to expand this later, + * but the core of Samba should never look at this field. + */ + uint64_t vfs_private; +}; + +typedef struct stat_ex SMB_STRUCT_STAT; /* * Type for dirent structure. -- cgit From 93e16a08d46587a6eacaa05cd462ea316e9da8e4 Mon Sep 17 00:00:00 2001 From: Björn Jacke Date: Tue, 26 May 2009 22:37:17 +0200 Subject: s3: fix build on systems with struct stat member st_flags --- source3/include/includes.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'source3/include/includes.h') diff --git a/source3/include/includes.h b/source3/include/includes.h index a2f6048c27..ba3866a03a 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -450,6 +450,9 @@ struct stat_ex { struct timespec st_ex_btime; /* birthtime */ blksize_t st_ex_blksize; blkcnt_t st_ex_blocks; +#ifdef HAVE_STAT_ST_FLAGS + uint32_t st_ex_flags; +#endif /* * Add space for VFS internal extensions. The initial user of this -- cgit From 4db54fff13c2dfd1ea307faa32cf1dd34916c924 Mon Sep 17 00:00:00 2001 From: Björn Jacke Date: Tue, 26 May 2009 23:19:00 +0200 Subject: Revert "s3: fix build on systems with struct stat member st_flags" for a cleaner and more complete patch that Volker has in the queue :-) --- source3/include/includes.h | 3 --- 1 file changed, 3 deletions(-) (limited to 'source3/include/includes.h') diff --git a/source3/include/includes.h b/source3/include/includes.h index ba3866a03a..a2f6048c27 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -450,9 +450,6 @@ struct stat_ex { struct timespec st_ex_btime; /* birthtime */ blksize_t st_ex_blksize; blkcnt_t st_ex_blocks; -#ifdef HAVE_STAT_ST_FLAGS - uint32_t st_ex_flags; -#endif /* * Add space for VFS internal extensions. The initial user of this -- cgit From dd0506d15ddb01b8f6e7b6be604a3445b73db434 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 26 May 2009 22:39:50 +0200 Subject: Attempt to fix the build on NetBSD --- source3/include/includes.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'source3/include/includes.h') diff --git a/source3/include/includes.h b/source3/include/includes.h index a2f6048c27..0d66c1cd6b 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -451,6 +451,9 @@ struct stat_ex { blksize_t st_ex_blksize; blkcnt_t st_ex_blocks; + uint32_t st_ex_flags; + uint32_t st_ex_mask; + /* * Add space for VFS internal extensions. The initial user of this * would be the onefs modules, passing the snapid from the stat calls -- cgit From 3ada1a19ab1309b0435ee84844b433b06ead0196 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 26 May 2009 23:37:14 +0200 Subject: Attempt to fix the build on HP/UX --- source3/include/includes.h | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'source3/include/includes.h') diff --git a/source3/include/includes.h b/source3/include/includes.h index 0d66c1cd6b..7bb72be692 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -431,6 +431,16 @@ typedef uint64_t br_off; #define IVAL_TO_SMB_OFF_T(buf,off) ((SMB_OFF_T)(( ((uint32)(IVAL((buf),(off)))) & 0xFFFFFFFF ))) #endif +#ifndef HAVE_BLKSIZE_T +/* This is mainly for HP/UX which defines st_blksize as long */ +typedef blksize_t long; +#endif + +#ifndef HAVE_BLKCNT_T +/* This is mainly for HP/UX which doesn't have blkcnt_t */ +typedef blkcnt_t long; +#endif + /* * Type for stat structure. */ -- cgit From ab5b1431a028482e4ab65a584db6aa35979680b2 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Wed, 27 May 2009 08:09:23 +0200 Subject: Gna, how long do I program in C now??? :-) --- source3/include/includes.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/include/includes.h') diff --git a/source3/include/includes.h b/source3/include/includes.h index 7bb72be692..e468bd5c38 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -433,12 +433,12 @@ typedef uint64_t br_off; #ifndef HAVE_BLKSIZE_T /* This is mainly for HP/UX which defines st_blksize as long */ -typedef blksize_t long; +typedef long blksize_t; #endif #ifndef HAVE_BLKCNT_T /* This is mainly for HP/UX which doesn't have blkcnt_t */ -typedef blkcnt_t long; +typedef long blkcnt_t; #endif /* -- cgit