diff options
Diffstat (limited to 'fs/ceph/inode.c')
-rw-r--r-- | fs/ceph/inode.c | 86 |
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, |