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.c86
1 files changed, 45 insertions, 41 deletions
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
index 4fda7a9d4c9d..ee764ac352ab 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,39 +673,39 @@ 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 %ld.%09ld -> %ld.%09ld inc w/ cap\n", 677 dout("ctime %lld.%09ld -> %lld.%09ld inc w/ cap\n",
675 inode->i_ctime.tv_sec, inode->i_ctime.tv_nsec, 678 (long long)inode->i_ctime.tv_sec, inode->i_ctime.tv_nsec,
676 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) {
681 /* the MDS did a utimes() */ 684 /* the MDS did a utimes() */
682 dout("mtime %ld.%09ld -> %ld.%09ld " 685 dout("mtime %lld.%09ld -> %lld.%09ld "
683 "tw %d -> %d\n", 686 "tw %d -> %d\n",
684 inode->i_mtime.tv_sec, inode->i_mtime.tv_nsec, 687 (long long)inode->i_mtime.tv_sec, inode->i_mtime.tv_nsec,
685 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 %ld.%09ld -> %ld.%09ld inc\n", 697 dout("mtime %lld.%09ld -> %lld.%09ld inc\n",
695 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 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 %ld.%09ld -> %ld.%09ld inc\n", 704 dout("atime %lld.%09ld -> %lld.%09ld inc\n",
702 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 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;
@@ -1950,6 +1953,7 @@ int __ceph_setattr(struct inode *inode, struct iattr *attr)
1950 int err = 0; 1953 int err = 0;
1951 int inode_dirty_flags = 0; 1954 int inode_dirty_flags = 0;
1952 bool lock_snap_rwsem = false; 1955 bool lock_snap_rwsem = false;
1956 struct timespec ts;
1953 1957
1954 prealloc_cf = ceph_alloc_cap_flush(); 1958 prealloc_cf = ceph_alloc_cap_flush();
1955 if (!prealloc_cf) 1959 if (!prealloc_cf)
@@ -2024,44 +2028,44 @@ int __ceph_setattr(struct inode *inode, struct iattr *attr)
2024 } 2028 }
2025 2029
2026 if (ia_valid & ATTR_ATIME) { 2030 if (ia_valid & ATTR_ATIME) {
2027 dout("setattr %p atime %ld.%ld -> %ld.%ld\n", inode, 2031 dout("setattr %p atime %lld.%ld -> %lld.%ld\n", inode,
2028 inode->i_atime.tv_sec, inode->i_atime.tv_nsec, 2032 (long long)inode->i_atime.tv_sec, inode->i_atime.tv_nsec,
2029 attr->ia_atime.tv_sec, attr->ia_atime.tv_nsec); 2033 (long long)attr->ia_atime.tv_sec, attr->ia_atime.tv_nsec);
2030 if (issued & CEPH_CAP_FILE_EXCL) { 2034 if (issued & CEPH_CAP_FILE_EXCL) {
2031 ci->i_time_warp_seq++; 2035 ci->i_time_warp_seq++;
2032 inode->i_atime = attr->ia_atime; 2036 inode->i_atime = attr->ia_atime;
2033 dirtied |= CEPH_CAP_FILE_EXCL; 2037 dirtied |= CEPH_CAP_FILE_EXCL;
2034 } else if ((issued & CEPH_CAP_FILE_WR) && 2038 } else if ((issued & CEPH_CAP_FILE_WR) &&
2035 timespec_compare(&inode->i_atime, 2039 timespec64_compare(&inode->i_atime,
2036 &attr->ia_atime) < 0) { 2040 &attr->ia_atime) < 0) {
2037 inode->i_atime = attr->ia_atime; 2041 inode->i_atime = attr->ia_atime;
2038 dirtied |= CEPH_CAP_FILE_WR; 2042 dirtied |= CEPH_CAP_FILE_WR;
2039 } else if ((issued & CEPH_CAP_FILE_SHARED) == 0 || 2043 } else if ((issued & CEPH_CAP_FILE_SHARED) == 0 ||
2040 !timespec_equal(&inode->i_atime, &attr->ia_atime)) { 2044 !timespec64_equal(&inode->i_atime, &attr->ia_atime)) {
2041 ceph_encode_timespec(&req->r_args.setattr.atime, 2045 ts = timespec64_to_timespec(attr->ia_atime);
2042 &attr->ia_atime); 2046 ceph_encode_timespec(&req->r_args.setattr.atime, &ts);
2043 mask |= CEPH_SETATTR_ATIME; 2047 mask |= CEPH_SETATTR_ATIME;
2044 release |= CEPH_CAP_FILE_SHARED | 2048 release |= CEPH_CAP_FILE_SHARED |
2045 CEPH_CAP_FILE_RD | CEPH_CAP_FILE_WR; 2049 CEPH_CAP_FILE_RD | CEPH_CAP_FILE_WR;
2046 } 2050 }
2047 } 2051 }
2048 if (ia_valid & ATTR_MTIME) { 2052 if (ia_valid & ATTR_MTIME) {
2049 dout("setattr %p mtime %ld.%ld -> %ld.%ld\n", inode, 2053 dout("setattr %p mtime %lld.%ld -> %lld.%ld\n", inode,
2050 inode->i_mtime.tv_sec, inode->i_mtime.tv_nsec, 2054 (long long)inode->i_mtime.tv_sec, inode->i_mtime.tv_nsec,
2051 attr->ia_mtime.tv_sec, attr->ia_mtime.tv_nsec); 2055 (long long)attr->ia_mtime.tv_sec, attr->ia_mtime.tv_nsec);
2052 if (issued & CEPH_CAP_FILE_EXCL) { 2056 if (issued & CEPH_CAP_FILE_EXCL) {
2053 ci->i_time_warp_seq++; 2057 ci->i_time_warp_seq++;
2054 inode->i_mtime = attr->ia_mtime; 2058 inode->i_mtime = attr->ia_mtime;
2055 dirtied |= CEPH_CAP_FILE_EXCL; 2059 dirtied |= CEPH_CAP_FILE_EXCL;
2056 } else if ((issued & CEPH_CAP_FILE_WR) && 2060 } else if ((issued & CEPH_CAP_FILE_WR) &&
2057 timespec_compare(&inode->i_mtime, 2061 timespec64_compare(&inode->i_mtime,
2058 &attr->ia_mtime) < 0) { 2062 &attr->ia_mtime) < 0) {
2059 inode->i_mtime = attr->ia_mtime; 2063 inode->i_mtime = attr->ia_mtime;
2060 dirtied |= CEPH_CAP_FILE_WR; 2064 dirtied |= CEPH_CAP_FILE_WR;
2061 } else if ((issued & CEPH_CAP_FILE_SHARED) == 0 || 2065 } else if ((issued & CEPH_CAP_FILE_SHARED) == 0 ||
2062 !timespec_equal(&inode->i_mtime, &attr->ia_mtime)) { 2066 !timespec64_equal(&inode->i_mtime, &attr->ia_mtime)) {
2063 ceph_encode_timespec(&req->r_args.setattr.mtime, 2067 ts = timespec64_to_timespec(attr->ia_mtime);
2064 &attr->ia_mtime); 2068 ceph_encode_timespec(&req->r_args.setattr.mtime, &ts);
2065 mask |= CEPH_SETATTR_MTIME; 2069 mask |= CEPH_SETATTR_MTIME;
2066 release |= CEPH_CAP_FILE_SHARED | 2070 release |= CEPH_CAP_FILE_SHARED |
2067 CEPH_CAP_FILE_RD | CEPH_CAP_FILE_WR; 2071 CEPH_CAP_FILE_RD | CEPH_CAP_FILE_WR;
@@ -2091,9 +2095,9 @@ int __ceph_setattr(struct inode *inode, struct iattr *attr)
2091 if (ia_valid & ATTR_CTIME) { 2095 if (ia_valid & ATTR_CTIME) {
2092 bool only = (ia_valid & (ATTR_SIZE|ATTR_MTIME|ATTR_ATIME| 2096 bool only = (ia_valid & (ATTR_SIZE|ATTR_MTIME|ATTR_ATIME|
2093 ATTR_MODE|ATTR_UID|ATTR_GID)) == 0; 2097 ATTR_MODE|ATTR_UID|ATTR_GID)) == 0;
2094 dout("setattr %p ctime %ld.%ld -> %ld.%ld (%s)\n", inode, 2098 dout("setattr %p ctime %lld.%ld -> %lld.%ld (%s)\n", inode,
2095 inode->i_ctime.tv_sec, inode->i_ctime.tv_nsec, 2099 (long long)inode->i_ctime.tv_sec, inode->i_ctime.tv_nsec,
2096 attr->ia_ctime.tv_sec, attr->ia_ctime.tv_nsec, 2100 (long long)attr->ia_ctime.tv_sec, attr->ia_ctime.tv_nsec,
2097 only ? "ctime only" : "ignored"); 2101 only ? "ctime only" : "ignored");
2098 if (only) { 2102 if (only) {
2099 /* 2103 /*
@@ -2135,7 +2139,7 @@ int __ceph_setattr(struct inode *inode, struct iattr *attr)
2135 req->r_inode_drop = release; 2139 req->r_inode_drop = release;
2136 req->r_args.setattr.mask = cpu_to_le32(mask); 2140 req->r_args.setattr.mask = cpu_to_le32(mask);
2137 req->r_num_caps = 1; 2141 req->r_num_caps = 1;
2138 req->r_stamp = attr->ia_ctime; 2142 req->r_stamp = timespec64_to_timespec(attr->ia_ctime);
2139 err = ceph_mdsc_do_request(mdsc, NULL, req); 2143 err = ceph_mdsc_do_request(mdsc, NULL, req);
2140 } 2144 }
2141 dout("setattr %p result=%d (%s locally, %d remote)\n", inode, err, 2145 dout("setattr %p result=%d (%s locally, %d remote)\n", inode, err,