@@ -148,11 +148,17 @@ void ceph_caps_finalize(struct ceph_mds_client *mdsc)
148148 spin_unlock (& mdsc -> caps_list_lock );
149149}
150150
151- void ceph_adjust_min_caps (struct ceph_mds_client * mdsc , int delta )
151+ void ceph_adjust_caps_max_min (struct ceph_mds_client * mdsc ,
152+ struct ceph_mount_options * fsopt )
152153{
153154 spin_lock (& mdsc -> caps_list_lock );
154- mdsc -> caps_min_count += delta ;
155- BUG_ON (mdsc -> caps_min_count < 0 );
155+ mdsc -> caps_min_count = fsopt -> max_readdir ;
156+ if (mdsc -> caps_min_count < 1024 )
157+ mdsc -> caps_min_count = 1024 ;
158+ mdsc -> caps_use_max = fsopt -> caps_max ;
159+ if (mdsc -> caps_use_max > 0 &&
160+ mdsc -> caps_use_max < mdsc -> caps_min_count )
161+ mdsc -> caps_use_max = mdsc -> caps_min_count ;
156162 spin_unlock (& mdsc -> caps_list_lock );
157163}
158164
@@ -272,6 +278,7 @@ int ceph_reserve_caps(struct ceph_mds_client *mdsc,
272278 if (!err ) {
273279 BUG_ON (have + alloc != need );
274280 ctx -> count = need ;
281+ ctx -> used = 0 ;
275282 }
276283
277284 spin_lock (& mdsc -> caps_list_lock );
@@ -295,13 +302,24 @@ int ceph_reserve_caps(struct ceph_mds_client *mdsc,
295302}
296303
297304void ceph_unreserve_caps (struct ceph_mds_client * mdsc ,
298- struct ceph_cap_reservation * ctx )
305+ struct ceph_cap_reservation * ctx )
299306{
307+ bool reclaim = false;
308+ if (!ctx -> count )
309+ return ;
310+
300311 dout ("unreserve caps ctx=%p count=%d\n" , ctx , ctx -> count );
301312 spin_lock (& mdsc -> caps_list_lock );
302313 __ceph_unreserve_caps (mdsc , ctx -> count );
303314 ctx -> count = 0 ;
315+
316+ if (mdsc -> caps_use_max > 0 &&
317+ mdsc -> caps_use_count > mdsc -> caps_use_max )
318+ reclaim = true;
304319 spin_unlock (& mdsc -> caps_list_lock );
320+
321+ if (reclaim )
322+ ceph_reclaim_caps_nr (mdsc , ctx -> used );
305323}
306324
307325struct ceph_cap * ceph_get_cap (struct ceph_mds_client * mdsc ,
@@ -346,6 +364,7 @@ struct ceph_cap *ceph_get_cap(struct ceph_mds_client *mdsc,
346364 BUG_ON (list_empty (& mdsc -> caps_list ));
347365
348366 ctx -> count -- ;
367+ ctx -> used ++ ;
349368 mdsc -> caps_reserve_count -- ;
350369 mdsc -> caps_use_count ++ ;
351370
@@ -500,12 +519,12 @@ static void __insert_cap_node(struct ceph_inode_info *ci,
500519static void __cap_set_timeouts (struct ceph_mds_client * mdsc ,
501520 struct ceph_inode_info * ci )
502521{
503- struct ceph_mount_options * ma = mdsc -> fsc -> mount_options ;
522+ struct ceph_mount_options * opt = mdsc -> fsc -> mount_options ;
504523
505524 ci -> i_hold_caps_min = round_jiffies (jiffies +
506- ma -> caps_wanted_delay_min * HZ );
525+ opt -> caps_wanted_delay_min * HZ );
507526 ci -> i_hold_caps_max = round_jiffies (jiffies +
508- ma -> caps_wanted_delay_max * HZ );
527+ opt -> caps_wanted_delay_max * HZ );
509528 dout ("__cap_set_timeouts %p min %lu max %lu\n" , & ci -> vfs_inode ,
510529 ci -> i_hold_caps_min - jiffies , ci -> i_hold_caps_max - jiffies );
511530}
0 commit comments