switch stat_file() to passing a single struct rather than fsckloads of pointers
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
5e2df28cc6
commit
39b743c619
3 changed files with 58 additions and 68 deletions
|
@ -53,11 +53,21 @@ struct hostfs_iattr {
|
||||||
struct timespec ia_ctime;
|
struct timespec ia_ctime;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern int stat_file(const char *path, unsigned long long *inode_out,
|
struct hostfs_stat {
|
||||||
int *mode_out, int *nlink_out, int *uid_out, int *gid_out,
|
unsigned long long ino;
|
||||||
unsigned long long *size_out, struct timespec *atime_out,
|
unsigned int mode;
|
||||||
struct timespec *mtime_out, struct timespec *ctime_out,
|
unsigned int nlink;
|
||||||
int *blksize_out, unsigned long long *blocks_out, int fd);
|
unsigned int uid;
|
||||||
|
unsigned int gid;
|
||||||
|
unsigned long long size;
|
||||||
|
struct timespec atime, mtime, ctime;
|
||||||
|
unsigned int blksize;
|
||||||
|
unsigned long long blocks;
|
||||||
|
unsigned int maj;
|
||||||
|
unsigned int min;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern int stat_file(const char *path, struct hostfs_stat *p, int fd);
|
||||||
extern int access_file(char *path, int r, int w, int x);
|
extern int access_file(char *path, int r, int w, int x);
|
||||||
extern int open_file(char *path, int r, int w, int append);
|
extern int open_file(char *path, int r, int w, int append);
|
||||||
extern int file_type(const char *path, int *maj, int *min);
|
extern int file_type(const char *path, int *maj, int *min);
|
||||||
|
|
|
@ -131,28 +131,21 @@ static char *inode_name(struct inode *ino, int extra)
|
||||||
|
|
||||||
static int read_name(struct inode *ino, char *name)
|
static int read_name(struct inode *ino, char *name)
|
||||||
{
|
{
|
||||||
/*
|
struct hostfs_stat st;
|
||||||
* The non-int inode fields are copied into ints by stat_file and
|
int err = stat_file(name, &st, -1);
|
||||||
* then copied into the inode because passing the actual pointers
|
|
||||||
* in and having them treated as int * breaks on big-endian machines
|
|
||||||
*/
|
|
||||||
int err;
|
|
||||||
int i_mode, i_nlink, i_blksize;
|
|
||||||
unsigned long long i_size;
|
|
||||||
unsigned long long i_ino;
|
|
||||||
unsigned long long i_blocks;
|
|
||||||
|
|
||||||
err = stat_file(name, &i_ino, &i_mode, &i_nlink, &ino->i_uid,
|
|
||||||
&ino->i_gid, &i_size, &ino->i_atime, &ino->i_mtime,
|
|
||||||
&ino->i_ctime, &i_blksize, &i_blocks, -1);
|
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
ino->i_ino = i_ino;
|
ino->i_ino = st.ino;
|
||||||
ino->i_mode = i_mode;
|
ino->i_mode = st.mode;
|
||||||
ino->i_nlink = i_nlink;
|
ino->i_nlink = st.nlink;
|
||||||
ino->i_size = i_size;
|
ino->i_uid = st.uid;
|
||||||
ino->i_blocks = i_blocks;
|
ino->i_gid = st.gid;
|
||||||
|
ino->i_atime = st.atime;
|
||||||
|
ino->i_mtime = st.mtime;
|
||||||
|
ino->i_ctime = st.ctime;
|
||||||
|
ino->i_size = st.size;
|
||||||
|
ino->i_blocks = st.blocks;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,11 +19,27 @@
|
||||||
#include "user.h"
|
#include "user.h"
|
||||||
#include <utime.h>
|
#include <utime.h>
|
||||||
|
|
||||||
int stat_file(const char *path, unsigned long long *inode_out, int *mode_out,
|
static void stat64_to_hostfs(const struct stat64 *buf, struct hostfs_stat *p)
|
||||||
int *nlink_out, int *uid_out, int *gid_out,
|
{
|
||||||
unsigned long long *size_out, struct timespec *atime_out,
|
p->ino = buf->st_ino;
|
||||||
struct timespec *mtime_out, struct timespec *ctime_out,
|
p->mode = buf->st_mode;
|
||||||
int *blksize_out, unsigned long long *blocks_out, int fd)
|
p->nlink = buf->st_nlink;
|
||||||
|
p->uid = buf->st_uid;
|
||||||
|
p->gid = buf->st_gid;
|
||||||
|
p->size = buf->st_size;
|
||||||
|
p->atime.tv_sec = buf->st_atime;
|
||||||
|
p->atime.tv_nsec = 0;
|
||||||
|
p->ctime.tv_sec = buf->st_ctime;
|
||||||
|
p->ctime.tv_nsec = 0;
|
||||||
|
p->mtime.tv_sec = buf->st_mtime;
|
||||||
|
p->mtime.tv_nsec = 0;
|
||||||
|
p->blksize = buf->st_blksize;
|
||||||
|
p->blocks = buf->st_blocks;
|
||||||
|
p->maj = os_major(buf->st_rdev);
|
||||||
|
p->min = os_minor(buf->st_rdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
int stat_file(const char *path, struct hostfs_stat *p, int fd)
|
||||||
{
|
{
|
||||||
struct stat64 buf;
|
struct stat64 buf;
|
||||||
|
|
||||||
|
@ -33,35 +49,7 @@ int stat_file(const char *path, unsigned long long *inode_out, int *mode_out,
|
||||||
} else if (lstat64(path, &buf) < 0) {
|
} else if (lstat64(path, &buf) < 0) {
|
||||||
return -errno;
|
return -errno;
|
||||||
}
|
}
|
||||||
|
stat64_to_hostfs(&buf, p);
|
||||||
if (inode_out != NULL)
|
|
||||||
*inode_out = buf.st_ino;
|
|
||||||
if (mode_out != NULL)
|
|
||||||
*mode_out = buf.st_mode;
|
|
||||||
if (nlink_out != NULL)
|
|
||||||
*nlink_out = buf.st_nlink;
|
|
||||||
if (uid_out != NULL)
|
|
||||||
*uid_out = buf.st_uid;
|
|
||||||
if (gid_out != NULL)
|
|
||||||
*gid_out = buf.st_gid;
|
|
||||||
if (size_out != NULL)
|
|
||||||
*size_out = buf.st_size;
|
|
||||||
if (atime_out != NULL) {
|
|
||||||
atime_out->tv_sec = buf.st_atime;
|
|
||||||
atime_out->tv_nsec = 0;
|
|
||||||
}
|
|
||||||
if (mtime_out != NULL) {
|
|
||||||
mtime_out->tv_sec = buf.st_mtime;
|
|
||||||
mtime_out->tv_nsec = 0;
|
|
||||||
}
|
|
||||||
if (ctime_out != NULL) {
|
|
||||||
ctime_out->tv_sec = buf.st_ctime;
|
|
||||||
ctime_out->tv_nsec = 0;
|
|
||||||
}
|
|
||||||
if (blksize_out != NULL)
|
|
||||||
*blksize_out = buf.st_blksize;
|
|
||||||
if (blocks_out != NULL)
|
|
||||||
*blocks_out = buf.st_blocks;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -235,8 +223,8 @@ int file_create(char *name, int ur, int uw, int ux, int gr,
|
||||||
|
|
||||||
int set_attr(const char *file, struct hostfs_iattr *attrs, int fd)
|
int set_attr(const char *file, struct hostfs_iattr *attrs, int fd)
|
||||||
{
|
{
|
||||||
|
struct hostfs_stat st;
|
||||||
struct timeval times[2];
|
struct timeval times[2];
|
||||||
struct timespec atime_ts, mtime_ts;
|
|
||||||
int err, ma;
|
int err, ma;
|
||||||
|
|
||||||
if (attrs->ia_valid & HOSTFS_ATTR_MODE) {
|
if (attrs->ia_valid & HOSTFS_ATTR_MODE) {
|
||||||
|
@ -279,15 +267,14 @@ int set_attr(const char *file, struct hostfs_iattr *attrs, int fd)
|
||||||
*/
|
*/
|
||||||
ma = (HOSTFS_ATTR_ATIME_SET | HOSTFS_ATTR_MTIME_SET);
|
ma = (HOSTFS_ATTR_ATIME_SET | HOSTFS_ATTR_MTIME_SET);
|
||||||
if (attrs->ia_valid & ma) {
|
if (attrs->ia_valid & ma) {
|
||||||
err = stat_file(file, NULL, NULL, NULL, NULL, NULL, NULL,
|
err = stat_file(file, &st, fd);
|
||||||
&atime_ts, &mtime_ts, NULL, NULL, NULL, fd);
|
|
||||||
if (err != 0)
|
if (err != 0)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
times[0].tv_sec = atime_ts.tv_sec;
|
times[0].tv_sec = st.atime.tv_sec;
|
||||||
times[0].tv_usec = atime_ts.tv_nsec / 1000;
|
times[0].tv_usec = st.atime.tv_nsec / 1000;
|
||||||
times[1].tv_sec = mtime_ts.tv_sec;
|
times[1].tv_sec = st.mtime.tv_sec;
|
||||||
times[1].tv_usec = mtime_ts.tv_nsec / 1000;
|
times[1].tv_usec = st.mtime.tv_nsec / 1000;
|
||||||
|
|
||||||
if (attrs->ia_valid & HOSTFS_ATTR_ATIME_SET) {
|
if (attrs->ia_valid & HOSTFS_ATTR_ATIME_SET) {
|
||||||
times[0].tv_sec = attrs->ia_atime.tv_sec;
|
times[0].tv_sec = attrs->ia_atime.tv_sec;
|
||||||
|
@ -308,9 +295,9 @@ int set_attr(const char *file, struct hostfs_iattr *attrs, int fd)
|
||||||
|
|
||||||
/* Note: ctime is not handled */
|
/* Note: ctime is not handled */
|
||||||
if (attrs->ia_valid & (HOSTFS_ATTR_ATIME | HOSTFS_ATTR_MTIME)) {
|
if (attrs->ia_valid & (HOSTFS_ATTR_ATIME | HOSTFS_ATTR_MTIME)) {
|
||||||
err = stat_file(file, NULL, NULL, NULL, NULL, NULL, NULL,
|
err = stat_file(file, &st, fd);
|
||||||
&attrs->ia_atime, &attrs->ia_mtime, NULL,
|
attrs->ia_atime = st.atime;
|
||||||
NULL, NULL, fd);
|
attrs->ia_mtime = st.mtime;
|
||||||
if (err != 0)
|
if (err != 0)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue