Merge branch 'for-linus2' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
* 'for-linus2' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (165 commits) reiserfs: Properly display mount options in /proc/mounts vfs: prevent remount read-only if pending removes vfs: count unlinked inodes vfs: protect remounting superblock read-only vfs: keep list of mounts for each superblock vfs: switch ->show_options() to struct dentry * vfs: switch ->show_path() to struct dentry * vfs: switch ->show_devname() to struct dentry * vfs: switch ->show_stats to struct dentry * switch security_path_chmod() to struct path * vfs: prefer ->dentry->d_sb to ->mnt->mnt_sb vfs: trim includes a bit switch mnt_namespace ->root to struct mount vfs: take /proc/*/mounts and friends to fs/proc_namespace.c vfs: opencode mntget() mnt_set_mountpoint() vfs: spread struct mount - remaining argument of next_mnt() vfs: move fsnotify junk to struct mount vfs: move mnt_devname vfs: move mnt_list to struct mount vfs: switch pnode.h macros to struct mount * ...
This commit is contained in:
@@ -84,26 +84,16 @@ static void do_acct_process(struct bsd_acct_struct *acct,
|
||||
* the cache line to have the data after getting the lock.
|
||||
*/
|
||||
struct bsd_acct_struct {
|
||||
volatile int active;
|
||||
volatile int needcheck;
|
||||
int active;
|
||||
unsigned long needcheck;
|
||||
struct file *file;
|
||||
struct pid_namespace *ns;
|
||||
struct timer_list timer;
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
static DEFINE_SPINLOCK(acct_lock);
|
||||
static LIST_HEAD(acct_list);
|
||||
|
||||
/*
|
||||
* Called whenever the timer says to check the free space.
|
||||
*/
|
||||
static void acct_timeout(unsigned long x)
|
||||
{
|
||||
struct bsd_acct_struct *acct = (struct bsd_acct_struct *)x;
|
||||
acct->needcheck = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check the amount of free space and suspend/resume accordingly.
|
||||
*/
|
||||
@@ -112,12 +102,12 @@ static int check_free_space(struct bsd_acct_struct *acct, struct file *file)
|
||||
struct kstatfs sbuf;
|
||||
int res;
|
||||
int act;
|
||||
sector_t resume;
|
||||
sector_t suspend;
|
||||
u64 resume;
|
||||
u64 suspend;
|
||||
|
||||
spin_lock(&acct_lock);
|
||||
res = acct->active;
|
||||
if (!file || !acct->needcheck)
|
||||
if (!file || time_is_before_jiffies(acct->needcheck))
|
||||
goto out;
|
||||
spin_unlock(&acct_lock);
|
||||
|
||||
@@ -127,8 +117,8 @@ static int check_free_space(struct bsd_acct_struct *acct, struct file *file)
|
||||
suspend = sbuf.f_blocks * SUSPEND;
|
||||
resume = sbuf.f_blocks * RESUME;
|
||||
|
||||
sector_div(suspend, 100);
|
||||
sector_div(resume, 100);
|
||||
do_div(suspend, 100);
|
||||
do_div(resume, 100);
|
||||
|
||||
if (sbuf.f_bavail <= suspend)
|
||||
act = -1;
|
||||
@@ -160,10 +150,7 @@ static int check_free_space(struct bsd_acct_struct *acct, struct file *file)
|
||||
}
|
||||
}
|
||||
|
||||
del_timer(&acct->timer);
|
||||
acct->needcheck = 0;
|
||||
acct->timer.expires = jiffies + ACCT_TIMEOUT*HZ;
|
||||
add_timer(&acct->timer);
|
||||
acct->needcheck = jiffies + ACCT_TIMEOUT*HZ;
|
||||
res = acct->active;
|
||||
out:
|
||||
spin_unlock(&acct_lock);
|
||||
@@ -185,9 +172,7 @@ static void acct_file_reopen(struct bsd_acct_struct *acct, struct file *file,
|
||||
if (acct->file) {
|
||||
old_acct = acct->file;
|
||||
old_ns = acct->ns;
|
||||
del_timer(&acct->timer);
|
||||
acct->active = 0;
|
||||
acct->needcheck = 0;
|
||||
acct->file = NULL;
|
||||
acct->ns = NULL;
|
||||
list_del(&acct->list);
|
||||
@@ -195,13 +180,9 @@ static void acct_file_reopen(struct bsd_acct_struct *acct, struct file *file,
|
||||
if (file) {
|
||||
acct->file = file;
|
||||
acct->ns = ns;
|
||||
acct->needcheck = 0;
|
||||
acct->needcheck = jiffies + ACCT_TIMEOUT*HZ;
|
||||
acct->active = 1;
|
||||
list_add(&acct->list, &acct_list);
|
||||
/* It's been deleted if it was used before so this is safe */
|
||||
setup_timer(&acct->timer, acct_timeout, (unsigned long)acct);
|
||||
acct->timer.expires = jiffies + ACCT_TIMEOUT*HZ;
|
||||
add_timer(&acct->timer);
|
||||
}
|
||||
if (old_acct) {
|
||||
mnt_unpin(old_acct->f_path.mnt);
|
||||
@@ -334,7 +315,7 @@ void acct_auto_close(struct super_block *sb)
|
||||
spin_lock(&acct_lock);
|
||||
restart:
|
||||
list_for_each_entry(acct, &acct_list, list)
|
||||
if (acct->file && acct->file->f_path.mnt->mnt_sb == sb) {
|
||||
if (acct->file && acct->file->f_path.dentry->d_sb == sb) {
|
||||
acct_file_reopen(acct, NULL, NULL);
|
||||
goto restart;
|
||||
}
|
||||
@@ -348,7 +329,6 @@ void acct_exit_ns(struct pid_namespace *ns)
|
||||
if (acct == NULL)
|
||||
return;
|
||||
|
||||
del_timer_sync(&acct->timer);
|
||||
spin_lock(&acct_lock);
|
||||
if (acct->file != NULL)
|
||||
acct_file_reopen(acct, NULL, NULL);
|
||||
@@ -498,7 +478,7 @@ static void do_acct_process(struct bsd_acct_struct *acct,
|
||||
* Fill the accounting struct with the needed info as recorded
|
||||
* by the different kernel functions.
|
||||
*/
|
||||
memset((caddr_t)&ac, 0, sizeof(acct_t));
|
||||
memset(&ac, 0, sizeof(acct_t));
|
||||
|
||||
ac.ac_version = ACCT_VERSION | ACCT_BYTEORDER;
|
||||
strlcpy(ac.ac_comm, current->comm, sizeof(ac.ac_comm));
|
||||
|
Reference in New Issue
Block a user