struct ceph_mds_request *req;
struct ceph_mds_client *mdsc = &ceph_client(dentry->d_sb)->mdsc;
int issued;
- int dirtied = 0;
+ int release = 0, dirtied = 0;
int mask = 0;
int err = 0;
attr->ia_uid != inode->i_uid) {
req->r_args.setattr.uid = cpu_to_le32(attr->ia_uid);
mask |= CEPH_SETATTR_UID;
+ release |= CEPH_CAP_AUTH_RDCACHE;
}
}
if (ia_valid & ATTR_GID) {
attr->ia_gid != inode->i_gid) {
req->r_args.setattr.gid = cpu_to_le32(attr->ia_gid);
mask |= CEPH_SETATTR_GID;
+ release |= CEPH_CAP_AUTH_RDCACHE;
}
}
if (ia_valid & ATTR_MODE) {
attr->ia_mode != inode->i_mode) {
req->r_args.setattr.mode = cpu_to_le32(attr->ia_mode);
mask |= CEPH_SETATTR_MODE;
+ release |= CEPH_CAP_AUTH_RDCACHE;
}
}
ceph_encode_timespec(&req->r_args.setattr.atime,
&attr->ia_atime);
mask |= CEPH_SETATTR_ATIME;
+ release |= CEPH_CAP_FILE_RDCACHE;
}
}
if (ia_valid & ATTR_MTIME) {
ceph_encode_timespec(&req->r_args.setattr.mtime,
&attr->ia_mtime);
mask |= CEPH_SETATTR_MTIME;
+ release |= CEPH_CAP_FILE_RDCACHE;
}
}
if (ia_valid & ATTR_SIZE) {
req->r_args.setattr.old_size =
cpu_to_le64(inode->i_size);
mask |= CEPH_SETATTR_SIZE;
+ release |= CEPH_CAP_FILE_RDCACHE;
}
}
}
inode->i_ctime = CURRENT_TIME;
}
+
+ release &= issued;
spin_unlock(&inode->i_lock);
if (mask) {
+ if (release)
+ ceph_release_caps(inode, release);
req->r_inode = igrab(inode);
req->r_args.setattr.mask = mask;
req->r_num_caps = 1;