diff options
Diffstat (limited to 'ext2fs/pager.c')
-rw-r--r-- | ext2fs/pager.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/ext2fs/pager.c b/ext2fs/pager.c index b56c923a..3e080f87 100644 --- a/ext2fs/pager.c +++ b/ext2fs/pager.c @@ -34,6 +34,10 @@ struct port_bucket *disk_pager_bucket; /* A ports bucket to hold file pager ports. */ struct port_bucket *file_pager_bucket; +/* Stores a reference to the requests instance used by the file pager so its + worker threads can be inhibited and resumed. */ +struct pager_requests *file_pager_requests; + pthread_spinlock_t node_to_page_lock = PTHREAD_SPINLOCK_INITIALIZER; @@ -1217,11 +1221,38 @@ create_disk_pager (void) file_pager_bucket = ports_create_bucket (); /* Start libpagers worker threads. */ - err = pager_start_workers (file_pager_bucket); + err = pager_start_workers (file_pager_bucket, &file_pager_requests); if (err) ext2_panic ("can't create libpager worker threads: %s", strerror (err)); } +error_t +inhibit_ext2_pager (void) +{ + error_t err; + + /* The file pager can rely on the disk pager, so inhibit the file + pager first. */ + + err = pager_inhibit_workers (file_pager_requests); + if (err) + return err; + + err = pager_inhibit_workers (diskfs_disk_pager_requests); + /* We don't want only one pager disabled. */ + if (err) + pager_resume_workers (file_pager_requests); + + return err; +} + +void +resume_ext2_pager (void) +{ + pager_resume_workers (diskfs_disk_pager_requests); + pager_resume_workers (file_pager_requests); +} + /* Call this to create a FILE_DATA pager and return a send right. NODE must be locked. */ mach_port_t |