diff options
Diffstat (limited to 'source3/smbd')
| -rw-r--r-- | source3/smbd/open.c | 6 | ||||
| -rw-r--r-- | source3/smbd/service.c | 13 | ||||
| -rw-r--r-- | source3/smbd/trans2.c | 9 | 
3 files changed, 27 insertions, 1 deletions
diff --git a/source3/smbd/open.c b/source3/smbd/open.c index 045635535f..9b4eedf432 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -3284,8 +3284,12 @@ static NTSTATUS create_file_unixpath(connection_struct *conn,  	/* Try and make a create timestamp, if required. */  	if ((info == FILE_WAS_CREATED) || (info == FILE_WAS_OVERWRITTEN)) {  		if (lp_store_create_time(SNUM(conn))) { +			struct timespec ts = smb_fname->st.st_ex_btime; +			if (!conn->hires_timestamps_avail) { +				round_timespec(&ts); +			}  			set_create_timespec_ea(conn, fsp, -				smb_fname, smb_fname->st.st_ex_btime); +				smb_fname, ts);  		}  	} diff --git a/source3/smbd/service.c b/source3/smbd/service.c index fc56105adf..6254d752a1 100644 --- a/source3/smbd/service.c +++ b/source3/smbd/service.c @@ -1015,6 +1015,19 @@ connection_struct *make_connection_snum(struct smbd_server_connection *sconn,  		goto err_root_exit;  	} +	if (smb_fname_cpath->st.st_ex_mtime.tv_nsec || +			smb_fname_cpath->st.st_ex_atime.tv_nsec || +			smb_fname_cpath->st.st_ex_ctime.tv_nsec) { +		/* If any of the normal UNIX directory timestamps +		 * have a non-zero tv_nsec component assume +		 * we can fully store hires timestamps. We need +		 * to make a runtime/share level distinction +		 * as on Linux ext3 doesn't have hires timestamps, but +		 * ext4 does, so a compile time test won't work. JRA. +		 */ +		conn->hires_timestamps_avail = true; +	} +  	string_set(&conn->origpath,conn->connectpath);  #if SOFTLINK_OPTIMISATION diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 56651b44ec..2900e764e8 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -5402,6 +5402,15 @@ NTSTATUS smb_set_file_time(connection_struct *conn,  		action &= ~FILE_NOTIFY_CHANGE_LAST_WRITE;  	} +	if (!conn->hires_timestamps_avail) { +		/* We can't store sub second timestamps +		 * on this share. Round to seconds. */ +		round_timespec(&ft->create_time); +		round_timespec(&ft->ctime); +		round_timespec(&ft->atime); +		round_timespec(&ft->mtime); +	} +  	DEBUG(5,("smb_set_filetime: actime: %s\n ",  		time_to_asc(convert_timespec_to_time_t(ft->atime))));  	DEBUG(5,("smb_set_filetime: modtime: %s\n ",  | 
