diff options
author | Yan, Zheng <zheng.z.yan@intel.com> | 2013-01-04 01:37:57 -0500 |
---|---|---|
committer | Alex Elder <elder@inktank.com> | 2013-01-17 13:42:38 -0500 |
commit | 395c312b9c535d57db122cbb5b7292223561d0b8 (patch) | |
tree | 271b19e34402b0f0dc11911d0b185dc53c57b4c5 /fs/ceph/caps.c | |
parent | 8a92a119b292012a9bd920b908c3e9f1c512291d (diff) |
ceph: allow revoking duplicated caps issued by non-auth MDS
Allow revoking duplicated caps issued by non-auth MDS if these caps
are also issued by auth MDS.
Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
Reviewed-by: Sage Weil <sage@inktank.com>
Diffstat (limited to 'fs/ceph/caps.c')
-rw-r--r-- | fs/ceph/caps.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index a9fe2d5784c9..76b19239c426 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c | |||
@@ -1468,7 +1468,7 @@ void ceph_check_caps(struct ceph_inode_info *ci, int flags, | |||
1468 | struct ceph_mds_client *mdsc = fsc->mdsc; | 1468 | struct ceph_mds_client *mdsc = fsc->mdsc; |
1469 | struct inode *inode = &ci->vfs_inode; | 1469 | struct inode *inode = &ci->vfs_inode; |
1470 | struct ceph_cap *cap; | 1470 | struct ceph_cap *cap; |
1471 | int file_wanted, used; | 1471 | int file_wanted, used, cap_used; |
1472 | int took_snap_rwsem = 0; /* true if mdsc->snap_rwsem held */ | 1472 | int took_snap_rwsem = 0; /* true if mdsc->snap_rwsem held */ |
1473 | int issued, implemented, want, retain, revoking, flushing = 0; | 1473 | int issued, implemented, want, retain, revoking, flushing = 0; |
1474 | int mds = -1; /* keep track of how far we've gone through i_caps list | 1474 | int mds = -1; /* keep track of how far we've gone through i_caps list |
@@ -1571,9 +1571,14 @@ retry_locked: | |||
1571 | 1571 | ||
1572 | /* NOTE: no side-effects allowed, until we take s_mutex */ | 1572 | /* NOTE: no side-effects allowed, until we take s_mutex */ |
1573 | 1573 | ||
1574 | cap_used = used; | ||
1575 | if (ci->i_auth_cap && cap != ci->i_auth_cap) | ||
1576 | cap_used &= ~ci->i_auth_cap->issued; | ||
1577 | |||
1574 | revoking = cap->implemented & ~cap->issued; | 1578 | revoking = cap->implemented & ~cap->issued; |
1575 | dout(" mds%d cap %p issued %s implemented %s revoking %s\n", | 1579 | dout(" mds%d cap %p used %s issued %s implemented %s revoking %s\n", |
1576 | cap->mds, cap, ceph_cap_string(cap->issued), | 1580 | cap->mds, cap, ceph_cap_string(cap->issued), |
1581 | ceph_cap_string(cap_used), | ||
1577 | ceph_cap_string(cap->implemented), | 1582 | ceph_cap_string(cap->implemented), |
1578 | ceph_cap_string(revoking)); | 1583 | ceph_cap_string(revoking)); |
1579 | 1584 | ||
@@ -1601,7 +1606,7 @@ retry_locked: | |||
1601 | } | 1606 | } |
1602 | 1607 | ||
1603 | /* completed revocation? going down and there are no caps? */ | 1608 | /* completed revocation? going down and there are no caps? */ |
1604 | if (revoking && (revoking & used) == 0) { | 1609 | if (revoking && (revoking & cap_used) == 0) { |
1605 | dout("completed revocation of %s\n", | 1610 | dout("completed revocation of %s\n", |
1606 | ceph_cap_string(cap->implemented & ~cap->issued)); | 1611 | ceph_cap_string(cap->implemented & ~cap->issued)); |
1607 | goto ack; | 1612 | goto ack; |
@@ -1678,8 +1683,8 @@ ack: | |||
1678 | sent++; | 1683 | sent++; |
1679 | 1684 | ||
1680 | /* __send_cap drops i_ceph_lock */ | 1685 | /* __send_cap drops i_ceph_lock */ |
1681 | delayed += __send_cap(mdsc, cap, CEPH_CAP_OP_UPDATE, used, want, | 1686 | delayed += __send_cap(mdsc, cap, CEPH_CAP_OP_UPDATE, cap_used, |
1682 | retain, flushing, NULL); | 1687 | want, retain, flushing, NULL); |
1683 | goto retry; /* retake i_ceph_lock and restart our cap scan. */ | 1688 | goto retry; /* retake i_ceph_lock and restart our cap scan. */ |
1684 | } | 1689 | } |
1685 | 1690 | ||