diff options
| -rw-r--r-- | fs/ceph/dir.c | 34 | ||||
| -rw-r--r-- | fs/ceph/inode.c | 1 |
2 files changed, 35 insertions, 0 deletions
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index c37820bcb66b..d6c13f9c9317 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c | |||
| @@ -1111,6 +1111,40 @@ static int ceph_d_revalidate(struct dentry *dentry, unsigned int flags) | |||
| 1111 | valid = 1; | 1111 | valid = 1; |
| 1112 | } | 1112 | } |
| 1113 | 1113 | ||
| 1114 | if (!valid) { | ||
| 1115 | struct ceph_mds_client *mdsc = | ||
| 1116 | ceph_sb_to_client(dir->i_sb)->mdsc; | ||
| 1117 | struct ceph_mds_request *req; | ||
| 1118 | int op, mask, err; | ||
| 1119 | |||
| 1120 | op = ceph_snap(dir) == CEPH_SNAPDIR ? | ||
| 1121 | CEPH_MDS_OP_LOOKUPSNAP : CEPH_MDS_OP_LOOKUP; | ||
| 1122 | req = ceph_mdsc_create_request(mdsc, op, USE_ANY_MDS); | ||
| 1123 | if (!IS_ERR(req)) { | ||
| 1124 | req->r_dentry = dget(dentry); | ||
| 1125 | req->r_num_caps = 2; | ||
| 1126 | |||
| 1127 | mask = CEPH_STAT_CAP_INODE | CEPH_CAP_AUTH_SHARED; | ||
| 1128 | if (ceph_security_xattr_wanted(dir)) | ||
| 1129 | mask |= CEPH_CAP_XATTR_SHARED; | ||
| 1130 | req->r_args.getattr.mask = mask; | ||
| 1131 | |||
| 1132 | req->r_locked_dir = dir; | ||
| 1133 | err = ceph_mdsc_do_request(mdsc, NULL, req); | ||
| 1134 | if (err == 0 || err == -ENOENT) { | ||
| 1135 | if (dentry == req->r_dentry) { | ||
| 1136 | valid = !d_unhashed(dentry); | ||
| 1137 | } else { | ||
| 1138 | d_invalidate(req->r_dentry); | ||
| 1139 | err = -EAGAIN; | ||
| 1140 | } | ||
| 1141 | } | ||
| 1142 | ceph_mdsc_put_request(req); | ||
| 1143 | dout("d_revalidate %p lookup result=%d\n", | ||
| 1144 | dentry, err); | ||
| 1145 | } | ||
| 1146 | } | ||
| 1147 | |||
| 1114 | dout("d_revalidate %p %s\n", dentry, valid ? "valid" : "invalid"); | 1148 | dout("d_revalidate %p %s\n", dentry, valid ? "valid" : "invalid"); |
| 1115 | if (valid) { | 1149 | if (valid) { |
| 1116 | ceph_dentry_lru_touch(dentry); | 1150 | ceph_dentry_lru_touch(dentry); |
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 8b136dc0bc13..ed58b168904a 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c | |||
| @@ -1265,6 +1265,7 @@ retry_lookup: | |||
| 1265 | dout(" %p links to %p %llx.%llx, not %llx.%llx\n", | 1265 | dout(" %p links to %p %llx.%llx, not %llx.%llx\n", |
| 1266 | dn, d_inode(dn), ceph_vinop(d_inode(dn)), | 1266 | dn, d_inode(dn), ceph_vinop(d_inode(dn)), |
| 1267 | ceph_vinop(in)); | 1267 | ceph_vinop(in)); |
| 1268 | d_invalidate(dn); | ||
| 1268 | have_lease = false; | 1269 | have_lease = false; |
| 1269 | } | 1270 | } |
| 1270 | 1271 | ||
