Skip to content

Commit

Permalink
ceph: fix xattr cap writeback
Browse files Browse the repository at this point in the history
We should include the xattr metadata blob in the cap update message any
time we are flushing dirty state, NOT just when we are also dropping the
cap.  This fixes async xattr writeback.

Also, clean up the code slightly to avoid duplicating the bit test.

Signed-off-by: Sage Weil <sage@newdream.net>
  • Loading branch information
Sage Weil committed Aug 22, 2010
1 parent f3c60c5 commit 082afec
Showing 1 changed file with 5 additions and 5 deletions.
10 changes: 5 additions & 5 deletions fs/ceph/caps.c
Original file line number Diff line number Diff line change
Expand Up @@ -1082,6 +1082,7 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap,
gid_t gid;
struct ceph_mds_session *session;
u64 xattr_version = 0;
struct ceph_buffer *xattr_blob = NULL;
int delayed = 0;
u64 flush_tid = 0;
int i;
Expand Down Expand Up @@ -1160,19 +1161,18 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap,
gid = inode->i_gid;
mode = inode->i_mode;

if (dropping & CEPH_CAP_XATTR_EXCL) {
if (flushing & CEPH_CAP_XATTR_EXCL) {
__ceph_build_xattrs_blob(ci);
xattr_version = ci->i_xattrs.version + 1;
xattr_blob = ci->i_xattrs.blob;
xattr_version = ci->i_xattrs.version;
}

spin_unlock(&inode->i_lock);

ret = send_cap_msg(session, ceph_vino(inode).ino, cap_id,
op, keep, want, flushing, seq, flush_tid, issue_seq, mseq,
size, max_size, &mtime, &atime, time_warp_seq,
uid, gid, mode,
xattr_version,
(flushing & CEPH_CAP_XATTR_EXCL) ? ci->i_xattrs.blob : NULL,
uid, gid, mode, xattr_version, xattr_blob,
follows);
if (ret < 0) {
dout("error sending cap msg, must requeue %p\n", inode);
Expand Down

0 comments on commit 082afec

Please sign in to comment.