ceph: fix update of ctime from MDS

The client can have a newer ctime than the MDS due to AUTH_EXCL and
XATTR_EXCL caps as well; update the check in ceph_fill_file_time
appropriately.

This fixes cases where ctime/mtime goes backward under the right sequence
of local updates (e.g. chmod) and mds replies (e.g. subsequent stat that
goes to the MDS).

Signed-off-by: Sage Weil <sage@newdream.net>

Sage Weil d8672d64 8bd59e01

+4 -2
+4 -2
fs/ceph/inode.c
··· 471 472 if (issued & (CEPH_CAP_FILE_EXCL| 473 CEPH_CAP_FILE_WR| 474 - CEPH_CAP_FILE_BUFFER)) { 475 if (timespec_compare(ctime, &inode->i_ctime) > 0) { 476 dout("ctime %ld.%09ld -> %ld.%09ld inc w/ cap\n", 477 inode->i_ctime.tv_sec, inode->i_ctime.tv_nsec, ··· 513 warn = 1; 514 } 515 } else { 516 - /* we have no write caps; whatever the MDS says is true */ 517 if (ceph_seq_cmp(time_warp_seq, ci->i_time_warp_seq) >= 0) { 518 inode->i_ctime = *ctime; 519 inode->i_mtime = *mtime;
··· 471 472 if (issued & (CEPH_CAP_FILE_EXCL| 473 CEPH_CAP_FILE_WR| 474 + CEPH_CAP_FILE_BUFFER| 475 + CEPH_CAP_AUTH_EXCL| 476 + CEPH_CAP_XATTR_EXCL)) { 477 if (timespec_compare(ctime, &inode->i_ctime) > 0) { 478 dout("ctime %ld.%09ld -> %ld.%09ld inc w/ cap\n", 479 inode->i_ctime.tv_sec, inode->i_ctime.tv_nsec, ··· 511 warn = 1; 512 } 513 } else { 514 + /* we have no write|excl caps; whatever the MDS says is true */ 515 if (ceph_seq_cmp(time_warp_seq, ci->i_time_warp_seq) >= 0) { 516 inode->i_ctime = *ctime; 517 inode->i_mtime = *mtime;