From 94e3abfe2826a4bddbdc5d9494dd04e1d7a7d3d6 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Sun, 4 Jan 2009 11:38:31 -0800 Subject: [PATCH] client: do not update when already holding EXCL cap --- src/client/Client.cc | 33 ++++++++++++++++++--------------- src/kernel/inode.c | 19 +++++++++++++------ 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index a4cbeac826f37..89f90d58466c4 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -385,6 +385,8 @@ void Client::update_inode(Inode *in, InodeStat *st, utime_t from, int mds) //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)); @@ -392,27 +394,28 @@ void Client::update_inode(Inode *in, InodeStat *st, utime_t from, int mds) 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; diff --git a/src/kernel/inode.c b/src/kernel/inode.c index 3821caf958217..fb3e5672f0eab 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -417,20 +417,27 @@ static int fill_inode(struct inode *inode, 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), @@ -442,7 +449,7 @@ static int fill_inode(struct inode *inode, 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; -- 2.39.5