@@ -194,76 +194,123 @@ tests/test.py << TEST
194
194
lfs_file_read(&lfs, &file[0], buffer, size) => size;
195
195
memcmp(buffer, "exhaustion", size) => 0;
196
196
lfs_file_close(&lfs, &file[0]) => 0;
197
+ lfs_remove(&lfs, "exhaustion") => 0;
197
198
lfs_unmount(&lfs) => 0;
198
199
TEST
199
200
200
201
echo " --- Dir exhaustion test ---"
201
202
tests/test.py << TEST
202
203
lfs_mount(&lfs, &cfg) => 0;
203
- lfs_remove(&lfs, "exhaustion") => 0;
204
204
205
- lfs_file_open(&lfs, &file[0], "exhaustion", LFS_O_WRONLY | LFS_O_CREAT);
205
+ // find out max file size
206
+ lfs_mkdir(&lfs, "exhaustiondir") => 0;
206
207
size = strlen("blahblahblahblah");
207
208
memcpy(buffer, "blahblahblahblah", size);
208
- for (lfs_size_t i = 0;
209
- i < (cfg.block_count-4)*(cfg.block_size-8);
210
- i += size) {
209
+ lfs_file_open(&lfs, &file[0], "exhaustion", LFS_O_WRONLY | LFS_O_CREAT);
210
+ int count = 0;
211
+ int err;
212
+ while (true) {
213
+ err = lfs_file_write(&lfs, &file[0], buffer, size);
214
+ if (err < 0) {
215
+ break;
216
+ }
217
+
218
+ count += 1;
219
+ }
220
+ err => LFS_ERR_NOSPC;
221
+ lfs_file_close(&lfs, &file[0]) => 0;
222
+
223
+ lfs_remove(&lfs, "exhaustion") => 0;
224
+ lfs_remove(&lfs, "exhaustiondir") => 0;
225
+
226
+ // see if dir fits with max file size
227
+ lfs_file_open(&lfs, &file[0], "exhaustion", LFS_O_WRONLY | LFS_O_CREAT);
228
+ for (int i = 0; i < count; i++) {
211
229
lfs_file_write(&lfs, &file[0], buffer, size) => size;
212
230
}
213
231
lfs_file_close(&lfs, &file[0]) => 0;
214
232
215
233
lfs_mkdir(&lfs, "exhaustiondir") => 0;
216
234
lfs_remove(&lfs, "exhaustiondir") => 0;
235
+ lfs_remove(&lfs, "exhaustion") => 0;
217
236
218
- lfs_file_open(&lfs, &file[0], "exhaustion", LFS_O_WRONLY | LFS_O_APPEND);
219
- size = strlen("blahblahblahblah");
220
- memcpy(buffer, "blahblahblahblah", size);
221
- for (lfs_size_t i = 0;
222
- i < (cfg.block_size-8);
223
- i += size) {
237
+ // see if dir fits with > max file size
238
+ lfs_file_open(&lfs, &file[0], "exhaustion", LFS_O_WRONLY | LFS_O_CREAT);
239
+ for (int i = 0; i < count+1; i++) {
224
240
lfs_file_write(&lfs, &file[0], buffer, size) => size;
225
241
}
226
242
lfs_file_close(&lfs, &file[0]) => 0;
227
243
228
244
lfs_mkdir(&lfs, "exhaustiondir") => LFS_ERR_NOSPC;
245
+
246
+ lfs_remove(&lfs, "exhaustion") => 0;
229
247
lfs_unmount(&lfs) => 0;
230
248
TEST
231
249
232
250
echo " --- Chained dir exhaustion test ---"
233
251
tests/test.py << TEST
234
252
lfs_mount(&lfs, &cfg) => 0;
235
- lfs_remove(&lfs, "exhaustion") => 0;
236
253
237
- lfs_file_open(&lfs, &file[0], "exhaustion", LFS_O_WRONLY | LFS_O_CREAT);
254
+ // find out max file size
255
+ lfs_mkdir(&lfs, "exhaustiondir") => 0;
256
+ for (int i = 0; i < 9; i++) {
257
+ sprintf((char*)buffer, "dirwithanexhaustivelylongnameforpadding%d", i);
258
+ lfs_mkdir(&lfs, (char*)buffer) => 0;
259
+ }
238
260
size = strlen("blahblahblahblah");
239
261
memcpy(buffer, "blahblahblahblah", size);
240
- for (lfs_size_t i = 0;
241
- i < (cfg.block_count-24)*(cfg.block_size-8);
242
- i += size) {
243
- lfs_file_write(&lfs, &file[0], buffer, size) => size;
262
+ lfs_file_open(&lfs, &file[0], "exhaustion", LFS_O_WRONLY | LFS_O_CREAT);
263
+ int count = 0;
264
+ int err;
265
+ while (true) {
266
+ err = lfs_file_write(&lfs, &file[0], buffer, size);
267
+ if (err < 0) {
268
+ break;
269
+ }
270
+
271
+ count += 1;
244
272
}
273
+ err => LFS_ERR_NOSPC;
245
274
lfs_file_close(&lfs, &file[0]) => 0;
246
275
276
+ lfs_remove(&lfs, "exhaustion") => 0;
277
+ lfs_remove(&lfs, "exhaustiondir") => 0;
278
+ for (int i = 0; i < 9; i++) {
279
+ sprintf((char*)buffer, "dirwithanexhaustivelylongnameforpadding%d", i);
280
+ lfs_remove(&lfs, (char*)buffer) => 0;
281
+ }
282
+
283
+ // see that chained dir fails
284
+ lfs_file_open(&lfs, &file[0], "exhaustion", LFS_O_WRONLY | LFS_O_CREAT);
285
+ for (int i = 0; i < count+1; i++) {
286
+ lfs_file_write(&lfs, &file[0], buffer, size) => size;
287
+ }
288
+
247
289
for (int i = 0; i < 9; i++) {
248
290
sprintf((char*)buffer, "dirwithanexhaustivelylongnameforpadding%d", i);
249
291
lfs_mkdir(&lfs, (char*)buffer) => 0;
250
292
}
251
293
252
294
lfs_mkdir(&lfs, "exhaustiondir") => LFS_ERR_NOSPC;
253
295
254
- lfs_remove(&lfs, "exhaustion") => 0;
255
- lfs_file_open(&lfs, &file[0], "exhaustion", LFS_O_WRONLY | LFS_O_CREAT);
256
- size = strlen("blahblahblahblah");
257
- memcpy(buffer, "blahblahblahblah", size);
258
- for (lfs_size_t i = 0;
259
- i < (cfg.block_count-26)*(cfg.block_size-8);
260
- i += size) {
261
- lfs_file_write(&lfs, &file[0], buffer, size) => size;
296
+ // shorten file to try a second chained dir
297
+ while (true) {
298
+ err = lfs_mkdir(&lfs, "exhaustiondir");
299
+ if (err != LFS_ERR_NOSPC) {
300
+ break;
301
+ }
302
+
303
+ lfs_ssize_t filesize = lfs_file_size(&lfs, &file[0]);
304
+ filesize > 0 => true;
305
+
306
+ lfs_file_truncate(&lfs, &file[0], filesize - size) => 0;
262
307
}
263
- lfs_file_close(&lfs, &file[0]) => 0;
308
+ err => 0;
264
309
265
- lfs_mkdir(&lfs, "exhaustiondir") => 0;
266
310
lfs_mkdir(&lfs, "exhaustiondir2") => LFS_ERR_NOSPC;
311
+
312
+ lfs_file_close(&lfs, &file[0]) => 0;
313
+ lfs_unmount(&lfs) => 0;
267
314
TEST
268
315
269
316
echo " --- Split dir test ---"
0 commit comments