//dout(12) << "update_inode mask " << lease->mask << " ttl " << ttl << dendl;
dout(12) << "update_inode caps " << ccap_string(st->cap.caps) << dendl;
+ int issued = in->caps_issued();
+
if (st->cap.caps) {
if (in->snapid == CEPH_NOSNAP)
add_update_cap(in, mds, st->cap.caps, st->cap.seq, st->cap.mseq, inodeno_t(st->cap.realm));
in->snap_caps |= st->cap.caps;
}
}
-
+
if (st->cap.caps & CEPH_CAP_PIN) {
in->inode.ino = st->vino.ino;
in->snapid = st->vino.snapid;
in->inode.rdev = st->rdev;
in->dirfragtree = st->dirfragtree; // FIXME look at the mask!
- }
- if (st->cap.caps & CEPH_CAP_AUTH_RDCACHE) {
- in->inode.mode = st->mode;
- in->inode.uid = st->uid;
- in->inode.gid = st->gid;
- }
- if (st->cap.caps & CEPH_CAP_LINK_RDCACHE) {
- in->inode.nlink = st->nlink;
- in->inode.anchored = false; /* lie */
- }
- if (st->cap.caps & CEPH_CAP_XATTR_RDCACHE) {
- in->xattrs.swap(st->xattrs);
- }
- if (st->cap.caps & CEPH_CAP_PIN) {
+ if ((issued & CEPH_CAP_AUTH_EXCL) == 0) {
+ in->inode.mode = st->mode;
+ in->inode.uid = st->uid;
+ in->inode.gid = st->gid;
+ }
+
+ if ((issued & CEPH_CAP_LINK_EXCL) == 0) {
+ in->inode.nlink = st->nlink;
+ in->inode.anchored = false; /* lie */
+ }
+
+ if ((issued & CEPH_CAP_XATTR_EXCL) == 0) {
+ in->xattrs.swap(st->xattrs);
+ }
+
in->inode.dirstat = st->dirstat;
in->inode.rstat = st->rstat;
ci->i_version == le64_to_cpu(info->version))
goto no_change;
+ issued = __ceph_caps_issued(ci, NULL);
+
/* update inode */
ci->i_version = le64_to_cpu(info->version);
inode->i_version++;
- inode->i_mode = le32_to_cpu(info->mode);
- inode->i_uid = le32_to_cpu(info->uid);
- inode->i_gid = le32_to_cpu(info->gid);
- inode->i_nlink = le32_to_cpu(info->nlink);
inode->i_rdev = le32_to_cpu(info->rdev);
+ if ((issued & CEPH_CAP_AUTH_EXCL) == 0) {
+ inode->i_mode = le32_to_cpu(info->mode);
+ inode->i_uid = le32_to_cpu(info->uid);
+ inode->i_gid = le32_to_cpu(info->gid);
+ }
+
+ if ((issued & CEPH_CAP_LINK_EXCL) == 0) {
+ inode->i_nlink = le32_to_cpu(info->nlink);
+ }
+
/* be careful with mtime, atime, size */
ceph_decode_timespec(&atime, &info->atime);
ceph_decode_timespec(&mtime, &info->mtime);
ceph_decode_timespec(&ctime, &info->ctime);
- issued = __ceph_caps_issued(ci, NULL);
ceph_fill_file_bits(inode, issued,
le64_to_cpu(info->truncate_seq),
le64_to_cpu(info->size),
inode->i_blkbits = fls(le32_to_cpu(info->layout.fl_stripe_unit)) - 1;
/* xattrs */
- if (iinfo->xattr_len) {
+ if (iinfo->xattr_len && (issued & CEPH_CAP_XATTR_EXCL) == 0) {
if (ci->i_xattr_len != iinfo->xattr_len) {
kfree(ci->i_xattr_data);
ci->i_xattr_len = iinfo->xattr_len;