diff options
Diffstat (limited to 'fs/ocfs2/dcache.c')
-rw-r--r-- | fs/ocfs2/dcache.c | 61 |
1 files changed, 3 insertions, 58 deletions
diff --git a/fs/ocfs2/dcache.c b/fs/ocfs2/dcache.c index 0d3a97d2d5f6..e2e05a106beb 100644 --- a/fs/ocfs2/dcache.c +++ b/fs/ocfs2/dcache.c | |||
@@ -37,7 +37,6 @@ | |||
37 | #include "dlmglue.h" | 37 | #include "dlmglue.h" |
38 | #include "file.h" | 38 | #include "file.h" |
39 | #include "inode.h" | 39 | #include "inode.h" |
40 | #include "super.h" | ||
41 | #include "ocfs2_trace.h" | 40 | #include "ocfs2_trace.h" |
42 | 41 | ||
43 | void ocfs2_dentry_attach_gen(struct dentry *dentry) | 42 | void ocfs2_dentry_attach_gen(struct dentry *dentry) |
@@ -346,52 +345,6 @@ out_attach: | |||
346 | return ret; | 345 | return ret; |
347 | } | 346 | } |
348 | 347 | ||
349 | DEFINE_SPINLOCK(dentry_list_lock); | ||
350 | |||
351 | /* We limit the number of dentry locks to drop in one go. We have | ||
352 | * this limit so that we don't starve other users of ocfs2_wq. */ | ||
353 | #define DL_INODE_DROP_COUNT 64 | ||
354 | |||
355 | /* Drop inode references from dentry locks */ | ||
356 | static void __ocfs2_drop_dl_inodes(struct ocfs2_super *osb, int drop_count) | ||
357 | { | ||
358 | struct ocfs2_dentry_lock *dl; | ||
359 | |||
360 | spin_lock(&dentry_list_lock); | ||
361 | while (osb->dentry_lock_list && (drop_count < 0 || drop_count--)) { | ||
362 | dl = osb->dentry_lock_list; | ||
363 | osb->dentry_lock_list = dl->dl_next; | ||
364 | spin_unlock(&dentry_list_lock); | ||
365 | iput(dl->dl_inode); | ||
366 | kfree(dl); | ||
367 | spin_lock(&dentry_list_lock); | ||
368 | } | ||
369 | spin_unlock(&dentry_list_lock); | ||
370 | } | ||
371 | |||
372 | void ocfs2_drop_dl_inodes(struct work_struct *work) | ||
373 | { | ||
374 | struct ocfs2_super *osb = container_of(work, struct ocfs2_super, | ||
375 | dentry_lock_work); | ||
376 | |||
377 | __ocfs2_drop_dl_inodes(osb, DL_INODE_DROP_COUNT); | ||
378 | /* | ||
379 | * Don't queue dropping if umount is in progress. We flush the | ||
380 | * list in ocfs2_dismount_volume | ||
381 | */ | ||
382 | spin_lock(&dentry_list_lock); | ||
383 | if (osb->dentry_lock_list && | ||
384 | !ocfs2_test_osb_flag(osb, OCFS2_OSB_DROP_DENTRY_LOCK_IMMED)) | ||
385 | queue_work(ocfs2_wq, &osb->dentry_lock_work); | ||
386 | spin_unlock(&dentry_list_lock); | ||
387 | } | ||
388 | |||
389 | /* Flush the whole work queue */ | ||
390 | void ocfs2_drop_all_dl_inodes(struct ocfs2_super *osb) | ||
391 | { | ||
392 | __ocfs2_drop_dl_inodes(osb, -1); | ||
393 | } | ||
394 | |||
395 | /* | 348 | /* |
396 | * ocfs2_dentry_iput() and friends. | 349 | * ocfs2_dentry_iput() and friends. |
397 | * | 350 | * |
@@ -416,24 +369,16 @@ void ocfs2_drop_all_dl_inodes(struct ocfs2_super *osb) | |||
416 | static void ocfs2_drop_dentry_lock(struct ocfs2_super *osb, | 369 | static void ocfs2_drop_dentry_lock(struct ocfs2_super *osb, |
417 | struct ocfs2_dentry_lock *dl) | 370 | struct ocfs2_dentry_lock *dl) |
418 | { | 371 | { |
372 | iput(dl->dl_inode); | ||
419 | ocfs2_simple_drop_lockres(osb, &dl->dl_lockres); | 373 | ocfs2_simple_drop_lockres(osb, &dl->dl_lockres); |
420 | ocfs2_lock_res_free(&dl->dl_lockres); | 374 | ocfs2_lock_res_free(&dl->dl_lockres); |
421 | 375 | kfree(dl); | |
422 | /* We leave dropping of inode reference to ocfs2_wq as that can | ||
423 | * possibly lead to inode deletion which gets tricky */ | ||
424 | spin_lock(&dentry_list_lock); | ||
425 | if (!osb->dentry_lock_list && | ||
426 | !ocfs2_test_osb_flag(osb, OCFS2_OSB_DROP_DENTRY_LOCK_IMMED)) | ||
427 | queue_work(ocfs2_wq, &osb->dentry_lock_work); | ||
428 | dl->dl_next = osb->dentry_lock_list; | ||
429 | osb->dentry_lock_list = dl; | ||
430 | spin_unlock(&dentry_list_lock); | ||
431 | } | 376 | } |
432 | 377 | ||
433 | void ocfs2_dentry_lock_put(struct ocfs2_super *osb, | 378 | void ocfs2_dentry_lock_put(struct ocfs2_super *osb, |
434 | struct ocfs2_dentry_lock *dl) | 379 | struct ocfs2_dentry_lock *dl) |
435 | { | 380 | { |
436 | int unlock; | 381 | int unlock = 0; |
437 | 382 | ||
438 | BUG_ON(dl->dl_count == 0); | 383 | BUG_ON(dl->dl_count == 0); |
439 | 384 | ||