summaryrefslogtreecommitdiffstats
path: root/fs/ceph/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ceph/inode.c')
-rw-r--r--fs/ceph/inode.c44
1 files changed, 24 insertions, 20 deletions
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
index 676065a1ea62..700fd652cc77 100644
--- a/fs/ceph/inode.c
+++ b/fs/ceph/inode.c
@@ -662,6 +662,9 @@ void ceph_fill_file_time(struct inode *inode, int issued,
662 struct timespec *mtime, struct timespec *atime) 662 struct timespec *mtime, struct timespec *atime)
663{ 663{
664 struct ceph_inode_info *ci = ceph_inode(inode); 664 struct ceph_inode_info *ci = ceph_inode(inode);
665 struct timespec64 ctime64 = timespec_to_timespec64(*ctime);
666 struct timespec64 mtime64 = timespec_to_timespec64(*mtime);
667 struct timespec64 atime64 = timespec_to_timespec64(*atime);
665 int warn = 0; 668 int warn = 0;
666 669
667 if (issued & (CEPH_CAP_FILE_EXCL| 670 if (issued & (CEPH_CAP_FILE_EXCL|
@@ -670,11 +673,11 @@ void ceph_fill_file_time(struct inode *inode, int issued,
670 CEPH_CAP_AUTH_EXCL| 673 CEPH_CAP_AUTH_EXCL|
671 CEPH_CAP_XATTR_EXCL)) { 674 CEPH_CAP_XATTR_EXCL)) {
672 if (ci->i_version == 0 || 675 if (ci->i_version == 0 ||
673 timespec_compare(ctime, &inode->i_ctime) > 0) { 676 timespec64_compare(&ctime64, &inode->i_ctime) > 0) {
674 dout("ctime %lld.%09ld -> %lld.%09ld inc w/ cap\n", 677 dout("ctime %lld.%09ld -> %lld.%09ld inc w/ cap\n",
675 (long long)inode->i_ctime.tv_sec, inode->i_ctime.tv_nsec, 678 (long long)inode->i_ctime.tv_sec, inode->i_ctime.tv_nsec,
676 (long long)ctime->tv_sec, ctime->tv_nsec); 679 (long long)ctime->tv_sec, ctime->tv_nsec);
677 inode->i_ctime = *ctime; 680 inode->i_ctime = ctime64;
678 } 681 }
679 if (ci->i_version == 0 || 682 if (ci->i_version == 0 ||
680 ceph_seq_cmp(time_warp_seq, ci->i_time_warp_seq) > 0) { 683 ceph_seq_cmp(time_warp_seq, ci->i_time_warp_seq) > 0) {
@@ -685,24 +688,24 @@ void ceph_fill_file_time(struct inode *inode, int issued,
685 (long long)mtime->tv_sec, mtime->tv_nsec, 688 (long long)mtime->tv_sec, mtime->tv_nsec,
686 ci->i_time_warp_seq, (int)time_warp_seq); 689 ci->i_time_warp_seq, (int)time_warp_seq);
687 690
688 inode->i_mtime = *mtime; 691 inode->i_mtime = mtime64;
689 inode->i_atime = *atime; 692 inode->i_atime = atime64;
690 ci->i_time_warp_seq = time_warp_seq; 693 ci->i_time_warp_seq = time_warp_seq;
691 } else if (time_warp_seq == ci->i_time_warp_seq) { 694 } else if (time_warp_seq == ci->i_time_warp_seq) {
692 /* nobody did utimes(); take the max */ 695 /* nobody did utimes(); take the max */
693 if (timespec_compare(mtime, &inode->i_mtime) > 0) { 696 if (timespec64_compare(&mtime64, &inode->i_mtime) > 0) {
694 dout("mtime %lld.%09ld -> %lld.%09ld inc\n", 697 dout("mtime %lld.%09ld -> %lld.%09ld inc\n",
695 (long long)inode->i_mtime.tv_sec, 698 (long long)inode->i_mtime.tv_sec,
696 inode->i_mtime.tv_nsec, 699 inode->i_mtime.tv_nsec,
697 (long long)mtime->tv_sec, mtime->tv_nsec); 700 (long long)mtime->tv_sec, mtime->tv_nsec);
698 inode->i_mtime = *mtime; 701 inode->i_mtime = mtime64;
699 } 702 }
700 if (timespec_compare(atime, &inode->i_atime) > 0) { 703 if (timespec64_compare(&atime64, &inode->i_atime) > 0) {
701 dout("atime %lld.%09ld -> %lld.%09ld inc\n", 704 dout("atime %lld.%09ld -> %lld.%09ld inc\n",
702 (long long)inode->i_atime.tv_sec, 705 (long long)inode->i_atime.tv_sec,
703 inode->i_atime.tv_nsec, 706 inode->i_atime.tv_nsec,
704 (long long)atime->tv_sec, atime->tv_nsec); 707 (long long)atime->tv_sec, atime->tv_nsec);
705 inode->i_atime = *atime; 708 inode->i_atime = atime64;
706 } 709 }
707 } else if (issued & CEPH_CAP_FILE_EXCL) { 710 } else if (issued & CEPH_CAP_FILE_EXCL) {
708 /* we did a utimes(); ignore mds values */ 711 /* we did a utimes(); ignore mds values */
@@ -712,9 +715,9 @@ void ceph_fill_file_time(struct inode *inode, int issued,
712 } else { 715 } else {
713 /* we have no write|excl caps; whatever the MDS says is true */ 716 /* we have no write|excl caps; whatever the MDS says is true */
714 if (ceph_seq_cmp(time_warp_seq, ci->i_time_warp_seq) >= 0) { 717 if (ceph_seq_cmp(time_warp_seq, ci->i_time_warp_seq) >= 0) {
715 inode->i_ctime = *ctime; 718 inode->i_ctime = ctime64;
716 inode->i_mtime = *mtime; 719 inode->i_mtime = mtime64;
717 inode->i_atime = *atime; 720 inode->i_atime = atime64;
718 ci->i_time_warp_seq = time_warp_seq; 721 ci->i_time_warp_seq = time_warp_seq;
719 } else { 722 } else {
720 warn = 1; 723 warn = 1;
@@ -1941,6 +1944,7 @@ int __ceph_setattr(struct inode *inode, struct iattr *attr)
1941 int err = 0; 1944 int err = 0;
1942 int inode_dirty_flags = 0; 1945 int inode_dirty_flags = 0;
1943 bool lock_snap_rwsem = false; 1946 bool lock_snap_rwsem = false;
1947 struct timespec ts;
1944 1948
1945 prealloc_cf = ceph_alloc_cap_flush(); 1949 prealloc_cf = ceph_alloc_cap_flush();
1946 if (!prealloc_cf) 1950 if (!prealloc_cf)
@@ -2023,14 +2027,14 @@ int __ceph_setattr(struct inode *inode, struct iattr *attr)
2023 inode->i_atime = attr->ia_atime; 2027 inode->i_atime = attr->ia_atime;
2024 dirtied |= CEPH_CAP_FILE_EXCL; 2028 dirtied |= CEPH_CAP_FILE_EXCL;
2025 } else if ((issued & CEPH_CAP_FILE_WR) && 2029 } else if ((issued & CEPH_CAP_FILE_WR) &&
2026 timespec_compare(&inode->i_atime, 2030 timespec64_compare(&inode->i_atime,
2027 &attr->ia_atime) < 0) { 2031 &attr->ia_atime) < 0) {
2028 inode->i_atime = attr->ia_atime; 2032 inode->i_atime = attr->ia_atime;
2029 dirtied |= CEPH_CAP_FILE_WR; 2033 dirtied |= CEPH_CAP_FILE_WR;
2030 } else if ((issued & CEPH_CAP_FILE_SHARED) == 0 || 2034 } else if ((issued & CEPH_CAP_FILE_SHARED) == 0 ||
2031 !timespec_equal(&inode->i_atime, &attr->ia_atime)) { 2035 !timespec64_equal(&inode->i_atime, &attr->ia_atime)) {
2032 ceph_encode_timespec(&req->r_args.setattr.atime, 2036 ts = timespec64_to_timespec(attr->ia_atime);
2033 &attr->ia_atime); 2037 ceph_encode_timespec(&req->r_args.setattr.atime, &ts);
2034 mask |= CEPH_SETATTR_ATIME; 2038 mask |= CEPH_SETATTR_ATIME;
2035 release |= CEPH_CAP_FILE_SHARED | 2039 release |= CEPH_CAP_FILE_SHARED |
2036 CEPH_CAP_FILE_RD | CEPH_CAP_FILE_WR; 2040 CEPH_CAP_FILE_RD | CEPH_CAP_FILE_WR;
@@ -2045,14 +2049,14 @@ int __ceph_setattr(struct inode *inode, struct iattr *attr)
2045 inode->i_mtime = attr->ia_mtime; 2049 inode->i_mtime = attr->ia_mtime;
2046 dirtied |= CEPH_CAP_FILE_EXCL; 2050 dirtied |= CEPH_CAP_FILE_EXCL;
2047 } else if ((issued & CEPH_CAP_FILE_WR) && 2051 } else if ((issued & CEPH_CAP_FILE_WR) &&
2048 timespec_compare(&inode->i_mtime, 2052 timespec64_compare(&inode->i_mtime,
2049 &attr->ia_mtime) < 0) { 2053 &attr->ia_mtime) < 0) {
2050 inode->i_mtime = attr->ia_mtime; 2054 inode->i_mtime = attr->ia_mtime;
2051 dirtied |= CEPH_CAP_FILE_WR; 2055 dirtied |= CEPH_CAP_FILE_WR;
2052 } else if ((issued & CEPH_CAP_FILE_SHARED) == 0 || 2056 } else if ((issued & CEPH_CAP_FILE_SHARED) == 0 ||
2053 !timespec_equal(&inode->i_mtime, &attr->ia_mtime)) { 2057 !timespec64_equal(&inode->i_mtime, &attr->ia_mtime)) {
2054 ceph_encode_timespec(&req->r_args.setattr.mtime, 2058 ts = timespec64_to_timespec(attr->ia_mtime);
2055 &attr->ia_mtime); 2059 ceph_encode_timespec(&req->r_args.setattr.mtime, &ts);
2056 mask |= CEPH_SETATTR_MTIME; 2060 mask |= CEPH_SETATTR_MTIME;
2057 release |= CEPH_CAP_FILE_SHARED | 2061 release |= CEPH_CAP_FILE_SHARED |
2058 CEPH_CAP_FILE_RD | CEPH_CAP_FILE_WR; 2062 CEPH_CAP_FILE_RD | CEPH_CAP_FILE_WR;
@@ -2126,7 +2130,7 @@ int __ceph_setattr(struct inode *inode, struct iattr *attr)
2126 req->r_inode_drop = release; 2130 req->r_inode_drop = release;
2127 req->r_args.setattr.mask = cpu_to_le32(mask); 2131 req->r_args.setattr.mask = cpu_to_le32(mask);
2128 req->r_num_caps = 1; 2132 req->r_num_caps = 1;
2129 req->r_stamp = attr->ia_ctime; 2133 req->r_stamp = timespec64_to_timespec(attr->ia_ctime);
2130 err = ceph_mdsc_do_request(mdsc, NULL, req); 2134 err = ceph_mdsc_do_request(mdsc, NULL, req);
2131 } 2135 }
2132 dout("setattr %p result=%d (%s locally, %d remote)\n", inode, err, 2136 dout("setattr %p result=%d (%s locally, %d remote)\n", inode, err,