@@ -490,13 +490,10 @@ static void __cap_set_timeouts(struct ceph_mds_client *mdsc,
490
490
struct ceph_inode_info * ci )
491
491
{
492
492
struct ceph_mount_options * opt = mdsc -> fsc -> mount_options ;
493
-
494
- ci -> i_hold_caps_min = round_jiffies (jiffies +
495
- opt -> caps_wanted_delay_min * HZ );
496
493
ci -> i_hold_caps_max = round_jiffies (jiffies +
497
494
opt -> caps_wanted_delay_max * HZ );
498
- dout ("__cap_set_timeouts %p min %lu max %lu\n" , & ci -> vfs_inode ,
499
- ci -> i_hold_caps_min - jiffies , ci -> i_hold_caps_max - jiffies );
495
+ dout ("__cap_set_timeouts %p %lu\n" , & ci -> vfs_inode ,
496
+ ci -> i_hold_caps_max - jiffies );
500
497
}
501
498
502
499
/*
@@ -508,8 +505,7 @@ static void __cap_set_timeouts(struct ceph_mds_client *mdsc,
508
505
* -> we take mdsc->cap_delay_lock
509
506
*/
510
507
static void __cap_delay_requeue (struct ceph_mds_client * mdsc ,
511
- struct ceph_inode_info * ci ,
512
- bool set_timeout )
508
+ struct ceph_inode_info * ci )
513
509
{
514
510
dout ("__cap_delay_requeue %p flags 0x%lx at %lu\n" , & ci -> vfs_inode ,
515
511
ci -> i_ceph_flags , ci -> i_hold_caps_max );
@@ -520,8 +516,7 @@ static void __cap_delay_requeue(struct ceph_mds_client *mdsc,
520
516
goto no_change ;
521
517
list_del_init (& ci -> i_cap_delay_list );
522
518
}
523
- if (set_timeout )
524
- __cap_set_timeouts (mdsc , ci );
519
+ __cap_set_timeouts (mdsc , ci );
525
520
list_add_tail (& ci -> i_cap_delay_list , & mdsc -> cap_delay_list );
526
521
no_change :
527
522
spin_unlock (& mdsc -> cap_delay_lock );
@@ -733,7 +728,7 @@ void ceph_add_cap(struct inode *inode,
733
728
dout (" issued %s, mds wanted %s, actual %s, queueing\n" ,
734
729
ceph_cap_string (issued ), ceph_cap_string (wanted ),
735
730
ceph_cap_string (actual_wanted ));
736
- __cap_delay_requeue (mdsc , ci , true );
731
+ __cap_delay_requeue (mdsc , ci );
737
732
}
738
733
739
734
if (flags & CEPH_CAP_FLAG_AUTH ) {
@@ -1342,7 +1337,6 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap,
1342
1337
struct cap_msg_args arg ;
1343
1338
int held , revoking ;
1344
1339
int wake = 0 ;
1345
- int delayed = 0 ;
1346
1340
int ret ;
1347
1341
1348
1342
/* Don't send anything if it's still being created. Return delayed */
@@ -1362,28 +1356,7 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap,
1362
1356
ceph_cap_string (revoking ));
1363
1357
BUG_ON ((retain & CEPH_CAP_PIN ) == 0 );
1364
1358
1365
- arg .session = cap -> session ;
1366
-
1367
- /* don't release wanted unless we've waited a bit. */
1368
- if ((ci -> i_ceph_flags & CEPH_I_NODELAY ) == 0 &&
1369
- time_before (jiffies , ci -> i_hold_caps_min )) {
1370
- dout (" delaying issued %s -> %s, wanted %s -> %s on send\n" ,
1371
- ceph_cap_string (cap -> issued ),
1372
- ceph_cap_string (cap -> issued & retain ),
1373
- ceph_cap_string (cap -> mds_wanted ),
1374
- ceph_cap_string (want ));
1375
- want |= cap -> mds_wanted ;
1376
- retain |= cap -> issued ;
1377
- delayed = 1 ;
1378
- }
1379
- ci -> i_ceph_flags &= ~(CEPH_I_NODELAY | CEPH_I_FLUSH );
1380
- if (want & ~cap -> mds_wanted ) {
1381
- /* user space may open/close single file frequently.
1382
- * This avoids droping mds_wanted immediately after
1383
- * requesting new mds_wanted.
1384
- */
1385
- __cap_set_timeouts (mdsc , ci );
1386
- }
1359
+ ci -> i_ceph_flags &= ~CEPH_I_FLUSH ;
1387
1360
1388
1361
cap -> issued &= retain ; /* drop bits we don't want */
1389
1362
if (cap -> implemented & ~cap -> issued ) {
@@ -1398,6 +1371,7 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap,
1398
1371
cap -> implemented &= cap -> issued | used ;
1399
1372
cap -> mds_wanted = want ;
1400
1373
1374
+ arg .session = cap -> session ;
1401
1375
arg .ino = ceph_vino (inode ).ino ;
1402
1376
arg .cid = cap -> cap_id ;
1403
1377
arg .follows = flushing ? ci -> i_head_snapc -> seq : 0 ;
@@ -1458,14 +1432,19 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap,
1458
1432
1459
1433
ret = send_cap_msg (& arg );
1460
1434
if (ret < 0 ) {
1461
- dout ("error sending cap msg, must requeue %p\n" , inode );
1462
- delayed = 1 ;
1435
+ pr_err ("error sending cap msg, ino (%llx.%llx) "
1436
+ "flushing %s tid %llu, requeue\n" ,
1437
+ ceph_vinop (inode ), ceph_cap_string (flushing ),
1438
+ flush_tid );
1439
+ spin_lock (& ci -> i_ceph_lock );
1440
+ __cap_delay_requeue (mdsc , ci );
1441
+ spin_unlock (& ci -> i_ceph_lock );
1463
1442
}
1464
1443
1465
1444
if (wake )
1466
1445
wake_up_all (& ci -> i_cap_wq );
1467
1446
1468
- return delayed ;
1447
+ return ret ;
1469
1448
}
1470
1449
1471
1450
static inline int __send_flush_snap (struct inode * inode ,
@@ -1731,7 +1710,7 @@ int __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask,
1731
1710
if (((was | ci -> i_flushing_caps ) & CEPH_CAP_FILE_BUFFER ) &&
1732
1711
(mask & CEPH_CAP_FILE_BUFFER ))
1733
1712
dirty |= I_DIRTY_DATASYNC ;
1734
- __cap_delay_requeue (mdsc , ci , true );
1713
+ __cap_delay_requeue (mdsc , ci );
1735
1714
return dirty ;
1736
1715
}
1737
1716
@@ -1883,8 +1862,6 @@ bool __ceph_should_report_size(struct ceph_inode_info *ci)
1883
1862
* versus held caps. Release, flush, ack revoked caps to mds as
1884
1863
* appropriate.
1885
1864
*
1886
- * CHECK_CAPS_NODELAY - caller is delayed work and we should not delay
1887
- * cap release further.
1888
1865
* CHECK_CAPS_AUTHONLY - we should only check the auth cap
1889
1866
* CHECK_CAPS_FLUSH - we should flush any dirty caps immediately, without
1890
1867
* further delay.
@@ -1903,17 +1880,10 @@ void ceph_check_caps(struct ceph_inode_info *ci, int flags,
1903
1880
int mds = -1 ; /* keep track of how far we've gone through i_caps list
1904
1881
to avoid an infinite loop on retry */
1905
1882
struct rb_node * p ;
1906
- int delayed = 0 , sent = 0 ;
1907
- bool no_delay = flags & CHECK_CAPS_NODELAY ;
1908
1883
bool queue_invalidate = false;
1909
1884
bool tried_invalidate = false;
1910
1885
1911
- /* if we are unmounting, flush any unused caps immediately. */
1912
- if (mdsc -> stopping )
1913
- no_delay = true;
1914
-
1915
1886
spin_lock (& ci -> i_ceph_lock );
1916
-
1917
1887
if (ci -> i_ceph_flags & CEPH_I_FLUSH )
1918
1888
flags |= CHECK_CAPS_FLUSH ;
1919
1889
@@ -1960,22 +1930,21 @@ void ceph_check_caps(struct ceph_inode_info *ci, int flags,
1960
1930
}
1961
1931
1962
1932
dout ("check_caps %p file_want %s used %s dirty %s flushing %s"
1963
- " issued %s revoking %s retain %s %s%s%s \n" , inode ,
1933
+ " issued %s revoking %s retain %s %s%s\n" , inode ,
1964
1934
ceph_cap_string (file_wanted ),
1965
1935
ceph_cap_string (used ), ceph_cap_string (ci -> i_dirty_caps ),
1966
1936
ceph_cap_string (ci -> i_flushing_caps ),
1967
1937
ceph_cap_string (issued ), ceph_cap_string (revoking ),
1968
1938
ceph_cap_string (retain ),
1969
1939
(flags & CHECK_CAPS_AUTHONLY ) ? " AUTHONLY" : "" ,
1970
- (flags & CHECK_CAPS_NODELAY ) ? " NODELAY" : "" ,
1971
1940
(flags & CHECK_CAPS_FLUSH ) ? " FLUSH" : "" );
1972
1941
1973
1942
/*
1974
1943
* If we no longer need to hold onto old our caps, and we may
1975
1944
* have cached pages, but don't want them, then try to invalidate.
1976
1945
* If we fail, it's because pages are locked.... try again later.
1977
1946
*/
1978
- if ((!no_delay || mdsc -> stopping ) &&
1947
+ if ((!( flags & CHECK_CAPS_NOINVAL ) || mdsc -> stopping ) &&
1979
1948
S_ISREG (inode -> i_mode ) &&
1980
1949
!(ci -> i_wb_ref || ci -> i_wrbuffer_ref ) && /* no dirty pages... */
1981
1950
inode -> i_data .nrpages && /* have cached pages */
@@ -2055,21 +2024,6 @@ void ceph_check_caps(struct ceph_inode_info *ci, int flags,
2055
2024
if ((cap -> issued & ~retain ) == 0 )
2056
2025
continue ; /* nope, all good */
2057
2026
2058
- if (no_delay )
2059
- goto ack ;
2060
-
2061
- /* delay? */
2062
- if ((ci -> i_ceph_flags & CEPH_I_NODELAY ) == 0 &&
2063
- time_before (jiffies , ci -> i_hold_caps_max )) {
2064
- dout (" delaying issued %s -> %s, wanted %s -> %s\n" ,
2065
- ceph_cap_string (cap -> issued ),
2066
- ceph_cap_string (cap -> issued & retain ),
2067
- ceph_cap_string (cap -> mds_wanted ),
2068
- ceph_cap_string (want ));
2069
- delayed ++ ;
2070
- continue ;
2071
- }
2072
-
2073
2027
ack :
2074
2028
if (session && session != cap -> session ) {
2075
2029
dout ("oops, wrong session %p mutex\n" , session );
@@ -2130,25 +2084,19 @@ void ceph_check_caps(struct ceph_inode_info *ci, int flags,
2130
2084
}
2131
2085
2132
2086
mds = cap -> mds ; /* remember mds, so we don't repeat */
2133
- sent ++ ;
2134
2087
2135
2088
/* __send_cap drops i_ceph_lock */
2136
- delayed += __send_cap (mdsc , cap , CEPH_CAP_OP_UPDATE , 0 ,
2137
- cap_used , want , retain , flushing ,
2138
- flush_tid , oldest_flush_tid );
2089
+ __send_cap (mdsc , cap , CEPH_CAP_OP_UPDATE , 0 , cap_used , want ,
2090
+ retain , flushing , flush_tid , oldest_flush_tid );
2139
2091
goto retry ; /* retake i_ceph_lock and restart our cap scan. */
2140
2092
}
2141
2093
2142
- if (list_empty (& ci -> i_cap_delay_list )) {
2143
- if (delayed ) {
2144
- /* Reschedule delayed caps release if we delayed anything */
2145
- __cap_delay_requeue (mdsc , ci , false);
2146
- } else if (__ceph_is_any_real_caps (ci ) &&
2147
- (file_wanted & ~CEPH_CAP_PIN ) &&
2148
- !(used & (CEPH_CAP_FILE_RD | CEPH_CAP_ANY_FILE_WR ))) {
2149
- /* periodically re-calculate caps wanted by open files */
2150
- __cap_delay_requeue (mdsc , ci , true);
2151
- }
2094
+ /* periodically re-calculate caps wanted by open files */
2095
+ if (__ceph_is_any_real_caps (ci ) &&
2096
+ list_empty (& ci -> i_cap_delay_list ) &&
2097
+ (file_wanted & ~CEPH_CAP_PIN ) &&
2098
+ !(used & (CEPH_CAP_FILE_RD | CEPH_CAP_ANY_FILE_WR ))) {
2099
+ __cap_delay_requeue (mdsc , ci );
2152
2100
}
2153
2101
2154
2102
spin_unlock (& ci -> i_ceph_lock );
@@ -2178,7 +2126,6 @@ static int try_flush_caps(struct inode *inode, u64 *ptid)
2178
2126
retry_locked :
2179
2127
if (ci -> i_dirty_caps && ci -> i_auth_cap ) {
2180
2128
struct ceph_cap * cap = ci -> i_auth_cap ;
2181
- int delayed ;
2182
2129
2183
2130
if (session != cap -> session ) {
2184
2131
spin_unlock (& ci -> i_ceph_lock );
@@ -2207,18 +2154,10 @@ static int try_flush_caps(struct inode *inode, u64 *ptid)
2207
2154
& oldest_flush_tid );
2208
2155
2209
2156
/* __send_cap drops i_ceph_lock */
2210
- delayed = __send_cap (mdsc , cap , CEPH_CAP_OP_FLUSH ,
2211
- CEPH_CLIENT_CAPS_SYNC ,
2212
- __ceph_caps_used (ci ),
2213
- __ceph_caps_wanted (ci ),
2214
- (cap -> issued | cap -> implemented ),
2215
- flushing , flush_tid , oldest_flush_tid );
2216
-
2217
- if (delayed ) {
2218
- spin_lock (& ci -> i_ceph_lock );
2219
- __cap_delay_requeue (mdsc , ci , true);
2220
- spin_unlock (& ci -> i_ceph_lock );
2221
- }
2157
+ __send_cap (mdsc , cap , CEPH_CAP_OP_FLUSH , CEPH_CLIENT_CAPS_SYNC ,
2158
+ __ceph_caps_used (ci ), __ceph_caps_wanted (ci ),
2159
+ (cap -> issued | cap -> implemented ),
2160
+ flushing , flush_tid , oldest_flush_tid );
2222
2161
} else {
2223
2162
if (!list_empty (& ci -> i_cap_flush_list )) {
2224
2163
struct ceph_cap_flush * cf =
@@ -2422,22 +2361,13 @@ static void __kick_flushing_caps(struct ceph_mds_client *mdsc,
2422
2361
if (cf -> caps ) {
2423
2362
dout ("kick_flushing_caps %p cap %p tid %llu %s\n" ,
2424
2363
inode , cap , cf -> tid , ceph_cap_string (cf -> caps ));
2425
- ci -> i_ceph_flags |= CEPH_I_NODELAY ;
2426
-
2427
- ret = __send_cap (mdsc , cap , CEPH_CAP_OP_FLUSH ,
2364
+ __send_cap (mdsc , cap , CEPH_CAP_OP_FLUSH ,
2428
2365
(cf -> tid < last_snap_flush ?
2429
2366
CEPH_CLIENT_CAPS_PENDING_CAPSNAP : 0 ),
2430
2367
__ceph_caps_used (ci ),
2431
2368
__ceph_caps_wanted (ci ),
2432
2369
(cap -> issued | cap -> implemented ),
2433
2370
cf -> caps , cf -> tid , oldest_flush_tid );
2434
- if (ret ) {
2435
- pr_err ("kick_flushing_caps: error sending "
2436
- "cap flush, ino (%llx.%llx) "
2437
- "tid %llu flushing %s\n" ,
2438
- ceph_vinop (inode ), cf -> tid ,
2439
- ceph_cap_string (cf -> caps ));
2440
- }
2441
2371
} else {
2442
2372
struct ceph_cap_snap * capsnap =
2443
2373
container_of (cf , struct ceph_cap_snap ,
@@ -3059,7 +2989,7 @@ void ceph_put_cap_refs(struct ceph_inode_info *ci, int had)
3059
2989
dout ("put_cap_refs %p had %s%s%s\n" , inode , ceph_cap_string (had ),
3060
2990
last ? " last" : "" , put ? " put" : "" );
3061
2991
3062
- if (last && ! flushsnaps )
2992
+ if (last )
3063
2993
ceph_check_caps (ci , 0 , NULL );
3064
2994
else if (flushsnaps )
3065
2995
ceph_flush_snaps (ci , NULL );
@@ -3478,10 +3408,10 @@ static void handle_cap_grant(struct inode *inode,
3478
3408
wake_up_all (& ci -> i_cap_wq );
3479
3409
3480
3410
if (check_caps == 1 )
3481
- ceph_check_caps (ci , CHECK_CAPS_NODELAY | CHECK_CAPS_AUTHONLY ,
3411
+ ceph_check_caps (ci , CHECK_CAPS_AUTHONLY | CHECK_CAPS_NOINVAL ,
3482
3412
session );
3483
3413
else if (check_caps == 2 )
3484
- ceph_check_caps (ci , CHECK_CAPS_NODELAY , session );
3414
+ ceph_check_caps (ci , CHECK_CAPS_NOINVAL , session );
3485
3415
else
3486
3416
mutex_unlock (& session -> s_mutex );
3487
3417
}
@@ -4156,7 +4086,6 @@ void ceph_check_delayed_caps(struct ceph_mds_client *mdsc)
4156
4086
{
4157
4087
struct inode * inode ;
4158
4088
struct ceph_inode_info * ci ;
4159
- int flags = CHECK_CAPS_NODELAY ;
4160
4089
4161
4090
dout ("check_delayed_caps\n" );
4162
4091
while (1 ) {
@@ -4176,7 +4105,7 @@ void ceph_check_delayed_caps(struct ceph_mds_client *mdsc)
4176
4105
4177
4106
if (inode ) {
4178
4107
dout ("check_delayed_caps on %p\n" , inode );
4179
- ceph_check_caps (ci , flags , NULL );
4108
+ ceph_check_caps (ci , 0 , NULL );
4180
4109
/* avoid calling iput_final() in tick thread */
4181
4110
ceph_async_iput (inode );
4182
4111
}
@@ -4201,7 +4130,7 @@ void ceph_flush_dirty_caps(struct ceph_mds_client *mdsc)
4201
4130
ihold (inode );
4202
4131
dout ("flush_dirty_caps %p\n" , inode );
4203
4132
spin_unlock (& mdsc -> cap_dirty_lock );
4204
- ceph_check_caps (ci , CHECK_CAPS_NODELAY | CHECK_CAPS_FLUSH , NULL );
4133
+ ceph_check_caps (ci , CHECK_CAPS_FLUSH , NULL );
4205
4134
iput (inode );
4206
4135
spin_lock (& mdsc -> cap_dirty_lock );
4207
4136
}
@@ -4221,7 +4150,7 @@ void __ceph_touch_fmode(struct ceph_inode_info *ci,
4221
4150
if (fmode &&
4222
4151
__ceph_is_any_real_caps (ci ) &&
4223
4152
list_empty (& ci -> i_cap_delay_list ))
4224
- __cap_delay_requeue (mdsc , ci , true );
4153
+ __cap_delay_requeue (mdsc , ci );
4225
4154
}
4226
4155
4227
4156
void ceph_get_fmode (struct ceph_inode_info * ci , int fmode , int count )
@@ -4280,7 +4209,6 @@ int ceph_drop_caps_for_unlink(struct inode *inode)
4280
4209
if (inode -> i_nlink == 1 ) {
4281
4210
drop |= ~(__ceph_caps_wanted (ci ) | CEPH_CAP_PIN );
4282
4211
4283
- ci -> i_ceph_flags |= CEPH_I_NODELAY ;
4284
4212
if (__ceph_caps_dirty (ci )) {
4285
4213
struct ceph_mds_client * mdsc =
4286
4214
ceph_inode_to_client (inode )-> mdsc ;
@@ -4336,8 +4264,6 @@ int ceph_encode_inode_release(void **p, struct inode *inode,
4336
4264
if (force || (cap -> issued & drop )) {
4337
4265
if (cap -> issued & drop ) {
4338
4266
int wanted = __ceph_caps_wanted (ci );
4339
- if ((ci -> i_ceph_flags & CEPH_I_NODELAY ) == 0 )
4340
- wanted |= cap -> mds_wanted ;
4341
4267
dout ("encode_inode_release %p cap %p "
4342
4268
"%s -> %s, wanted %s -> %s\n" , inode , cap ,
4343
4269
ceph_cap_string (cap -> issued ),
0 commit comments