@@ -1114,17 +1114,16 @@ void __ceph_remove_cap(struct ceph_cap *cap, bool queue_release)
1114
1114
return ;
1115
1115
}
1116
1116
1117
+ lockdep_assert_held (& ci -> i_ceph_lock );
1118
+
1117
1119
dout ("__ceph_remove_cap %p from %p\n" , cap , & ci -> vfs_inode );
1118
1120
1119
1121
mdsc = ceph_inode_to_client (& ci -> vfs_inode )-> mdsc ;
1120
1122
1121
1123
/* remove from inode's cap rbtree, and clear auth cap */
1122
1124
rb_erase (& cap -> ci_node , & ci -> i_caps );
1123
- if (ci -> i_auth_cap == cap ) {
1124
- WARN_ON_ONCE (!list_empty (& ci -> i_dirty_item ) &&
1125
- !mdsc -> fsc -> blocklisted );
1125
+ if (ci -> i_auth_cap == cap )
1126
1126
ci -> i_auth_cap = NULL ;
1127
- }
1128
1127
1129
1128
/* remove from session list */
1130
1129
spin_lock (& session -> s_cap_lock );
@@ -1176,6 +1175,28 @@ void __ceph_remove_cap(struct ceph_cap *cap, bool queue_release)
1176
1175
}
1177
1176
}
1178
1177
1178
+ void ceph_remove_cap (struct ceph_cap * cap , bool queue_release )
1179
+ {
1180
+ struct ceph_inode_info * ci = cap -> ci ;
1181
+ struct ceph_fs_client * fsc ;
1182
+
1183
+ /* 'ci' being NULL means the remove have already occurred */
1184
+ if (!ci ) {
1185
+ dout ("%s: cap inode is NULL\n" , __func__ );
1186
+ return ;
1187
+ }
1188
+
1189
+ lockdep_assert_held (& ci -> i_ceph_lock );
1190
+
1191
+ fsc = ceph_sb_to_client (ci -> vfs_inode .i_sb );
1192
+ WARN_ON_ONCE (ci -> i_auth_cap == cap &&
1193
+ !list_empty (& ci -> i_dirty_item ) &&
1194
+ !fsc -> blocklisted &&
1195
+ READ_ONCE (fsc -> mount_state ) != CEPH_MOUNT_SHUTDOWN );
1196
+
1197
+ __ceph_remove_cap (cap , queue_release );
1198
+ }
1199
+
1179
1200
struct cap_msg_args {
1180
1201
struct ceph_mds_session * session ;
1181
1202
u64 ino , cid , follows ;
@@ -1304,7 +1325,7 @@ void __ceph_remove_caps(struct ceph_inode_info *ci)
1304
1325
while (p ) {
1305
1326
struct ceph_cap * cap = rb_entry (p , struct ceph_cap , ci_node );
1306
1327
p = rb_next (p );
1307
- __ceph_remove_cap (cap , true);
1328
+ ceph_remove_cap (cap , true);
1308
1329
}
1309
1330
spin_unlock (& ci -> i_ceph_lock );
1310
1331
}
@@ -3822,7 +3843,7 @@ static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex,
3822
3843
goto out_unlock ;
3823
3844
3824
3845
if (target < 0 ) {
3825
- __ceph_remove_cap (cap , false);
3846
+ ceph_remove_cap (cap , false);
3826
3847
goto out_unlock ;
3827
3848
}
3828
3849
@@ -3857,7 +3878,7 @@ static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex,
3857
3878
change_auth_cap_ses (ci , tcap -> session );
3858
3879
}
3859
3880
}
3860
- __ceph_remove_cap (cap , false);
3881
+ ceph_remove_cap (cap , false);
3861
3882
goto out_unlock ;
3862
3883
} else if (tsession ) {
3863
3884
/* add placeholder for the export tagert */
@@ -3874,7 +3895,7 @@ static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex,
3874
3895
spin_unlock (& mdsc -> cap_dirty_lock );
3875
3896
}
3876
3897
3877
- __ceph_remove_cap (cap , false);
3898
+ ceph_remove_cap (cap , false);
3878
3899
goto out_unlock ;
3879
3900
}
3880
3901
@@ -3985,7 +4006,7 @@ static void handle_cap_import(struct ceph_mds_client *mdsc,
3985
4006
ocap -> mseq , mds , le32_to_cpu (ph -> seq ),
3986
4007
le32_to_cpu (ph -> mseq ));
3987
4008
}
3988
- __ceph_remove_cap (ocap , (ph -> flags & CEPH_CAP_FLAG_RELEASE ));
4009
+ ceph_remove_cap (ocap , (ph -> flags & CEPH_CAP_FLAG_RELEASE ));
3989
4010
}
3990
4011
3991
4012
* old_issued = issued ;
0 commit comments