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