|
@@ -501,15 +501,15 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr, st
|
|
nfsi->read_cache_jiffies = fattr->time_start;
|
|
nfsi->read_cache_jiffies = fattr->time_start;
|
|
nfsi->attr_gencount = fattr->gencount;
|
|
nfsi->attr_gencount = fattr->gencount;
|
|
if (fattr->valid & NFS_ATTR_FATTR_ATIME)
|
|
if (fattr->valid & NFS_ATTR_FATTR_ATIME)
|
|
- inode->i_atime = fattr->atime;
|
|
|
|
|
|
+ inode->i_atime = timespec_to_timespec64(fattr->atime);
|
|
else if (nfs_server_capable(inode, NFS_CAP_ATIME))
|
|
else if (nfs_server_capable(inode, NFS_CAP_ATIME))
|
|
nfs_set_cache_invalid(inode, NFS_INO_INVALID_ATIME);
|
|
nfs_set_cache_invalid(inode, NFS_INO_INVALID_ATIME);
|
|
if (fattr->valid & NFS_ATTR_FATTR_MTIME)
|
|
if (fattr->valid & NFS_ATTR_FATTR_MTIME)
|
|
- inode->i_mtime = fattr->mtime;
|
|
|
|
|
|
+ inode->i_mtime = timespec_to_timespec64(fattr->mtime);
|
|
else if (nfs_server_capable(inode, NFS_CAP_MTIME))
|
|
else if (nfs_server_capable(inode, NFS_CAP_MTIME))
|
|
nfs_set_cache_invalid(inode, NFS_INO_INVALID_MTIME);
|
|
nfs_set_cache_invalid(inode, NFS_INO_INVALID_MTIME);
|
|
if (fattr->valid & NFS_ATTR_FATTR_CTIME)
|
|
if (fattr->valid & NFS_ATTR_FATTR_CTIME)
|
|
- inode->i_ctime = fattr->ctime;
|
|
|
|
|
|
+ inode->i_ctime = timespec_to_timespec64(fattr->ctime);
|
|
else if (nfs_server_capable(inode, NFS_CAP_CTIME))
|
|
else if (nfs_server_capable(inode, NFS_CAP_CTIME))
|
|
nfs_set_cache_invalid(inode, NFS_INO_INVALID_CTIME);
|
|
nfs_set_cache_invalid(inode, NFS_INO_INVALID_CTIME);
|
|
if (fattr->valid & NFS_ATTR_FATTR_CHANGE)
|
|
if (fattr->valid & NFS_ATTR_FATTR_CHANGE)
|
|
@@ -694,7 +694,7 @@ void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr,
|
|
if ((attr->ia_valid & ATTR_GID) != 0)
|
|
if ((attr->ia_valid & ATTR_GID) != 0)
|
|
inode->i_gid = attr->ia_gid;
|
|
inode->i_gid = attr->ia_gid;
|
|
if (fattr->valid & NFS_ATTR_FATTR_CTIME)
|
|
if (fattr->valid & NFS_ATTR_FATTR_CTIME)
|
|
- inode->i_ctime = fattr->ctime;
|
|
|
|
|
|
+ inode->i_ctime = timespec_to_timespec64(fattr->ctime);
|
|
else
|
|
else
|
|
nfs_set_cache_invalid(inode, NFS_INO_INVALID_CHANGE
|
|
nfs_set_cache_invalid(inode, NFS_INO_INVALID_CHANGE
|
|
| NFS_INO_INVALID_CTIME);
|
|
| NFS_INO_INVALID_CTIME);
|
|
@@ -705,14 +705,14 @@ void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr,
|
|
NFS_I(inode)->cache_validity &= ~(NFS_INO_INVALID_ATIME
|
|
NFS_I(inode)->cache_validity &= ~(NFS_INO_INVALID_ATIME
|
|
| NFS_INO_INVALID_CTIME);
|
|
| NFS_INO_INVALID_CTIME);
|
|
if (fattr->valid & NFS_ATTR_FATTR_ATIME)
|
|
if (fattr->valid & NFS_ATTR_FATTR_ATIME)
|
|
- inode->i_atime = fattr->atime;
|
|
|
|
|
|
+ inode->i_atime = timespec_to_timespec64(fattr->atime);
|
|
else if (attr->ia_valid & ATTR_ATIME_SET)
|
|
else if (attr->ia_valid & ATTR_ATIME_SET)
|
|
inode->i_atime = attr->ia_atime;
|
|
inode->i_atime = attr->ia_atime;
|
|
else
|
|
else
|
|
nfs_set_cache_invalid(inode, NFS_INO_INVALID_ATIME);
|
|
nfs_set_cache_invalid(inode, NFS_INO_INVALID_ATIME);
|
|
|
|
|
|
if (fattr->valid & NFS_ATTR_FATTR_CTIME)
|
|
if (fattr->valid & NFS_ATTR_FATTR_CTIME)
|
|
- inode->i_ctime = fattr->ctime;
|
|
|
|
|
|
+ inode->i_ctime = timespec_to_timespec64(fattr->ctime);
|
|
else
|
|
else
|
|
nfs_set_cache_invalid(inode, NFS_INO_INVALID_CHANGE
|
|
nfs_set_cache_invalid(inode, NFS_INO_INVALID_CHANGE
|
|
| NFS_INO_INVALID_CTIME);
|
|
| NFS_INO_INVALID_CTIME);
|
|
@@ -721,14 +721,14 @@ void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr,
|
|
NFS_I(inode)->cache_validity &= ~(NFS_INO_INVALID_MTIME
|
|
NFS_I(inode)->cache_validity &= ~(NFS_INO_INVALID_MTIME
|
|
| NFS_INO_INVALID_CTIME);
|
|
| NFS_INO_INVALID_CTIME);
|
|
if (fattr->valid & NFS_ATTR_FATTR_MTIME)
|
|
if (fattr->valid & NFS_ATTR_FATTR_MTIME)
|
|
- inode->i_mtime = fattr->mtime;
|
|
|
|
|
|
+ inode->i_mtime = timespec_to_timespec64(fattr->mtime);
|
|
else if (attr->ia_valid & ATTR_MTIME_SET)
|
|
else if (attr->ia_valid & ATTR_MTIME_SET)
|
|
inode->i_mtime = attr->ia_mtime;
|
|
inode->i_mtime = attr->ia_mtime;
|
|
else
|
|
else
|
|
nfs_set_cache_invalid(inode, NFS_INO_INVALID_MTIME);
|
|
nfs_set_cache_invalid(inode, NFS_INO_INVALID_MTIME);
|
|
|
|
|
|
if (fattr->valid & NFS_ATTR_FATTR_CTIME)
|
|
if (fattr->valid & NFS_ATTR_FATTR_CTIME)
|
|
- inode->i_ctime = fattr->ctime;
|
|
|
|
|
|
+ inode->i_ctime = timespec_to_timespec64(fattr->ctime);
|
|
else
|
|
else
|
|
nfs_set_cache_invalid(inode, NFS_INO_INVALID_CHANGE
|
|
nfs_set_cache_invalid(inode, NFS_INO_INVALID_CHANGE
|
|
| NFS_INO_INVALID_CTIME);
|
|
| NFS_INO_INVALID_CTIME);
|
|
@@ -1351,6 +1351,8 @@ static bool nfs_file_has_buffered_writers(struct nfs_inode *nfsi)
|
|
|
|
|
|
static void nfs_wcc_update_inode(struct inode *inode, struct nfs_fattr *fattr)
|
|
static void nfs_wcc_update_inode(struct inode *inode, struct nfs_fattr *fattr)
|
|
{
|
|
{
|
|
|
|
+ struct timespec ts;
|
|
|
|
+
|
|
if ((fattr->valid & NFS_ATTR_FATTR_PRECHANGE)
|
|
if ((fattr->valid & NFS_ATTR_FATTR_PRECHANGE)
|
|
&& (fattr->valid & NFS_ATTR_FATTR_CHANGE)
|
|
&& (fattr->valid & NFS_ATTR_FATTR_CHANGE)
|
|
&& inode_eq_iversion_raw(inode, fattr->pre_change_attr)) {
|
|
&& inode_eq_iversion_raw(inode, fattr->pre_change_attr)) {
|
|
@@ -1359,16 +1361,18 @@ static void nfs_wcc_update_inode(struct inode *inode, struct nfs_fattr *fattr)
|
|
nfs_set_cache_invalid(inode, NFS_INO_INVALID_DATA);
|
|
nfs_set_cache_invalid(inode, NFS_INO_INVALID_DATA);
|
|
}
|
|
}
|
|
/* If we have atomic WCC data, we may update some attributes */
|
|
/* If we have atomic WCC data, we may update some attributes */
|
|
|
|
+ ts = timespec64_to_timespec(inode->i_ctime);
|
|
if ((fattr->valid & NFS_ATTR_FATTR_PRECTIME)
|
|
if ((fattr->valid & NFS_ATTR_FATTR_PRECTIME)
|
|
&& (fattr->valid & NFS_ATTR_FATTR_CTIME)
|
|
&& (fattr->valid & NFS_ATTR_FATTR_CTIME)
|
|
- && timespec_equal(&inode->i_ctime, &fattr->pre_ctime)) {
|
|
|
|
- memcpy(&inode->i_ctime, &fattr->ctime, sizeof(inode->i_ctime));
|
|
|
|
|
|
+ && timespec_equal(&ts, &fattr->pre_ctime)) {
|
|
|
|
+ inode->i_ctime = timespec_to_timespec64(fattr->ctime);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ ts = timespec64_to_timespec(inode->i_mtime);
|
|
if ((fattr->valid & NFS_ATTR_FATTR_PREMTIME)
|
|
if ((fattr->valid & NFS_ATTR_FATTR_PREMTIME)
|
|
&& (fattr->valid & NFS_ATTR_FATTR_MTIME)
|
|
&& (fattr->valid & NFS_ATTR_FATTR_MTIME)
|
|
- && timespec_equal(&inode->i_mtime, &fattr->pre_mtime)) {
|
|
|
|
- memcpy(&inode->i_mtime, &fattr->mtime, sizeof(inode->i_mtime));
|
|
|
|
|
|
+ && timespec_equal(&ts, &fattr->pre_mtime)) {
|
|
|
|
+ inode->i_mtime = timespec_to_timespec64(fattr->mtime);
|
|
if (S_ISDIR(inode->i_mode))
|
|
if (S_ISDIR(inode->i_mode))
|
|
nfs_set_cache_invalid(inode, NFS_INO_INVALID_DATA);
|
|
nfs_set_cache_invalid(inode, NFS_INO_INVALID_DATA);
|
|
}
|
|
}
|
|
@@ -1394,7 +1398,7 @@ static int nfs_check_inode_attributes(struct inode *inode, struct nfs_fattr *fat
|
|
struct nfs_inode *nfsi = NFS_I(inode);
|
|
struct nfs_inode *nfsi = NFS_I(inode);
|
|
loff_t cur_size, new_isize;
|
|
loff_t cur_size, new_isize;
|
|
unsigned long invalid = 0;
|
|
unsigned long invalid = 0;
|
|
-
|
|
|
|
|
|
+ struct timespec ts;
|
|
|
|
|
|
if (NFS_PROTO(inode)->have_delegation(inode, FMODE_READ))
|
|
if (NFS_PROTO(inode)->have_delegation(inode, FMODE_READ))
|
|
return 0;
|
|
return 0;
|
|
@@ -1411,10 +1415,12 @@ static int nfs_check_inode_attributes(struct inode *inode, struct nfs_fattr *fat
|
|
invalid |= NFS_INO_INVALID_CHANGE
|
|
invalid |= NFS_INO_INVALID_CHANGE
|
|
| NFS_INO_REVAL_PAGECACHE;
|
|
| NFS_INO_REVAL_PAGECACHE;
|
|
|
|
|
|
- if ((fattr->valid & NFS_ATTR_FATTR_MTIME) && !timespec_equal(&inode->i_mtime, &fattr->mtime))
|
|
|
|
|
|
+ ts = timespec64_to_timespec(inode->i_mtime);
|
|
|
|
+ if ((fattr->valid & NFS_ATTR_FATTR_MTIME) && !timespec_equal(&ts, &fattr->mtime))
|
|
invalid |= NFS_INO_INVALID_MTIME;
|
|
invalid |= NFS_INO_INVALID_MTIME;
|
|
|
|
|
|
- if ((fattr->valid & NFS_ATTR_FATTR_CTIME) && !timespec_equal(&inode->i_ctime, &fattr->ctime))
|
|
|
|
|
|
+ ts = timespec64_to_timespec(inode->i_ctime);
|
|
|
|
+ if ((fattr->valid & NFS_ATTR_FATTR_CTIME) && !timespec_equal(&ts, &fattr->ctime))
|
|
invalid |= NFS_INO_INVALID_CTIME;
|
|
invalid |= NFS_INO_INVALID_CTIME;
|
|
|
|
|
|
if (fattr->valid & NFS_ATTR_FATTR_SIZE) {
|
|
if (fattr->valid & NFS_ATTR_FATTR_SIZE) {
|
|
@@ -1444,7 +1450,8 @@ static int nfs_check_inode_attributes(struct inode *inode, struct nfs_fattr *fat
|
|
if ((fattr->valid & NFS_ATTR_FATTR_NLINK) && inode->i_nlink != fattr->nlink)
|
|
if ((fattr->valid & NFS_ATTR_FATTR_NLINK) && inode->i_nlink != fattr->nlink)
|
|
invalid |= NFS_INO_INVALID_OTHER;
|
|
invalid |= NFS_INO_INVALID_OTHER;
|
|
|
|
|
|
- if ((fattr->valid & NFS_ATTR_FATTR_ATIME) && !timespec_equal(&inode->i_atime, &fattr->atime))
|
|
|
|
|
|
+ ts = timespec64_to_timespec(inode->i_atime);
|
|
|
|
+ if ((fattr->valid & NFS_ATTR_FATTR_ATIME) && !timespec_equal(&ts, &fattr->atime))
|
|
invalid |= NFS_INO_INVALID_ATIME;
|
|
invalid |= NFS_INO_INVALID_ATIME;
|
|
|
|
|
|
if (invalid != 0)
|
|
if (invalid != 0)
|
|
@@ -1716,12 +1723,12 @@ int nfs_post_op_update_inode_force_wcc_locked(struct inode *inode, struct nfs_fa
|
|
}
|
|
}
|
|
if ((fattr->valid & NFS_ATTR_FATTR_CTIME) != 0 &&
|
|
if ((fattr->valid & NFS_ATTR_FATTR_CTIME) != 0 &&
|
|
(fattr->valid & NFS_ATTR_FATTR_PRECTIME) == 0) {
|
|
(fattr->valid & NFS_ATTR_FATTR_PRECTIME) == 0) {
|
|
- memcpy(&fattr->pre_ctime, &inode->i_ctime, sizeof(fattr->pre_ctime));
|
|
|
|
|
|
+ fattr->pre_ctime = timespec64_to_timespec(inode->i_ctime);
|
|
fattr->valid |= NFS_ATTR_FATTR_PRECTIME;
|
|
fattr->valid |= NFS_ATTR_FATTR_PRECTIME;
|
|
}
|
|
}
|
|
if ((fattr->valid & NFS_ATTR_FATTR_MTIME) != 0 &&
|
|
if ((fattr->valid & NFS_ATTR_FATTR_MTIME) != 0 &&
|
|
(fattr->valid & NFS_ATTR_FATTR_PREMTIME) == 0) {
|
|
(fattr->valid & NFS_ATTR_FATTR_PREMTIME) == 0) {
|
|
- memcpy(&fattr->pre_mtime, &inode->i_mtime, sizeof(fattr->pre_mtime));
|
|
|
|
|
|
+ fattr->pre_mtime = timespec64_to_timespec(inode->i_mtime);
|
|
fattr->valid |= NFS_ATTR_FATTR_PREMTIME;
|
|
fattr->valid |= NFS_ATTR_FATTR_PREMTIME;
|
|
}
|
|
}
|
|
if ((fattr->valid & NFS_ATTR_FATTR_SIZE) != 0 &&
|
|
if ((fattr->valid & NFS_ATTR_FATTR_SIZE) != 0 &&
|
|
@@ -1884,7 +1891,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
|
|
}
|
|
}
|
|
|
|
|
|
if (fattr->valid & NFS_ATTR_FATTR_MTIME) {
|
|
if (fattr->valid & NFS_ATTR_FATTR_MTIME) {
|
|
- memcpy(&inode->i_mtime, &fattr->mtime, sizeof(inode->i_mtime));
|
|
|
|
|
|
+ inode->i_mtime = timespec_to_timespec64(fattr->mtime);
|
|
} else if (server->caps & NFS_CAP_MTIME) {
|
|
} else if (server->caps & NFS_CAP_MTIME) {
|
|
nfsi->cache_validity |= save_cache_validity &
|
|
nfsi->cache_validity |= save_cache_validity &
|
|
(NFS_INO_INVALID_MTIME
|
|
(NFS_INO_INVALID_MTIME
|
|
@@ -1893,7 +1900,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
|
|
}
|
|
}
|
|
|
|
|
|
if (fattr->valid & NFS_ATTR_FATTR_CTIME) {
|
|
if (fattr->valid & NFS_ATTR_FATTR_CTIME) {
|
|
- memcpy(&inode->i_ctime, &fattr->ctime, sizeof(inode->i_ctime));
|
|
|
|
|
|
+ inode->i_ctime = timespec_to_timespec64(fattr->ctime);
|
|
} else if (server->caps & NFS_CAP_CTIME) {
|
|
} else if (server->caps & NFS_CAP_CTIME) {
|
|
nfsi->cache_validity |= save_cache_validity &
|
|
nfsi->cache_validity |= save_cache_validity &
|
|
(NFS_INO_INVALID_CTIME
|
|
(NFS_INO_INVALID_CTIME
|
|
@@ -1931,7 +1938,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
|
|
|
|
|
|
|
|
|
|
if (fattr->valid & NFS_ATTR_FATTR_ATIME)
|
|
if (fattr->valid & NFS_ATTR_FATTR_ATIME)
|
|
- memcpy(&inode->i_atime, &fattr->atime, sizeof(inode->i_atime));
|
|
|
|
|
|
+ inode->i_atime = timespec_to_timespec64(fattr->atime);
|
|
else if (server->caps & NFS_CAP_ATIME) {
|
|
else if (server->caps & NFS_CAP_ATIME) {
|
|
nfsi->cache_validity |= save_cache_validity &
|
|
nfsi->cache_validity |= save_cache_validity &
|
|
(NFS_INO_INVALID_ATIME
|
|
(NFS_INO_INVALID_ATIME
|