diff options
Diffstat (limited to 'fs/ceph/inode.c')
-rw-r--r-- | fs/ceph/inode.c | 49 |
1 files changed, 31 insertions, 18 deletions
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 524b80be4482..bf1286588f26 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c | |||
@@ -470,7 +470,9 @@ void ceph_fill_file_time(struct inode *inode, int issued, | |||
470 | 470 | ||
471 | if (issued & (CEPH_CAP_FILE_EXCL| | 471 | if (issued & (CEPH_CAP_FILE_EXCL| |
472 | CEPH_CAP_FILE_WR| | 472 | CEPH_CAP_FILE_WR| |
473 | CEPH_CAP_FILE_BUFFER)) { | 473 | CEPH_CAP_FILE_BUFFER| |
474 | CEPH_CAP_AUTH_EXCL| | ||
475 | CEPH_CAP_XATTR_EXCL)) { | ||
474 | if (timespec_compare(ctime, &inode->i_ctime) > 0) { | 476 | if (timespec_compare(ctime, &inode->i_ctime) > 0) { |
475 | dout("ctime %ld.%09ld -> %ld.%09ld inc w/ cap\n", | 477 | dout("ctime %ld.%09ld -> %ld.%09ld inc w/ cap\n", |
476 | inode->i_ctime.tv_sec, inode->i_ctime.tv_nsec, | 478 | inode->i_ctime.tv_sec, inode->i_ctime.tv_nsec, |
@@ -510,7 +512,7 @@ void ceph_fill_file_time(struct inode *inode, int issued, | |||
510 | warn = 1; | 512 | warn = 1; |
511 | } | 513 | } |
512 | } else { | 514 | } else { |
513 | /* we have no write caps; whatever the MDS says is true */ | 515 | /* we have no write|excl caps; whatever the MDS says is true */ |
514 | if (ceph_seq_cmp(time_warp_seq, ci->i_time_warp_seq) >= 0) { | 516 | if (ceph_seq_cmp(time_warp_seq, ci->i_time_warp_seq) >= 0) { |
515 | inode->i_ctime = *ctime; | 517 | inode->i_ctime = *ctime; |
516 | inode->i_mtime = *mtime; | 518 | inode->i_mtime = *mtime; |
@@ -566,12 +568,17 @@ static int fill_inode(struct inode *inode, | |||
566 | 568 | ||
567 | /* | 569 | /* |
568 | * provided version will be odd if inode value is projected, | 570 | * provided version will be odd if inode value is projected, |
569 | * even if stable. skip the update if we have a newer info | 571 | * even if stable. skip the update if we have newer stable |
570 | * (e.g., due to inode info racing form multiple MDSs), or if | 572 | * info (ours>=theirs, e.g. due to racing mds replies), unless |
571 | * we are getting projected (unstable) inode info. | 573 | * we are getting projected (unstable) info (in which case the |
574 | * version is odd, and we want ours>theirs). | ||
575 | * us them | ||
576 | * 2 2 skip | ||
577 | * 3 2 skip | ||
578 | * 3 3 update | ||
572 | */ | 579 | */ |
573 | if (le64_to_cpu(info->version) > 0 && | 580 | if (le64_to_cpu(info->version) > 0 && |
574 | (ci->i_version & ~1) > le64_to_cpu(info->version)) | 581 | (ci->i_version & ~1) >= le64_to_cpu(info->version)) |
575 | goto no_change; | 582 | goto no_change; |
576 | 583 | ||
577 | issued = __ceph_caps_issued(ci, &implemented); | 584 | issued = __ceph_caps_issued(ci, &implemented); |
@@ -605,7 +612,14 @@ static int fill_inode(struct inode *inode, | |||
605 | le32_to_cpu(info->time_warp_seq), | 612 | le32_to_cpu(info->time_warp_seq), |
606 | &ctime, &mtime, &atime); | 613 | &ctime, &mtime, &atime); |
607 | 614 | ||
608 | ci->i_max_size = le64_to_cpu(info->max_size); | 615 | /* only update max_size on auth cap */ |
616 | if ((info->cap.flags & CEPH_CAP_FLAG_AUTH) && | ||
617 | ci->i_max_size != le64_to_cpu(info->max_size)) { | ||
618 | dout("max_size %lld -> %llu\n", ci->i_max_size, | ||
619 | le64_to_cpu(info->max_size)); | ||
620 | ci->i_max_size = le64_to_cpu(info->max_size); | ||
621 | } | ||
622 | |||
609 | ci->i_layout = info->layout; | 623 | ci->i_layout = info->layout; |
610 | inode->i_blkbits = fls(le32_to_cpu(info->layout.fl_stripe_unit)) - 1; | 624 | inode->i_blkbits = fls(le32_to_cpu(info->layout.fl_stripe_unit)) - 1; |
611 | 625 | ||
@@ -1054,7 +1068,8 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req, | |||
1054 | ininfo = rinfo->targeti.in; | 1068 | ininfo = rinfo->targeti.in; |
1055 | vino.ino = le64_to_cpu(ininfo->ino); | 1069 | vino.ino = le64_to_cpu(ininfo->ino); |
1056 | vino.snap = le64_to_cpu(ininfo->snapid); | 1070 | vino.snap = le64_to_cpu(ininfo->snapid); |
1057 | if (!dn->d_inode) { | 1071 | in = dn->d_inode; |
1072 | if (!in) { | ||
1058 | in = ceph_get_inode(sb, vino); | 1073 | in = ceph_get_inode(sb, vino); |
1059 | if (IS_ERR(in)) { | 1074 | if (IS_ERR(in)) { |
1060 | pr_err("fill_trace bad get_inode " | 1075 | pr_err("fill_trace bad get_inode " |
@@ -1385,11 +1400,8 @@ static void ceph_invalidate_work(struct work_struct *work) | |||
1385 | spin_lock(&inode->i_lock); | 1400 | spin_lock(&inode->i_lock); |
1386 | dout("invalidate_pages %p gen %d revoking %d\n", inode, | 1401 | dout("invalidate_pages %p gen %d revoking %d\n", inode, |
1387 | ci->i_rdcache_gen, ci->i_rdcache_revoking); | 1402 | ci->i_rdcache_gen, ci->i_rdcache_revoking); |
1388 | if (ci->i_rdcache_gen == 0 || | 1403 | if (ci->i_rdcache_revoking != ci->i_rdcache_gen) { |
1389 | ci->i_rdcache_revoking != ci->i_rdcache_gen) { | ||
1390 | BUG_ON(ci->i_rdcache_revoking > ci->i_rdcache_gen); | ||
1391 | /* nevermind! */ | 1404 | /* nevermind! */ |
1392 | ci->i_rdcache_revoking = 0; | ||
1393 | spin_unlock(&inode->i_lock); | 1405 | spin_unlock(&inode->i_lock); |
1394 | goto out; | 1406 | goto out; |
1395 | } | 1407 | } |
@@ -1399,15 +1411,16 @@ static void ceph_invalidate_work(struct work_struct *work) | |||
1399 | ceph_invalidate_nondirty_pages(inode->i_mapping); | 1411 | ceph_invalidate_nondirty_pages(inode->i_mapping); |
1400 | 1412 | ||
1401 | spin_lock(&inode->i_lock); | 1413 | spin_lock(&inode->i_lock); |
1402 | if (orig_gen == ci->i_rdcache_gen) { | 1414 | if (orig_gen == ci->i_rdcache_gen && |
1415 | orig_gen == ci->i_rdcache_revoking) { | ||
1403 | dout("invalidate_pages %p gen %d successful\n", inode, | 1416 | dout("invalidate_pages %p gen %d successful\n", inode, |
1404 | ci->i_rdcache_gen); | 1417 | ci->i_rdcache_gen); |
1405 | ci->i_rdcache_gen = 0; | 1418 | ci->i_rdcache_revoking--; |
1406 | ci->i_rdcache_revoking = 0; | ||
1407 | check = 1; | 1419 | check = 1; |
1408 | } else { | 1420 | } else { |
1409 | dout("invalidate_pages %p gen %d raced, gen now %d\n", | 1421 | dout("invalidate_pages %p gen %d raced, now %d revoking %d\n", |
1410 | inode, orig_gen, ci->i_rdcache_gen); | 1422 | inode, orig_gen, ci->i_rdcache_gen, |
1423 | ci->i_rdcache_revoking); | ||
1411 | } | 1424 | } |
1412 | spin_unlock(&inode->i_lock); | 1425 | spin_unlock(&inode->i_lock); |
1413 | 1426 | ||
@@ -1738,7 +1751,7 @@ int ceph_do_getattr(struct inode *inode, int mask) | |||
1738 | return 0; | 1751 | return 0; |
1739 | } | 1752 | } |
1740 | 1753 | ||
1741 | dout("do_getattr inode %p mask %s\n", inode, ceph_cap_string(mask)); | 1754 | dout("do_getattr inode %p mask %s mode 0%o\n", inode, ceph_cap_string(mask), inode->i_mode); |
1742 | if (ceph_caps_issued_mask(ceph_inode(inode), mask, 1)) | 1755 | if (ceph_caps_issued_mask(ceph_inode(inode), mask, 1)) |
1743 | return 0; | 1756 | return 0; |
1744 | 1757 | ||