--- linux/kernel/acct.c Fri Oct 27 13:22:39 2000 +++ v2.4.0-test9/linux/kernel/acct.c Sun Oct 29 22:58:11 2000 @@ -41,6 +41,10 @@ * Oh, fsck... Oopsable SMP race in do_process_acct() - we must hold * ->mmap_sem to walk the vma list of current->mm. Nasty, since it leaks * a struct file opened for write. Fixed. 2/6/2000, AV. + * + * 2000-10-27 Modified by Nick Piggin to remove usage of the big kernel + * lock in favour of local spinlocks + * */ #include @@ -77,6 +81,7 @@ static struct file *acct_file; static struct timer_list acct_timer; static void do_acct_process(long, struct file *); +static spinlock_t acct_lock = SPIN_LOCK_UNLOCKED; /* * Called whenever the timer says to check the free space. @@ -95,11 +100,11 @@ int res; int act; - lock_kernel(); + spin_lock(&acct_lock); res = acct_active; if (!file || !acct_needcheck) - goto out; - unlock_kernel(); + goto out_unlock; + spin_unlock(&acct_lock); /* May block */ if (vfs_statfs(file->f_dentry->d_inode->i_sb, &sbuf)) @@ -113,14 +118,14 @@ act = 0; /* - * If some joker switched acct_file under us we'ld better be + * If some joker switched acct_file under us we'd better be * silent and _not_ touch anything. */ - lock_kernel(); + spin_lock(&acct_lock); if (file != acct_file) { if (act) res = act>0; - goto out; + goto out_unlock; } if (acct_active) { @@ -140,8 +145,8 @@ acct_timer.expires = jiffies + ACCT_TIMEOUT*HZ; add_timer(&acct_timer); res = acct_active; -out: - unlock_kernel(); +out_unlock: + spin_unlock(&acct_lock); return res; } @@ -182,7 +187,7 @@ } error = 0; - lock_kernel(); + spin_lock(&acct_lock); if (acct_file) { old_acct = acct_file; del_timer(&acct_timer); @@ -200,7 +205,7 @@ acct_timer.expires = jiffies + ACCT_TIMEOUT*HZ; add_timer(&acct_timer); } - unlock_kernel(); + spin_unlock(&acct_lock); if (old_acct) { do_acct_process(0,old_acct); filp_close(old_acct, NULL); @@ -214,10 +219,12 @@ void acct_auto_close(kdev_t dev) { - lock_kernel(); - if (acct_file && acct_file->f_dentry->d_inode->i_dev == dev) + spin_lock(&acct_lock); + if (acct_file && acct_file->f_dentry->d_inode->i_dev == dev) { + spin_unlock(&acct_lock); sys_acct(NULL); - unlock_kernel(); + } else + spin_unlock(&acct_lock); } /* @@ -348,15 +355,15 @@ int acct_process(long exitcode) { struct file *file = NULL; - lock_kernel(); + spin_lock(&acct_lock); if (acct_file) { file = acct_file; get_file(file); - unlock_kernel(); + spin_unlock(&acct_lock); do_acct_process(exitcode, acct_file); fput(file); } else - unlock_kernel(); + spin_unlock(&acct_lock); return 0; }