Libpuffs: use struct timespec instead of time_t

This commit is contained in:
Antoine Leca 2013-04-07 10:42:26 +02:00 committed by Charlie Root
parent 9315ea8299
commit df9d28ebe7
9 changed files with 73 additions and 67 deletions

View file

@ -59,7 +59,7 @@ int fs_ftrunc(void)
if (r) return(EINVAL);
}
update_times(pn, CTIME | MTIME, 0);
update_timens(pn, CTIME | MTIME, NULL);
return(r);
}
@ -76,7 +76,7 @@ int fs_link()
char string[NAME_MAX + 1];
phys_bytes len;
struct puffs_node *pn, *pn_dir, *new_pn;
time_t cur_time;
struct timespec cur_time;
struct puffs_kcn pkcnp;
PUFFS_MAKECRED(pcr, &global_kcred);
struct puffs_cn pcn = {&pkcnp, (struct puffs_cred *) __UNCONST(pcr), {0,0,0}};
@ -141,9 +141,9 @@ int fs_link()
if (r != OK) return(EINVAL);
cur_time = clock_time();
update_times(pn, CTIME, cur_time);
update_times(pn_dir, MTIME | CTIME, cur_time);
cur_time = clock_timespec();
update_timens(pn, CTIME, &cur_time);
update_timens(pn_dir, MTIME | CTIME, &cur_time);
return(OK);
}
@ -208,7 +208,7 @@ int fs_rename()
int odir, ndir; /* TRUE iff {old|new} file is dir */
int same_pdir; /* TRUE iff parent dirs are the same */
phys_bytes len;
time_t cur_time;
struct timespec cur_time;
if (global_pu->pu_ops.puffs_node_rename == NULL)
return(EINVAL);
@ -373,9 +373,9 @@ int fs_rename()
}
rename_out:
cur_time = clock_time();
update_times(old_dirp, MTIME | CTIME, cur_time);
update_times(new_dirp, MTIME | CTIME, cur_time);
cur_time = clock_timespec();
update_timens(old_dirp, MTIME | CTIME, &cur_time);
update_timens(new_dirp, MTIME | CTIME, &cur_time);
/* XXX see release_node comment in fs_unlink */
if (new_ip && new_ip->pn_count == 0) {
@ -401,7 +401,7 @@ int fs_unlink()
*/
int r;
struct puffs_node *pn, *pn_dir;
time_t cur_time;
struct timespec cur_time;
struct puffs_kcn pkcnp;
struct puffs_cn pcn = {&pkcnp, 0, {0,0,0}};
PUFFS_KCREDTOCRED(pcn.pcn_cred, &global_kcred);
@ -447,9 +447,9 @@ int fs_unlink()
}
if (pn->pn_va.va_nlink != 0) {
cur_time = clock_time();
update_times(pn, CTIME, cur_time);
update_times(pn_dir, MTIME | CTIME, cur_time);
cur_time = clock_timespec();
update_timens(pn, CTIME, &cur_time);
update_timens(pn_dir, MTIME | CTIME, &cur_time);
}
/* XXX Ideally, we should check pn->pn_flags & PUFFS_NODE_REMOVED, but

View file

@ -27,7 +27,7 @@ int fs_create()
PUFFS_MAKECRED(pcr, &global_kcred);
struct puffs_cn pcn = {&pkcnp, (struct puffs_cred *) __UNCONST(pcr), {0,0,0}};
struct vattr va;
time_t cur_time;
struct timespec cur_time;
int len;
if (global_pu->pu_ops.puffs_node_create == NULL) {
@ -59,14 +59,14 @@ int fs_create()
memset(&pni, 0, sizeof(pni));
pni.pni_cookie = (void** )&pn;
cur_time = clock_time();
cur_time = clock_timespec();
memset(&va, 0, sizeof(va));
va.va_type = VREG;
va.va_mode = omode;
va.va_uid = caller_uid;
va.va_gid = caller_gid;
va.va_atime.tv_sec = va.va_mtime.tv_sec = va.va_ctime.tv_sec = cur_time;
va.va_atime = va.va_mtime = va.va_ctime = cur_time;
if (buildpath) {
r = puffs_path_pcnbuild(global_pu, &pcn, pn_dir);
@ -96,7 +96,7 @@ int fs_create()
/* Open pnode */
pn->pn_count++;
update_times(pn_dir, MTIME | CTIME, cur_time);
update_timens(pn_dir, MTIME | CTIME, &cur_time);
/* Reply message */
fs_m_out.RES_INODE_NR = pn->pn_va.va_fileid;
@ -124,7 +124,7 @@ int fs_mknod()
PUFFS_MAKECRED(pcr, &global_kcred);
struct puffs_cn pcn = {&pkcnp, (struct puffs_cred *) __UNCONST(pcr), {0,0,0}};
struct vattr va;
time_t cur_time;
struct timespec cur_time;
int len;
if (global_pu->pu_ops.puffs_node_mknod == NULL) {
@ -154,7 +154,7 @@ int fs_mknod()
memset(&pni, 0, sizeof(pni));
pni.pni_cookie = (void** )&pn;
cur_time = clock_time();
cur_time = clock_timespec();
memset(&va, 0, sizeof(va));
va.va_type = VDIR;
@ -162,7 +162,7 @@ int fs_mknod()
va.va_uid = caller_uid;
va.va_gid = caller_gid;
va.va_rdev = (dev_t) fs_m_in.REQ_DEV;
va.va_atime.tv_sec = va.va_mtime.tv_sec = va.va_ctime.tv_sec = cur_time;
va.va_atime = va.va_mtime = va.va_ctime = cur_time;
if (buildpath) {
if (puffs_path_pcnbuild(global_pu, &pcn, pn_dir) != 0) {
@ -188,7 +188,7 @@ int fs_mknod()
return(r);
}
update_times(pn_dir, MTIME | CTIME, cur_time);
update_timens(pn_dir, MTIME | CTIME, &cur_time);
return(OK);
}
@ -207,7 +207,7 @@ int fs_mkdir()
PUFFS_MAKECRED(pcr, &global_kcred);
struct puffs_cn pcn = {&pkcnp, (struct puffs_cred *) __UNCONST(pcr), {0,0,0}};
struct vattr va;
time_t cur_time;
struct timespec cur_time;
int len;
if (global_pu->pu_ops.puffs_node_mkdir == NULL) {
@ -234,7 +234,7 @@ int fs_mkdir()
if ((pn_dir = puffs_pn_nodewalk(global_pu, 0, &fs_m_in.REQ_INODE_NR)) == NULL)
return(ENOENT);
cur_time = clock_time();
cur_time = clock_timespec();
memset(&pni, 0, sizeof(pni));
pni.pni_cookie = (void** )&pn;
@ -244,7 +244,7 @@ int fs_mkdir()
va.va_mode = (mode_t) fs_m_in.REQ_MODE;
va.va_uid = caller_uid;
va.va_gid = caller_gid;
va.va_atime.tv_sec = va.va_mtime.tv_sec = va.va_ctime.tv_sec = cur_time;
va.va_atime = va.va_mtime = va.va_ctime = cur_time;
if (buildpath) {
r = puffs_path_pcnbuild(global_pu, &pcn, pn_dir);
@ -271,7 +271,7 @@ int fs_mkdir()
return(r);
}
update_times(pn_dir, MTIME | CTIME, cur_time);
update_timens(pn_dir, MTIME | CTIME, &cur_time);
return(OK);
}
@ -341,7 +341,7 @@ int fs_slink()
va.va_mode = (mode_t) (I_SYMBOLIC_LINK | RWX_MODES);
va.va_uid = caller_uid;
va.va_gid = caller_gid;
va.va_atime.tv_sec = va.va_mtime.tv_sec = va.va_ctime.tv_sec = clock_time();
va.va_atime = va.va_mtime = va.va_ctime = clock_timespec();
if (buildpath) {
r = puffs_path_pcnbuild(global_pu, &pcn, pn_dir);

View file

@ -33,8 +33,7 @@ int fs_chmod()
puffs_vattr_null(&va);
/* Clear setgid bit if file is not in caller's grp */
va.va_mode = (pn->pn_va.va_mode & ~ALL_MODES) | (mode & ALL_MODES);
va.va_ctime.tv_nsec = 0;
va.va_ctime.tv_sec = clock_time();
va.va_ctime = clock_timespec();
if (global_pu->pu_ops.puffs_node_setattr(global_pu, pn, &va, pcr) != 0)
return(EINVAL);
@ -64,8 +63,7 @@ int fs_chown()
va.va_uid = fs_m_in.REQ_UID;
va.va_gid = fs_m_in.REQ_GID;
va.va_mode = pn->pn_va.va_mode & ~(I_SET_UID_BIT | I_SET_GID_BIT);
va.va_ctime.tv_nsec = 0;
va.va_ctime.tv_sec = clock_time();
va.va_ctime = clock_timespec();
if (global_pu->pu_ops.puffs_node_setattr(global_pu, pn, &va, pcr) != 0)
return(EINVAL);

View file

@ -3,6 +3,7 @@
struct puffs_usermount;
struct puffs_node;
struct timespec;
/* Function prototypes. */
@ -67,8 +68,8 @@ int fs_utime(void);
int no_sys(void);
void mfs_nul_f(const char *file, int line, char *str, unsigned int len,
unsigned int maxlen);
time_t clock_time(void);
int update_times(struct puffs_node *pn, int fl, time_t t);
struct timespec clock_timespec(void);
int update_timens(struct puffs_node *pn, int fl, struct timespec *);
void lpuffs_debug(const char *format, ...);
#endif /* PUFFS_PROTO_H */

View file

@ -68,7 +68,7 @@ int fs_readwrite(void)
if (bytes_done) {
r = sys_safecopyto(VFS_PROC_NR, gid, (vir_bytes) 0,
(vir_bytes) rw_buf, bytes_done);
update_times(pn, ATIME, 0);
update_timens(pn, ATIME, NULL);
}
} else if (rw_flag == WRITING) {
/* At first try to change vattr */
@ -78,8 +78,8 @@ int fs_readwrite(void)
puffs_vattr_null(&va);
if ( (pos + bytes_left) > pn->pn_va.va_size)
va.va_size = bytes_left + pos;
va.va_ctime.tv_sec = va.va_mtime.tv_sec = clock_time();
va.va_atime.tv_sec = pn->pn_va.va_atime.tv_sec;
va.va_ctime = va.va_mtime = clock_timespec();
va.va_atime = pn->pn_va.va_atime;
r = global_pu->pu_ops.puffs_node_setattr(global_pu, pn, &va, pcr);
if (r) return(EINVAL);
@ -169,7 +169,7 @@ int fs_getdents(void)
if (r != OK) return(r);
}
update_times(pn, ATIME, 0);
update_timens(pn, ATIME, NULL);
fs_m_out.RES_NBYTES = written;
fs_m_out.RES_SEEK_POS_LO = pos;

View file

@ -81,9 +81,15 @@ int fs_stat()
statbuf.st_gid = va.va_gid;
statbuf.st_rdev = (s ? va.va_rdev : NO_DEV);
statbuf.st_size = va.va_size;
statbuf.st_atime = va.va_atime.tv_sec;
statbuf.st_mtime = va.va_mtime.tv_sec;
statbuf.st_ctime = va.va_ctime.tv_sec;
statbuf.st_atimespec = va.va_atime;
statbuf.st_mtimespec = va.va_mtime;
statbuf.st_ctimespec = va.va_ctime;
statbuf.st_birthtimespec = va.va_birthtime;
statbuf.st_blksize = va.va_blocksize;
statbuf.st_blocks = va.va_bytes / va.va_blocksize;
statbuf.st_flags = va.va_flags;
statbuf.st_gen = va.va_gen;
/* Copy the struct to user space. */
r = sys_safecopyto(fs_m_in.m_source, (cp_grant_id_t) fs_m_in.REQ_GRANT,

View file

@ -292,10 +292,9 @@ puffs_stat2vattr(struct vattr *va, const struct stat *sb)
va->va_fsid = sb->st_dev;
va->va_fileid = sb->st_ino;
va->va_size = sb->st_size;
va->va_atime.tv_nsec = va->va_mtime.tv_nsec = va->va_ctime.tv_nsec = 0;
va->va_atime.tv_sec = sb->st_atime;
va->va_ctime.tv_sec = sb->st_ctime;
va->va_mtime.tv_sec = sb->st_mtime;
va->va_atime = sb->st_atimespec;
va->va_ctime = sb->st_ctimespec;
va->va_mtime = sb->st_mtimespec;
va->va_blocksize = sb->st_blksize;
va->va_birthtime = sb->st_birthtimespec;
va->va_gen = sb->st_gen;

View file

@ -30,10 +30,10 @@ int fs_utime()
return(EINVAL);
puffs_vattr_null(&va);
va.va_atime.tv_nsec = va.va_mtime.tv_nsec = va.va_ctime.tv_nsec = 0;
va.va_atime.tv_nsec = va.va_mtime.tv_nsec = 0;
va.va_atime.tv_sec = fs_m_in.REQ_ACTIME;
va.va_mtime.tv_sec = fs_m_in.REQ_MODTIME;
va.va_ctime.tv_sec = clock_time();
va.va_ctime = clock_timespec();
if (global_pu->pu_ops.puffs_node_setattr(global_pu, pn, &va, pcr) != 0)
return(EINVAL);

View file

@ -4,6 +4,7 @@
#include "fs.h"
#include <assert.h>
#include <stdarg.h>
#include "puffs.h"
@ -35,35 +36,42 @@ void mfs_nul_f(const char *file, int line, char *str, unsigned int len,
/*===========================================================================*
* clock_time *
* clock_timespec *
*===========================================================================*/
time_t clock_time()
struct timespec clock_timespec()
{
/* This routine returns the time in seconds since 1.1.1970. MINIX is an
* astrophysically naive system that assumes the earth rotates at a constant
* rate and that such things as leap seconds do not exist.
*/
static long system_hz = 0;
register int k;
struct timespec tv;
clock_t uptime;
clock_t realtime;
time_t boottime;
if (system_hz == 0) system_hz = sys_hz();
if ((k=getuptime(&uptime, &realtime, &boottime)) != OK)
panic("clock_time: getuptme2 failed: %d", k);
panic("clock_timespec: getuptime failed: %d", k);
return( (time_t) (boottime + (realtime/sys_hz())));
tv.tv_sec = (time_t) (boottime + (realtime/system_hz));
/* We do not want to overflow, and system_hz can be as high as 50kHz */
assert(system_hz < LONG_MAX/40000);
tv.tv_nsec = (realtime%system_hz) * 40000 / system_hz * 25000;
return tv;
}
/*===========================================================================*
* update_times *
* update_timens *
*===========================================================================*/
int update_times(struct puffs_node *pn, int flags, time_t t)
int update_timens(struct puffs_node *pn, int flags, struct timespec *t)
{
int r;
struct vattr va;
time_t new_time;
struct timespec new_time;
PUFFS_MAKECRED(pcr, &global_kcred);
if (!flags)
@ -72,28 +80,22 @@ int update_times(struct puffs_node *pn, int flags, time_t t)
if (global_pu->pu_ops.puffs_node_setattr == NULL)
return EINVAL;
new_time = t != 0 ? t : clock_time();
new_time = t != NULL ? *t : clock_timespec();
puffs_vattr_null(&va);
/* librefuse modifies atime and mtime together,
* so set old values to avoid setting either one
* to PUFFS_VNOVAL (set by puffs_vattr_null).
*/
va.va_atime.tv_sec = pn->pn_va.va_atime.tv_sec;
va.va_mtime.tv_sec = pn->pn_va.va_mtime.tv_sec;
va.va_atime = pn->pn_va.va_atime;
va.va_mtime = pn->pn_va.va_mtime;
if (flags & ATIME) {
va.va_atime.tv_sec = new_time;
va.va_atime.tv_nsec = 0;
}
if (flags & MTIME) {
va.va_mtime.tv_sec = new_time;
va.va_mtime.tv_nsec = 0;
}
if (flags & CTIME) {
va.va_ctime.tv_sec = new_time;
va.va_ctime.tv_nsec = 0;
}
if (flags & ATIME)
va.va_atime = new_time;
if (flags & MTIME)
va.va_mtime = new_time;
if (flags & CTIME)
va.va_ctime = new_time;
r = global_pu->pu_ops.puffs_node_setattr(global_pu, pn, &va, pcr);