Lines Matching refs:mdsc

118 void ceph_caps_init(struct ceph_mds_client *mdsc)  in ceph_caps_init()  argument
120 INIT_LIST_HEAD(&mdsc->caps_list); in ceph_caps_init()
121 spin_lock_init(&mdsc->caps_list_lock); in ceph_caps_init()
124 void ceph_caps_finalize(struct ceph_mds_client *mdsc) in ceph_caps_finalize() argument
128 spin_lock(&mdsc->caps_list_lock); in ceph_caps_finalize()
129 while (!list_empty(&mdsc->caps_list)) { in ceph_caps_finalize()
130 cap = list_first_entry(&mdsc->caps_list, in ceph_caps_finalize()
135 mdsc->caps_total_count = 0; in ceph_caps_finalize()
136 mdsc->caps_avail_count = 0; in ceph_caps_finalize()
137 mdsc->caps_use_count = 0; in ceph_caps_finalize()
138 mdsc->caps_reserve_count = 0; in ceph_caps_finalize()
139 mdsc->caps_min_count = 0; in ceph_caps_finalize()
140 spin_unlock(&mdsc->caps_list_lock); in ceph_caps_finalize()
143 void ceph_adjust_min_caps(struct ceph_mds_client *mdsc, int delta) in ceph_adjust_min_caps() argument
145 spin_lock(&mdsc->caps_list_lock); in ceph_adjust_min_caps()
146 mdsc->caps_min_count += delta; in ceph_adjust_min_caps()
147 BUG_ON(mdsc->caps_min_count < 0); in ceph_adjust_min_caps()
148 spin_unlock(&mdsc->caps_list_lock); in ceph_adjust_min_caps()
151 void ceph_reserve_caps(struct ceph_mds_client *mdsc, in ceph_reserve_caps() argument
163 spin_lock(&mdsc->caps_list_lock); in ceph_reserve_caps()
164 if (mdsc->caps_avail_count >= need) in ceph_reserve_caps()
167 have = mdsc->caps_avail_count; in ceph_reserve_caps()
168 mdsc->caps_avail_count -= have; in ceph_reserve_caps()
169 mdsc->caps_reserve_count += have; in ceph_reserve_caps()
170 BUG_ON(mdsc->caps_total_count != mdsc->caps_use_count + in ceph_reserve_caps()
171 mdsc->caps_reserve_count + in ceph_reserve_caps()
172 mdsc->caps_avail_count); in ceph_reserve_caps()
173 spin_unlock(&mdsc->caps_list_lock); in ceph_reserve_caps()
187 spin_lock(&mdsc->caps_list_lock); in ceph_reserve_caps()
188 mdsc->caps_total_count += alloc; in ceph_reserve_caps()
189 mdsc->caps_reserve_count += alloc; in ceph_reserve_caps()
190 list_splice(&newcaps, &mdsc->caps_list); in ceph_reserve_caps()
192 BUG_ON(mdsc->caps_total_count != mdsc->caps_use_count + in ceph_reserve_caps()
193 mdsc->caps_reserve_count + in ceph_reserve_caps()
194 mdsc->caps_avail_count); in ceph_reserve_caps()
195 spin_unlock(&mdsc->caps_list_lock); in ceph_reserve_caps()
199 ctx, mdsc->caps_total_count, mdsc->caps_use_count, in ceph_reserve_caps()
200 mdsc->caps_reserve_count, mdsc->caps_avail_count); in ceph_reserve_caps()
203 int ceph_unreserve_caps(struct ceph_mds_client *mdsc, in ceph_unreserve_caps() argument
208 spin_lock(&mdsc->caps_list_lock); in ceph_unreserve_caps()
209 BUG_ON(mdsc->caps_reserve_count < ctx->count); in ceph_unreserve_caps()
210 mdsc->caps_reserve_count -= ctx->count; in ceph_unreserve_caps()
211 mdsc->caps_avail_count += ctx->count; in ceph_unreserve_caps()
214 mdsc->caps_total_count, mdsc->caps_use_count, in ceph_unreserve_caps()
215 mdsc->caps_reserve_count, mdsc->caps_avail_count); in ceph_unreserve_caps()
216 BUG_ON(mdsc->caps_total_count != mdsc->caps_use_count + in ceph_unreserve_caps()
217 mdsc->caps_reserve_count + in ceph_unreserve_caps()
218 mdsc->caps_avail_count); in ceph_unreserve_caps()
219 spin_unlock(&mdsc->caps_list_lock); in ceph_unreserve_caps()
224 struct ceph_cap *ceph_get_cap(struct ceph_mds_client *mdsc, in ceph_get_cap() argument
233 spin_lock(&mdsc->caps_list_lock); in ceph_get_cap()
234 mdsc->caps_use_count++; in ceph_get_cap()
235 mdsc->caps_total_count++; in ceph_get_cap()
236 spin_unlock(&mdsc->caps_list_lock); in ceph_get_cap()
241 spin_lock(&mdsc->caps_list_lock); in ceph_get_cap()
243 ctx, ctx->count, mdsc->caps_total_count, mdsc->caps_use_count, in ceph_get_cap()
244 mdsc->caps_reserve_count, mdsc->caps_avail_count); in ceph_get_cap()
246 BUG_ON(ctx->count > mdsc->caps_reserve_count); in ceph_get_cap()
247 BUG_ON(list_empty(&mdsc->caps_list)); in ceph_get_cap()
250 mdsc->caps_reserve_count--; in ceph_get_cap()
251 mdsc->caps_use_count++; in ceph_get_cap()
253 cap = list_first_entry(&mdsc->caps_list, struct ceph_cap, caps_item); in ceph_get_cap()
256 BUG_ON(mdsc->caps_total_count != mdsc->caps_use_count + in ceph_get_cap()
257 mdsc->caps_reserve_count + mdsc->caps_avail_count); in ceph_get_cap()
258 spin_unlock(&mdsc->caps_list_lock); in ceph_get_cap()
262 void ceph_put_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap) in ceph_put_cap() argument
264 spin_lock(&mdsc->caps_list_lock); in ceph_put_cap()
266 cap, mdsc->caps_total_count, mdsc->caps_use_count, in ceph_put_cap()
267 mdsc->caps_reserve_count, mdsc->caps_avail_count); in ceph_put_cap()
268 mdsc->caps_use_count--; in ceph_put_cap()
273 if (mdsc->caps_avail_count >= mdsc->caps_reserve_count + in ceph_put_cap()
274 mdsc->caps_min_count) { in ceph_put_cap()
275 mdsc->caps_total_count--; in ceph_put_cap()
278 mdsc->caps_avail_count++; in ceph_put_cap()
279 list_add(&cap->caps_item, &mdsc->caps_list); in ceph_put_cap()
282 BUG_ON(mdsc->caps_total_count != mdsc->caps_use_count + in ceph_put_cap()
283 mdsc->caps_reserve_count + mdsc->caps_avail_count); in ceph_put_cap()
284 spin_unlock(&mdsc->caps_list_lock); in ceph_put_cap()
291 struct ceph_mds_client *mdsc = fsc->mdsc; in ceph_reservation_status() local
294 *total = mdsc->caps_total_count; in ceph_reservation_status()
296 *avail = mdsc->caps_avail_count; in ceph_reservation_status()
298 *used = mdsc->caps_use_count; in ceph_reservation_status()
300 *reserved = mdsc->caps_reserve_count; in ceph_reservation_status()
302 *min = mdsc->caps_min_count; in ceph_reservation_status()
397 static void __cap_set_timeouts(struct ceph_mds_client *mdsc, in __cap_set_timeouts() argument
400 struct ceph_mount_options *ma = mdsc->fsc->mount_options; in __cap_set_timeouts()
418 static void __cap_delay_requeue(struct ceph_mds_client *mdsc, in __cap_delay_requeue() argument
421 __cap_set_timeouts(mdsc, ci); in __cap_delay_requeue()
424 if (!mdsc->stopping) { in __cap_delay_requeue()
425 spin_lock(&mdsc->cap_delay_lock); in __cap_delay_requeue()
431 list_add_tail(&ci->i_cap_delay_list, &mdsc->cap_delay_list); in __cap_delay_requeue()
433 spin_unlock(&mdsc->cap_delay_lock); in __cap_delay_requeue()
442 static void __cap_delay_requeue_front(struct ceph_mds_client *mdsc, in __cap_delay_requeue_front() argument
446 spin_lock(&mdsc->cap_delay_lock); in __cap_delay_requeue_front()
450 list_add(&ci->i_cap_delay_list, &mdsc->cap_delay_list); in __cap_delay_requeue_front()
451 spin_unlock(&mdsc->cap_delay_lock); in __cap_delay_requeue_front()
459 static void __cap_delay_cancel(struct ceph_mds_client *mdsc, in __cap_delay_cancel() argument
465 spin_lock(&mdsc->cap_delay_lock); in __cap_delay_cancel()
467 spin_unlock(&mdsc->cap_delay_lock); in __cap_delay_cancel()
517 struct ceph_mds_client *mdsc = ceph_inode_to_client(inode)->mdsc; in ceph_add_cap() local
577 struct ceph_snap_realm *realm = ceph_lookup_snap_realm(mdsc, in ceph_add_cap()
605 __cap_delay_requeue(mdsc, ci); in ceph_add_cap()
907 ceph_put_snap_realm(ceph_sb_to_client(ci->vfs_inode.i_sb)->mdsc, in drop_inode_snap_realm()
921 struct ceph_mds_client *mdsc = in __ceph_remove_cap() local
922 ceph_sb_to_client(ci->vfs_inode.i_sb)->mdsc; in __ceph_remove_cap()
959 ceph_put_cap(mdsc, cap); in __ceph_remove_cap()
969 __cap_delay_cancel(mdsc, ci); in __ceph_remove_cap()
1128 static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap, in __send_cap() argument
1277 struct ceph_mds_client *mdsc = ceph_inode_to_client(inode)->mdsc; in __ceph_flush_snaps() local
1329 mutex_lock(&mdsc->mutex); in __ceph_flush_snaps()
1330 session = __ceph_lookup_mds_session(mdsc, mds); in __ceph_flush_snaps()
1331 mutex_unlock(&mdsc->mutex); in __ceph_flush_snaps()
1374 spin_lock(&mdsc->snap_flush_lock); in __ceph_flush_snaps()
1376 spin_unlock(&mdsc->snap_flush_lock); in __ceph_flush_snaps()
1401 struct ceph_mds_client *mdsc = in __ceph_mark_dirty_caps() local
1402 ceph_sb_to_client(ci->vfs_inode.i_sb)->mdsc; in __ceph_mark_dirty_caps()
1425 spin_lock(&mdsc->cap_dirty_lock); in __ceph_mark_dirty_caps()
1426 list_add(&ci->i_dirty_item, &mdsc->cap_dirty); in __ceph_mark_dirty_caps()
1427 spin_unlock(&mdsc->cap_dirty_lock); in __ceph_mark_dirty_caps()
1437 __cap_delay_requeue(mdsc, ci); in __ceph_mark_dirty_caps()
1450 struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc; in __mark_caps_flushing() local
1466 spin_lock(&mdsc->cap_dirty_lock); in __mark_caps_flushing()
1470 ci->i_cap_flush_seq = ++mdsc->cap_flush_seq; in __mark_caps_flushing()
1472 mdsc->num_cap_flushing++; in __mark_caps_flushing()
1480 spin_unlock(&mdsc->cap_dirty_lock); in __mark_caps_flushing()
1524 struct ceph_mds_client *mdsc = fsc->mdsc; in ceph_check_caps() local
1539 if (mdsc->stopping) in ceph_check_caps()
1561 if (!mdsc->stopping && inode->i_nlink > 0) { in ceph_check_caps()
1604 if ((!is_delayed || mdsc->stopping) && in ceph_check_caps()
1623 __cap_set_timeouts(mdsc, ci); in ceph_check_caps()
1725 up_read(&mdsc->snap_rwsem); in ceph_check_caps()
1734 if (down_read_trylock(&mdsc->snap_rwsem) == 0) { in ceph_check_caps()
1738 down_read(&mdsc->snap_rwsem); in ceph_check_caps()
1754 delayed += __send_cap(mdsc, cap, CEPH_CAP_OP_UPDATE, cap_used, in ceph_check_caps()
1766 __cap_delay_cancel(mdsc, ci); in ceph_check_caps()
1768 __cap_delay_requeue(mdsc, ci); in ceph_check_caps()
1778 up_read(&mdsc->snap_rwsem); in ceph_check_caps()
1786 struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc; in try_flush_caps() local
1817 delayed = __send_cap(mdsc, cap, CEPH_CAP_OP_FLUSH, used, want, in try_flush_caps()
1824 __cap_delay_requeue(mdsc, ci); in try_flush_caps()
1954 struct ceph_mds_client *mdsc = in ceph_write_inode() local
1955 ceph_sb_to_client(inode->i_sb)->mdsc; in ceph_write_inode()
1959 __cap_delay_requeue_front(mdsc, ci); in ceph_write_inode()
1971 static void kick_flushing_capsnaps(struct ceph_mds_client *mdsc, in kick_flushing_capsnaps() argument
1997 void ceph_kick_flushing_caps(struct ceph_mds_client *mdsc, in ceph_kick_flushing_caps() argument
2002 kick_flushing_capsnaps(mdsc, session); in ceph_kick_flushing_caps()
2015 delayed = __send_cap(mdsc, cap, CEPH_CAP_OP_FLUSH, in ceph_kick_flushing_caps()
2022 __cap_delay_requeue(mdsc, ci); in ceph_kick_flushing_caps()
2033 static void kick_flushing_inode_caps(struct ceph_mds_client *mdsc, in kick_flushing_inode_caps() argument
2049 spin_lock(&mdsc->cap_dirty_lock); in kick_flushing_inode_caps()
2052 spin_unlock(&mdsc->cap_dirty_lock); in kick_flushing_inode_caps()
2054 delayed = __send_cap(mdsc, cap, CEPH_CAP_OP_FLUSH, in kick_flushing_inode_caps()
2061 __cap_delay_requeue(mdsc, ci); in kick_flushing_inode_caps()
2476 static void handle_cap_grant(struct ceph_mds_client *mdsc, in handle_cap_grant() argument
2484 __releases(mdsc->snap_rwsem) in handle_cap_grant()
2685 kick_flushing_inode_caps(mdsc, session, inode); in handle_cap_grant()
2686 up_read(&mdsc->snap_rwsem); in handle_cap_grant()
2734 struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc; in handle_cap_flush_ack() local
2757 spin_lock(&mdsc->cap_dirty_lock); in handle_cap_flush_ack()
2766 mdsc->num_cap_flushing--; in handle_cap_flush_ack()
2767 wake_up_all(&mdsc->cap_flushing_wq); in handle_cap_flush_ack()
2783 spin_unlock(&mdsc->cap_dirty_lock); in handle_cap_flush_ack()
2885 struct ceph_mds_client *mdsc = ceph_inode_to_client(inode)->mdsc; in handle_cap_export() local
2941 spin_lock(&mdsc->cap_dirty_lock); in handle_cap_export()
2944 spin_unlock(&mdsc->cap_dirty_lock); in handle_cap_export()
2963 tsession = ceph_mdsc_open_export_target_session(mdsc, target); in handle_cap_export()
2974 ceph_add_cap_releases(mdsc, tsession); in handle_cap_export()
2975 new_cap = ceph_get_cap(mdsc, NULL); in handle_cap_export()
2991 ceph_put_cap(mdsc, new_cap); in handle_cap_export()
2999 static void handle_cap_import(struct ceph_mds_client *mdsc, in handle_cap_import() argument
3036 new_cap = ceph_get_cap(mdsc, NULL); in handle_cap_import()
3042 ceph_put_cap(mdsc, new_cap); in handle_cap_import()
3087 struct ceph_mds_client *mdsc = session->s_mdsc; in ceph_handle_caps() local
3088 struct super_block *sb = mdsc->fsc->sb; in ceph_handle_caps()
3171 ceph_add_cap_releases(mdsc, session); in ceph_handle_caps()
3198 down_write(&mdsc->snap_rwsem); in ceph_handle_caps()
3199 ceph_update_snap_trace(mdsc, snaptrace, in ceph_handle_caps()
3202 downgrade_write(&mdsc->snap_rwsem); in ceph_handle_caps()
3204 down_read(&mdsc->snap_rwsem); in ceph_handle_caps()
3206 handle_cap_import(mdsc, inode, h, peer, session, in ceph_handle_caps()
3208 handle_cap_grant(mdsc, inode, h, in ceph_handle_caps()
3212 ceph_put_snap_realm(mdsc, realm); in ceph_handle_caps()
3232 handle_cap_grant(mdsc, inode, h, in ceph_handle_caps()
3259 ceph_add_cap_releases(mdsc, session); in ceph_handle_caps()
3260 ceph_send_cap_releases(mdsc, session); in ceph_handle_caps()
3277 void ceph_check_delayed_caps(struct ceph_mds_client *mdsc) in ceph_check_delayed_caps() argument
3284 spin_lock(&mdsc->cap_delay_lock); in ceph_check_delayed_caps()
3285 if (list_empty(&mdsc->cap_delay_list)) in ceph_check_delayed_caps()
3287 ci = list_first_entry(&mdsc->cap_delay_list, in ceph_check_delayed_caps()
3294 spin_unlock(&mdsc->cap_delay_lock); in ceph_check_delayed_caps()
3298 spin_unlock(&mdsc->cap_delay_lock); in ceph_check_delayed_caps()
3304 void ceph_flush_dirty_caps(struct ceph_mds_client *mdsc) in ceph_flush_dirty_caps() argument
3310 spin_lock(&mdsc->cap_dirty_lock); in ceph_flush_dirty_caps()
3311 while (!list_empty(&mdsc->cap_dirty)) { in ceph_flush_dirty_caps()
3312 ci = list_first_entry(&mdsc->cap_dirty, struct ceph_inode_info, in ceph_flush_dirty_caps()
3317 spin_unlock(&mdsc->cap_dirty_lock); in ceph_flush_dirty_caps()
3320 spin_lock(&mdsc->cap_dirty_lock); in ceph_flush_dirty_caps()
3322 spin_unlock(&mdsc->cap_dirty_lock); in ceph_flush_dirty_caps()