diff options
author | jeff <jeff@FreeBSD.org> | 2006-03-02 05:50:23 +0000 |
---|---|---|
committer | jeff <jeff@FreeBSD.org> | 2006-03-02 05:50:23 +0000 |
commit | 0951f797b292b58c87659eb994f19c7bca41f2db (patch) | |
tree | 64cd0a5cc89c9b9a6a5be4df15542e217a4d84f5 /sys/ufs/ffs/softdep.h | |
parent | 8e6862e21e88a44559d3bf6cfe1fe7f4452bff26 (diff) | |
download | FreeBSD-src-0951f797b292b58c87659eb994f19c7bca41f2db.zip FreeBSD-src-0951f797b292b58c87659eb994f19c7bca41f2db.tar.gz |
- Move softdep from using a global worklist to per-mount worklists. This
has many positive effects including improved smp locking, reducing
interdependencies between mounts that can lead to deadlocks, etc.
- Add the softdep worklist and various counters to the ufsmnt structure.
- Add a mount pointer to the workitem and remove mount pointers from the
various structures derived from the workitem as they are now redundant.
- Remove the poor-man's semaphore protecting softdep_process_worklist and
softdep_flushworklist. Several threads may now process the list
simultaneously.
- Add softdep_waitidle() to block the thread until all pending
dependencies being operated on by other threads have been flushed.
- Use softdep_waitidle() in unmount and snapshots to block either
operation until the fs is stable.
- Remove softdep worklist processing from the syncer and move it into the
softdep_flush() thread. This thread processes all softdep mounts
once each second and when it is called via the new softdep_speedup()
when there is a resource shortage. This removes the softdep hook
from the kernel and various hacks in header files to support it.
Reviewed by/Discussed with: tegge, truckman, mckusick
Tested by: kris
Diffstat (limited to 'sys/ufs/ffs/softdep.h')
-rw-r--r-- | sys/ufs/ffs/softdep.h | 7 |
1 files changed, 1 insertions, 6 deletions
diff --git a/sys/ufs/ffs/softdep.h b/sys/ufs/ffs/softdep.h index 3848644..b00183b 100644 --- a/sys/ufs/ffs/softdep.h +++ b/sys/ufs/ffs/softdep.h @@ -135,6 +135,7 @@ * and the macros below changed to use it. */ struct worklist { + struct mount *wk_mp; /* Mount we live in */ LIST_ENTRY(worklist) wk_list; /* list of work requests */ unsigned short wk_type; /* type of request */ unsigned short wk_state; /* state flags */ @@ -142,7 +143,6 @@ struct worklist { #define WK_DATA(wk) ((void *)(wk)) #define WK_PAGEDEP(wk) ((struct pagedep *)(wk)) #define WK_INODEDEP(wk) ((struct inodedep *)(wk)) -#define WK_NEWBLK(wk) ((struct newblk *)(wk)) #define WK_BMSAFEMAP(wk) ((struct bmsafemap *)(wk)) #define WK_ALLOCDIRECT(wk) ((struct allocdirect *)(wk)) #define WK_INDIRDEP(wk) ((struct indirdep *)(wk)) @@ -190,7 +190,6 @@ struct pagedep { struct worklist pd_list; /* page buffer */ # define pd_state pd_list.wk_state /* check for multiple I/O starts */ LIST_ENTRY(pagedep) pd_hash; /* hashed lookup */ - struct mount *pd_mnt; /* associated mount point */ ino_t pd_ino; /* associated file */ ufs_lbn_t pd_lbn; /* block within file */ struct dirremhd pd_dirremhd; /* dirrem's waiting for page */ @@ -415,7 +414,6 @@ struct allocindir { struct freefrag { struct worklist ff_list; /* id_inowait or delayed worklist */ # define ff_state ff_list.wk_state /* owning user; should be uid_t */ - struct mount *ff_mnt; /* associated mount point */ ufs2_daddr_t ff_blkno; /* fragment physical block number */ long ff_fragsize; /* size of fragment being deleted */ ino_t ff_inum; /* owning inode number */ @@ -433,7 +431,6 @@ struct freeblks { ino_t fb_previousinum; /* inode of previous owner of blocks */ uid_t fb_uid; /* uid of previous owner of blocks */ struct vnode *fb_devvp; /* filesystem device vnode */ - struct mount *fb_mnt; /* associated mount point */ long fb_oldextsize; /* previous ext data size */ off_t fb_oldsize; /* previous file size */ ufs2_daddr_t fb_chkcnt; /* used to check cnt of blks released */ @@ -453,7 +450,6 @@ struct freefile { mode_t fx_mode; /* mode of inode */ ino_t fx_oldinum; /* inum of the unlinked file */ struct vnode *fx_devvp; /* filesystem device vnode */ - struct mount *fx_mnt; /* associated mount point */ }; /* @@ -555,7 +551,6 @@ struct dirrem { struct worklist dm_list; /* delayed worklist */ # define dm_state dm_list.wk_state /* state of the old directory entry */ LIST_ENTRY(dirrem) dm_next; /* pagedep's list of dirrem's */ - struct mount *dm_mnt; /* associated mount point */ ino_t dm_oldinum; /* inum of the removed dir entry */ union { struct pagedep *dmu_pagedep; /* pagedep dependency for remove */ |