33 * Copyright 2019 Google LLC
44 */
55#include <linux/crc32.h>
6- #include <linux/delay.h>
76#include <linux/file.h>
87#include <linux/fsverity.h>
98#include <linux/gfp.h>
@@ -1106,33 +1105,18 @@ static void notify_pending_reads(struct mount_info *mi,
11061105 wake_up_all (& mi -> mi_blocks_written_notif_wq );
11071106}
11081107
1109- static int usleep_interruptible (u32 us )
1110- {
1111- /* See:
1112- * https://www.kernel.org/doc/Documentation/timers/timers-howto.txt
1113- * for explanation
1114- */
1115- if (us < 10 ) {
1116- udelay (us );
1117- return 0 ;
1118- } else if (us < 20000 ) {
1119- usleep_range (us , us + us / 10 );
1120- return 0 ;
1121- } else
1122- return msleep_interruptible (us / 1000 );
1123- }
1124-
11251108static int wait_for_data_block (struct data_file * df , int block_index ,
11261109 struct data_file_block * res_block ,
1127- struct incfs_read_data_file_timeouts * timeouts )
1110+ struct incfs_read_data_file_timeouts * timeouts ,
1111+ unsigned int * delayed_min_us )
11281112{
11291113 struct data_file_block block = {};
11301114 struct data_file_segment * segment = NULL ;
11311115 struct pending_read * read = NULL ;
11321116 struct mount_info * mi = NULL ;
11331117 int error ;
11341118 int wait_res = 0 ;
1135- unsigned int delayed_pending_us = 0 , delayed_min_us = 0 ;
1119+ unsigned int delayed_pending_us = 0 ;
11361120 bool delayed_pending = false;
11371121
11381122 if (!df || !res_block )
@@ -1163,8 +1147,7 @@ static int wait_for_data_block(struct data_file *df, int block_index,
11631147 if (is_data_block_present (& block )) {
11641148 * res_block = block ;
11651149 if (timeouts && timeouts -> min_time_us ) {
1166- delayed_min_us = timeouts -> min_time_us ;
1167- error = usleep_interruptible (delayed_min_us );
1150+ * delayed_min_us = timeouts -> min_time_us ;
11681151 goto out ;
11691152 }
11701153 return 0 ;
@@ -1211,13 +1194,9 @@ static int wait_for_data_block(struct data_file *df, int block_index,
12111194 delayed_pending = true;
12121195 delayed_pending_us = timeouts -> max_pending_time_us -
12131196 jiffies_to_usecs (wait_res );
1214- if (timeouts -> min_pending_time_us > delayed_pending_us ) {
1215- delayed_min_us = timeouts -> min_pending_time_us -
1197+ if (timeouts -> min_pending_time_us > delayed_pending_us )
1198+ * delayed_min_us = timeouts -> min_pending_time_us -
12161199 delayed_pending_us ;
1217- error = usleep_interruptible (delayed_min_us );
1218- if (error )
1219- return error ;
1220- }
12211200
12221201 error = down_read_killable (& segment -> rwsem );
12231202 if (error )
@@ -1252,9 +1231,9 @@ static int wait_for_data_block(struct data_file *df, int block_index,
12521231 delayed_pending_us ;
12531232 }
12541233
1255- if (delayed_min_us ) {
1234+ if (delayed_min_us && * delayed_min_us ) {
12561235 mi -> mi_reads_delayed_min ++ ;
1257- mi -> mi_reads_delayed_min_us += delayed_min_us ;
1236+ mi -> mi_reads_delayed_min_us += * delayed_min_us ;
12581237 }
12591238
12601239 return 0 ;
@@ -1284,7 +1263,8 @@ static int incfs_update_sysfs_error(struct file *file, int index, int result,
12841263
12851264ssize_t incfs_read_data_file_block (struct mem_range dst , struct file * f ,
12861265 int index , struct mem_range tmp ,
1287- struct incfs_read_data_file_timeouts * timeouts )
1266+ struct incfs_read_data_file_timeouts * timeouts ,
1267+ unsigned int * delayed_min_us )
12881268{
12891269 loff_t pos ;
12901270 ssize_t result ;
@@ -1303,7 +1283,8 @@ ssize_t incfs_read_data_file_block(struct mem_range dst, struct file *f,
13031283 mi = df -> df_mount_info ;
13041284 bfc = df -> df_backing_file_context ;
13051285
1306- result = wait_for_data_block (df , index , & block , timeouts );
1286+ result = wait_for_data_block (df , index , & block , timeouts ,
1287+ delayed_min_us );
13071288 if (result < 0 )
13081289 goto out ;
13091290
0 commit comments