public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Pavel Machek <pavel@ucw.cz>
To: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: "Theodore Ts'o" <tytso@mit.edu>, Andrew Morton <akpm@zip.com.au>,
	kernel list <linux-kernel@vger.kernel.org>
Subject: Re: Dealing with swsusp vs. pmdisk
Date: Sun, 14 Mar 2004 01:37:17 +0100	[thread overview]
Message-ID: <20040314003717.GI549@elf.ucw.cz> (raw)
In-Reply-To: <1079223482.1960.113.camel@gaston>

On Ne 14-03-04 11:18:02, Benjamin Herrenschmidt wrote:
> On Sat, 2004-03-13 at 23:36, Pavel Machek wrote:
> > Hi!
> > 
> > > > Pavel, what do you think of the swsusp2 patch, BTW?  My biggest
> > > > complaint about it is that since it's maintained outside of the
> > > > kernel, it's constantly behind about 0.75 revisions behind the latest
> > > > 2.6 release.  The feature set of swsusp2, if they can ever get it
> > > > completely bugfree(tm) is certainly impressive.
> > > 
> > > I'd like it to be merged upstream too.
> > 
> > Are we talking 2.6 or 2.7 here?
> 
> 2.6. I don't see any problem merging it at this point as long as
> it's not invasive (I haven't looked at the code though). If it's
> self-contained, it's more/less like adding a driver.

:-( [I just hand-selected most intrusive stuff, there's more of it].

I guess this is non starter. I'm afraid this is non-starter even for
2.7.

Anyway this solves my problem. I need swsusp working with highmem. I
thought I might simply switch to swsusp2, but that is not really an
option.

[Well, it only *looks* ugly, those macros are nops on non-swsusp
system. But it seems way too intrusive anyway].

								Pavel

diff -ruN linux-2.6.2/drivers/acpi/sleep/proc.c software-suspend-linux-2.6.2/drivers/acpi/sleep/proc.c
--- linux-2.6.2/drivers/acpi/sleep/proc.c	2004-02-06 17:27:23.000000000 +1300
+++ software-suspend-linux-2.6.2/drivers/acpi/sleep/proc.c	2004-02-06 17:41:09.000000000 +1300
@@ -1,7 +1,9 @@
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
 #include <linux/suspend.h>
+#include <linux/sched.h>
 #include <linux/bcd.h>
+#include <linux/init.h>
 #include <asm/uaccess.h>
 
 #include <acpi/acpi_bus.h>
@@ -54,6 +56,9 @@
 	char	str[12];
 	u32	state = 0;
 	int	error = 0;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_PAUSING;
 
 	if (count > sizeof(str) - 1)
 		goto Done;
@@ -61,6 +66,7 @@
 	if (copy_from_user(str, buffer, count))
 		return -EFAULT;
 
+
 	/* Check for S4 bios request */
 	if (!strcmp(str,"4b")) {
 		error = acpi_suspend(4);
@@ -75,6 +81,7 @@
 #endif
 	error = acpi_suspend(state);
  Done:
+	SWSUSP_ACTIVITY_RESTARTING(0);
 	return error ? error : count;
 }


(and similar changes in)
 
+++ software-suspend-linux-2.6.2/drivers/char/hvc_console.c	2004-02-06 17:41:09.000000000 +1300
+++ software-suspend-linux-2.6.2/drivers/char/n_tty.c	2004-02-06 17:41:09.000000000 +1300
+++ software-suspend-linux-2.6.2/drivers/char/tty_io.c	2004-02-06 17:41:09.000000000 +1300
+++ software-suspend-linux-2.6.2/drivers/media/video/msp3400.c	2004-02-06 17:43:15.000000000 +1300
+++ software-suspend-linux-2.6.2/drivers/media/video/tvaudio.c	2004-02-06 17:41:09.000000000 +1300
+++ software-suspend-linux-2.6.2/drivers/message/i2o/i2o_core.c	2004-02-06 17:41:09.000000000 +1300
+++ software-suspend-linux-2.6.2/drivers/mtd/mtdblock.c	2004-02-06 17:41:09.000000000 +1300
+++ software-suspend-linux-2.6.2/drivers/net/irda/sir_kthread.c	2004-02-06 17:41:09.000000000 +1300
+++ software-suspend-linux-2.6.2/drivers/parport/ieee1284.c	2004-02-06 17:41:09.000000000 +1300
+++ software-suspend-linux-2.6.2/drivers/pcmcia/cs.c	2004-02-06 17:41:09.000000000 +1300
+++ software-suspend-linux-2.6.2/drivers/usb/core/hub.c	2004-02-06 17:41:09.000000000 +1300
+++ software-suspend-linux-2.6.2/drivers/usb/storage/usb.c	2004-02-06 17:41:09.000000000 +1300
diff -ruN linux-2.6.2/fs/buffer.c software-suspend-linux-2.6.2/fs/buffer.c
--- linux-2.6.2/fs/buffer.c	2004-02-06 17:27:46.000000000 +1300
+++ software-suspend-linux-2.6.2/fs/buffer.c	2004-02-06 17:41:09.000000000 +1300
@@ -37,6 +37,7 @@
 #include <linux/bio.h>
 #include <linux/notifier.h>
 #include <linux/cpu.h>
+#include <linux/init.h>
 #include <asm/bitops.h>
 
 static void invalidate_bh_lrus(void);
@@ -229,16 +230,24 @@
  */
 int fsync_super(struct super_block *sb)
 {
-	sync_inodes_sb(sb, 0);
-	DQUOT_SYNC(sb);
-	lock_super(sb);
-	if (sb->s_dirt && sb->s_op->write_super)
-		sb->s_op->write_super(sb);
-	unlock_super(sb);
-	if (sb->s_op->sync_fs)
-		sb->s_op->sync_fs(sb, 1);
-	sync_blockdev(sb->s_bdev);
-	sync_inodes_sb(sb, 1);
+#ifdef CONFIG_SOFTWARE_SUSPEND2
+	/* A safety net. During suspend, we might overwrite
+	 * memory containing filesystem info. We don't then
+	 * want to sync it to disk. */
+	if (likely(!(swsusp_state & FREEZE_UNREFRIGERATED)))
+#endif
+	{
+		sync_inodes_sb(sb, 0);
+		DQUOT_SYNC(sb);
+		lock_super(sb);
+		if (sb->s_dirt && sb->s_op->write_super)
+			sb->s_op->write_super(sb);
+		unlock_super(sb);
+		if (sb->s_op->sync_fs)
+			sb->s_op->sync_fs(sb, 1);
+		sync_blockdev(sb->s_bdev);
+		sync_inodes_sb(sb, 1);
+	}
 
 	return sync_blockdev(sb->s_bdev);
 }
@@ -251,12 +260,20 @@
 int fsync_bdev(struct block_device *bdev)
 {
 	struct super_block *sb = get_super(bdev);
+	int result = 0;
+ 	DECLARE_SWSUSP_LOCAL_VAR;
+	
+	SWSUSP_ACTIVITY_START(PF_SYNCTHREAD);
+	current->flags |= PF_SYNCTHREAD;
 	if (sb) {
 		int res = fsync_super(sb);
 		drop_super(sb);
 		return res;
 	}
-	return sync_blockdev(bdev);
+	result = sync_blockdev(bdev);
+	current->flags &= ~PF_SYNCTHREAD;
+ 	SWSUSP_ACTIVITY_END;
+	return result;
 }
 
 /*
@@ -265,20 +282,34 @@
  */
 static void do_sync(unsigned long wait)
 {
-	wakeup_bdflush(0);
-	sync_inodes(0);		/* All mappings, inodes and their blockdevs */
-	DQUOT_SYNC(NULL);
-	sync_supers();		/* Write the superblocks */
-	sync_filesystems(0);	/* Start syncing the filesystems */
-	sync_filesystems(wait);	/* Waitingly sync the filesystems */
-	sync_inodes(wait);	/* Mappings, inodes and blockdevs, again. */
-	if (!wait)
-		printk("Emergency Sync complete\n");
+#ifdef CONFIG_SOFTWARE_SUSPEND2
+	/* A safety net. During suspend, we might overwrite
+	 * memory containing filesystem info. We don't then
+	 * want to sync it to disk. */
+	if (likely(!(swsusp_state & FREEZE_UNREFRIGERATED)))
+#endif
+	{
+		wakeup_bdflush(0);
+		sync_inodes(0);		/* All mappings, inodes and their blockdevs */
+		DQUOT_SYNC(NULL);
+		sync_supers();		/* Write the superblocks */
+		sync_filesystems(0);	/* Start syncing the filesystems */
+		sync_filesystems(wait);	/* Waitingly sync the filesystems */
+		sync_inodes(wait);	/* Mappings, inodes and blockdevs, again. */
+		if (!wait)
+			printk("Emergency Sync complete\n");
+	}
 }
 
 asmlinkage long sys_sync(void)
 {
+ 	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(PF_SYNCTHREAD);
+	current->flags |= PF_SYNCTHREAD;
 	do_sync(1);
+	current->flags &= ~PF_SYNCTHREAD;
+ 	SWSUSP_ACTIVITY_END;
 	return 0;
 }
 
@@ -319,6 +350,10 @@
 	struct file * file;
 	struct address_space *mapping;
 	int ret, err;
+ 	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(PF_SYNCTHREAD);
+	current->flags |= PF_SYNCTHREAD;
 
 	ret = -EBADF;
 	file = fget(fd);
@@ -349,6 +384,8 @@
 out_putf:
 	fput(file);
 out:
+	current->flags &= ~PF_SYNCTHREAD;
+	SWSUSP_ACTIVITY_END;
 	return ret;
 }
 
@@ -357,6 +394,10 @@
 	struct file * file;
 	struct address_space *mapping;
 	int ret, err;
+ 	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(PF_SYNCTHREAD);
+	current->flags |= PF_SYNCTHREAD;
 
 	ret = -EBADF;
 	file = fget(fd);
@@ -384,6 +425,8 @@
 out_putf:
 	fput(file);
 out:
+	current->flags &= ~PF_SYNCTHREAD;
+	SWSUSP_ACTIVITY_END;
 	return ret;
 }
 
@@ -1071,6 +1114,10 @@
 	 * async buffer heads in use.
 	 */
 	free_more_memory();
+#ifdef CONFIG_SOFTWARE_SUSPEND2
+	if (suspend_task == current->pid)
+		cleanup_finished_swsusp_io();
+#endif
 	goto try_again;
 }
 
@@ -2800,7 +2847,7 @@
  *
  * try_to_free_buffers() is non-blocking.
  */
-static inline int buffer_busy(struct buffer_head *bh)
+inline int buffer_busy(struct buffer_head *bh)
 {
 	return atomic_read(&bh->b_count) |
 		(bh->b_state & ((1 << BH_Dirty) | (1 << BH_Lock)));
diff -ruN linux-2.6.2/fs/dcache.c software-suspend-linux-2.6.2/fs/dcache.c
--- linux-2.6.2/fs/dcache.c	2004-01-13 16:17:23.000000000 +1300
+++ software-suspend-linux-2.6.2/fs/dcache.c	2004-02-06 17:41:09.000000000 +1300
@@ -25,6 +25,7 @@
 #include <linux/module.h>
 #include <linux/mount.h>
 #include <linux/file.h>
+#include <linux/suspend.h>
 #include <asm/uaccess.h>
 #include <linux/security.h>
 #include <linux/seqlock.h>
@@ -1372,10 +1373,13 @@
 	struct vfsmount *pwdmnt, *rootmnt;
 	struct dentry *pwd, *root;
 	char *page = (char *) __get_free_page(GFP_USER);
+	DECLARE_SWSUSP_LOCAL_VAR;
 
 	if (!page)
 		return -ENOMEM;
 
+	SWSUSP_ACTIVITY_START(0);
+
 	read_lock(&current->fs->lock);
 	pwdmnt = mntget(current->fs->pwdmnt);
 	pwd = dget(current->fs->pwd);
@@ -1413,6 +1417,7 @@
 	dput(root);
 	mntput(rootmnt);
 	free_page((unsigned long) page);
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 
diff -ruN linux-2.6.2/fs/devfs/base.c software-suspend-linux-2.6.2/fs/devfs/base.c
--- linux-2.6.2/fs/devfs/base.c	2004-02-06 17:27:46.000000000 +1300
+++ software-suspend-linux-2.6.2/fs/devfs/base.c	2004-02-06 17:41:09.000000000 +1300
@@ -676,6 +676,7 @@
 #include <linux/smp.h>
 #include <linux/rwsem.h>
 #include <linux/sched.h>
+#include <linux/suspend.h>
 
 #include <asm/uaccess.h>
 #include <asm/io.h>
@@ -2607,11 +2608,13 @@
     struct fs_info *fs_info = file->f_dentry->d_inode->i_sb->s_fs_info;
     struct devfsd_notify_struct *info = fs_info->devfsd_info;
     DECLARE_WAITQUEUE (wait, current);
+    DECLARE_SWSUSP_LOCAL_VAR;
 
     /*  Can't seek (pread) on this device  */
     if (ppos != &file->f_pos) return -ESPIPE;
     /*  Verify the task has grabbed the queue  */
     if (fs_info->devfsd_task != current) return -EPERM;
+    current->flags |= PF_SYNCTHREAD;
     info->major = 0;
     info->minor = 0;
     /*  Block for a new entry  */
@@ -2621,12 +2624,15 @@
     {
 	fs_info->devfsd_sleeping = TRUE;
 	wake_up (&fs_info->revalidate_wait_queue);
+        SWSUSP_ACTIVITY_SYNCTHREAD_PAUSING;
 	schedule ();
+        SWSUSP_ACTIVITY_RESTARTING(0);
 	fs_info->devfsd_sleeping = FALSE;
 	if ( signal_pending (current) )
 	{
 	    remove_wait_queue (&fs_info->devfsd_wait_queue, &wait);
 	    __set_current_state (TASK_RUNNING);
+    	    current->flags &= ~PF_SYNCTHREAD;
 	    return -EINTR;
 	}
 	set_current_state (TASK_INTERRUPTIBLE);
@@ -2650,7 +2656,10 @@
 	info->minor = MINOR(de->u.bdev.dev);
     }
     pos = devfs_generate_path (de, info->devname, DEVFS_PATHLEN);
-    if (pos < 0) return pos;
+    if (pos < 0) {
+    	    current->flags &= ~PF_SYNCTHREAD;
+	    return pos;
+    }
     info->namelen = DEVFS_PATHLEN - pos - 1;
     if (info->mode == 0) info->mode = de->mode;
     devname_offset = info->devname - (char *) info;
@@ -2662,6 +2671,7 @@
 	if (tlen > len) tlen = len;
 	if ( copy_to_user (buf, (char *) info + rpos, tlen) )
 	{
+    	    current->flags &= ~PF_SYNCTHREAD;
 	    return -EFAULT;
 	}
 	rpos += tlen;
@@ -2677,6 +2687,7 @@
 	if ( copy_to_user (buf, info->devname + pos + rpos - devname_offset,
 			   tlen) )
 	{
+    	    current->flags &= ~PF_SYNCTHREAD;
 	    return -EFAULT;
 	}
 	rpos += tlen;
@@ -2700,6 +2711,7 @@
 	*ppos = 0;
     }
     else *ppos = rpos;
+    current->flags &= ~PF_SYNCTHREAD;
     return tlen;
 }   /*  End Function devfsd_read  */
 
diff -ruN linux-2.6.2/fs/exec.c software-suspend-linux-2.6.2/fs/exec.c
--- linux-2.6.2/fs/exec.c	2004-02-06 17:27:47.000000000 +1300
+++ software-suspend-linux-2.6.2/fs/exec.c	2004-02-06 17:41:09.000000000 +1300
@@ -45,6 +45,7 @@
 #include <linux/mount.h>
 #include <linux/security.h>
 #include <linux/rmap-locking.h>
+#include <linux/suspend.h>
 
 #include <asm/uaccess.h>
 #include <asm/pgalloc.h>
@@ -120,6 +121,9 @@
 	struct file * file;
 	struct nameidata nd;
 	int error;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	nd.intent.open.flags = FMODE_READ;
 	error = __user_walk(library, LOOKUP_FOLLOW|LOOKUP_OPEN, &nd);
@@ -160,6 +164,7 @@
 	}
 	fput(file);
 out:
+	SWSUSP_ACTIVITY_END;
   	return error;
 exit:
 	path_release(&nd);
@@ -1090,14 +1095,19 @@
 	struct file *file;
 	int retval;
 	int i;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	sched_balance_exec();
 
 	file = open_exec(filename);
 
 	retval = PTR_ERR(file);
-	if (IS_ERR(file))
+	if (IS_ERR(file)) {
+		SWSUSP_ACTIVITY_END;
 		return retval;
+	}
 
 	bprm.p = PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *);
 	memset(bprm.page, 0, MAX_ARG_PAGES*sizeof(bprm.page[0]));
@@ -1153,6 +1163,7 @@
 
 		/* execve success */
 		security_bprm_free(&bprm);
+		SWSUSP_ACTIVITY_END;
 		return retval;
 	}
 
@@ -1176,6 +1187,7 @@
 		allow_write_access(bprm.file);
 		fput(bprm.file);
 	}
+	SWSUSP_ACTIVITY_END;
 	return retval;
 }
 
@@ -1366,6 +1378,9 @@
 	struct inode * inode;
 	struct file * file;
 	int retval = 0;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	lock_kernel();
 	binfmt = current->binfmt;
@@ -1413,5 +1428,6 @@
 	complete_all(&mm->core_done);
 fail:
 	unlock_kernel();
+	SWSUSP_ACTIVITY_END;
 	return retval;
 }
diff -ruN linux-2.6.2/fs/fcntl.c software-suspend-linux-2.6.2/fs/fcntl.c
--- linux-2.6.2/fs/fcntl.c	2004-02-06 17:27:47.000000000 +1300
+++ software-suspend-linux-2.6.2/fs/fcntl.c	2004-02-06 17:41:09.000000000 +1300
@@ -14,6 +14,7 @@
 #include <linux/module.h>
 #include <linux/security.h>
 #include <linux/ptrace.h>
+#include <linux/suspend.h>
 
 #include <asm/poll.h>
 #include <asm/siginfo.h>
@@ -153,6 +154,9 @@
 	int err = -EBADF;
 	struct file * file, *tofree;
 	struct files_struct * files = current->files;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	spin_lock(&files->file_lock);
 	if (!(file = fcheck(oldfd)))
@@ -191,6 +195,7 @@
 		filp_close(tofree, files);
 	err = newfd;
 out:
+	SWSUSP_ACTIVITY_END;
 	return err;
 out_unlock:
 	spin_unlock(&files->file_lock);
@@ -206,9 +211,13 @@
 {
 	int ret = -EBADF;
 	struct file * file = fget(fildes);
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	if (file)
 		ret = dupfd(file, 0);
+	SWSUSP_ACTIVITY_END;
 	return ret;
 }
 
@@ -357,6 +366,9 @@
 {	
 	struct file * filp;
 	long err = -EBADF;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	filp = fget(fd);
 	if (!filp)
@@ -365,6 +377,7 @@
 	err = security_file_fcntl(filp, cmd, arg);
 	if (err) {
 		fput(filp);
+		SWSUSP_ACTIVITY_END;
 		return err;
 	}
 
@@ -372,6 +385,7 @@
 
  	fput(filp);
 out:
+	SWSUSP_ACTIVITY_END;
 	return err;
 }
 
@@ -380,6 +394,9 @@
 {	
 	struct file * filp;
 	long err;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	err = -EBADF;
 	filp = fget(fd);
@@ -389,6 +406,7 @@
 	err = security_file_fcntl(filp, cmd, arg);
 	if (err) {
 		fput(filp);
+		SWSUSP_ACTIVITY_END;
 		return err;
 	}
 	err = -EBADF;
@@ -407,6 +425,7 @@
 	}
 	fput(filp);
 out:
+	SWSUSP_ACTIVITY_END;
 	return err;
 }
 #endif

(and more in)
+++ software-suspend-linux-2.6.2/fs/jbd/journal.c	2004-02-06 17:41:09.000000000 +1300
+++ software-suspend-linux-2.6.2/fs/jffs/intrep.c	2004-02-06 17:43:15.000000000 +1300
+++ software-suspend-linux-2.6.2/fs/jffs2/background.c	2004-02-06 17:41:09.000000000 +1300
+++ software-suspend-linux-2.6.2/fs/jfs/jfs_logmgr.c	2004-02-06 17:41:09.000000000 +1300
+++ software-suspend-linux-2.6.2/fs/jfs/jfs_txnmgr.c	2004-02-06 17:41:09.000000000 +1300
+++ software-suspend-linux-2.6.2/fs/lockd/clntlock.c	2004-02-06 17:41:09.000000000 +1300
+++ software-suspend-linux-2.6.2/fs/lockd/clntproc.c	2004-02-06 17:41:09.000000000 +1300
+++ software-suspend-linux-2.6.2/fs/lockd/svc.c	2004-02-06 17:41:09.000000000 +1300
+++ software-suspend-linux-2.6.2/fs/locks.c	2004-02-06 17:41:09.000000000 +1300
+++ software-suspend-linux-2.6.2/fs/namei.c	2004-02-06 17:41:09.000000000 +1300
+++ software-suspend-linux-2.6.2/fs/namespace.c	2004-02-06 17:41:09.000000000 +1300
@@ -21,6 +21,7 @@
 #include <linux/namei.h>
 #include <linux/security.h>
 #include <linux/mount.h>
+#include <linux/suspend.h>
 #include <asm/uaccess.h>
 
 extern int __init init_rootfs(void);
@@ -377,6 +378,9 @@
 {
 	struct nameidata nd;
 	int retval;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	retval = __user_walk(name, LOOKUP_FOLLOW, &nd);
 	if (retval)
@@ -395,6 +399,7 @@
 dput_and_out:
 	path_release(&nd);
 out:
+	SWSUSP_ACTIVITY_END;
 	return retval;
 }
 
@@ -877,10 +882,15 @@
 	unsigned long type_page;
 	unsigned long dev_page;
 	char *dir_page;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	retval = copy_mount_options (type, &type_page);
-	if (retval < 0)
+	if (retval < 0) {
+		SWSUSP_ACTIVITY_END;
 		return retval;
+	}
 
 	dir_page = getname(dir_name);
 	retval = PTR_ERR(dir_page);
@@ -907,6 +917,7 @@
 	putname(dir_page);
 out1:
 	free_page(type_page);
+	SWSUSP_ACTIVITY_END;
 	return retval;
 }
 
@@ -999,10 +1010,12 @@
 	struct vfsmount *tmp;
 	struct nameidata new_nd, old_nd, parent_nd, root_parent, user_nd;
 	int error;
+	DECLARE_SWSUSP_LOCAL_VAR;
 
 	if (!capable(CAP_SYS_ADMIN))
 		return -EPERM;
 
+	SWSUSP_ACTIVITY_START(0);
 	lock_kernel();
 
 	error = __user_walk(new_root, LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &new_nd);
@@ -1079,6 +1092,7 @@
 	path_release(&new_nd);
 out0:
 	unlock_kernel();
+	SWSUSP_ACTIVITY_END;
 	return error;
 out3:
 	spin_unlock(&vfsmount_lock);
diff -ruN linux-2.6.2/fs/open.c software-suspend-linux-2.6.2/fs/open.c
--- linux-2.6.2/fs/open.c	2004-02-06 17:27:48.000000000 +1300
+++ software-suspend-linux-2.6.2/fs/open.c	2004-02-06 17:41:09.000000000 +1300
@@ -19,6 +19,7 @@
 #include <linux/security.h>
 #include <linux/mount.h>
 #include <linux/vfs.h>
+#include <linux/suspend.h>
 #include <asm/uaccess.h>
 #include <linux/fs.h>
 #include <linux/pagemap.h>
@@ -109,6 +110,9 @@
 {
 	struct nameidata nd;
 	int error;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	error = user_path_walk(path, &nd);
 	if (!error) {
@@ -118,6 +122,7 @@
 			error = -EFAULT;
 		path_release(&nd);
 	}
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 
@@ -126,9 +131,13 @@
 {
 	struct nameidata nd;
 	long error;
+	DECLARE_SWSUSP_LOCAL_VAR;
 
 	if (sz != sizeof(*buf))
 		return -EINVAL;
+	
+	SWSUSP_ACTIVITY_START(0);
+
 	error = user_path_walk(path, &nd);
 	if (!error) {
 		struct statfs64 tmp;
@@ -137,6 +146,7 @@
 			error = -EFAULT;
 		path_release(&nd);
 	}
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 
@@ -146,6 +156,9 @@
 	struct file * file;
 	struct statfs tmp;
 	int error;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	error = -EBADF;
 	file = fget(fd);
@@ -156,6 +169,7 @@
 		error = -EFAULT;
 	fput(file);
 out:
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 
@@ -164,10 +178,13 @@
 	struct file * file;
 	struct statfs64 tmp;
 	int error;
+	DECLARE_SWSUSP_LOCAL_VAR;
 
 	if (sz != sizeof(*buf))
 		return -EINVAL;
 
+	SWSUSP_ACTIVITY_START(0);
+
 	error = -EBADF;
 	file = fget(fd);
 	if (!file)
@@ -177,6 +194,7 @@
 		error = -EFAULT;
 	fput(file);
 out:
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 
@@ -202,6 +220,9 @@
 	struct nameidata nd;
 	struct inode * inode;
 	int error;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	error = -EINVAL;
 	if (length < 0)	/* sorry, but loff_t says... */
@@ -254,6 +275,7 @@
 dput_and_out:
 	path_release(&nd);
 out:
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 
@@ -269,6 +291,9 @@
 	struct dentry *dentry;
 	struct file * file;
 	int error;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	error = -EINVAL;
 	if (length < 0)
@@ -303,6 +328,7 @@
 out_putf:
 	fput(file);
 out:
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 
@@ -343,6 +369,9 @@
 	struct nameidata nd;
 	struct inode * inode;
 	struct iattr newattrs;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	error = user_path_walk(filename, &nd);
 	if (error)
@@ -384,6 +413,7 @@
 dput_and_out:
 	path_release(&nd);
 out:
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 
@@ -399,6 +429,9 @@
 	struct nameidata nd;
 	struct inode * inode;
 	struct iattr newattrs;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	error = user_path_walk(filename, &nd);
 
@@ -437,6 +470,7 @@
 dput_and_out:
 	path_release(&nd);
 out:
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 
@@ -461,10 +495,13 @@
 	int old_fsuid, old_fsgid;
 	kernel_cap_t old_cap;
 	int res;
+	DECLARE_SWSUSP_LOCAL_VAR;
 
 	if (mode & ~S_IRWXO)	/* where's F_OK, X_OK, W_OK, R_OK? */
 		return -EINVAL;
 
+	SWSUSP_ACTIVITY_START(0);
+
 	old_fsuid = current->fsuid;
 	old_fsgid = current->fsgid;
 	old_cap = current->cap_effective;
@@ -499,6 +536,7 @@
 	current->fsgid = old_fsgid;
 	current->cap_effective = old_cap;
 
+	SWSUSP_ACTIVITY_END;
 	return res;
 }
 
@@ -506,6 +544,9 @@
 {
 	struct nameidata nd;
 	int error;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	error = __user_walk(filename, LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &nd);
 	if (error)
@@ -520,6 +561,7 @@
 dput_and_out:
 	path_release(&nd);
 out:
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 
@@ -530,6 +572,9 @@
 	struct inode *inode;
 	struct vfsmount *mnt;
 	int error;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	error = -EBADF;
 	file = fget(fd);
@@ -550,6 +595,7 @@
 out_putf:
 	fput(file);
 out:
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 
@@ -557,6 +603,9 @@
 {
 	struct nameidata nd;
 	int error;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	error = __user_walk(filename, LOOKUP_FOLLOW | LOOKUP_DIRECTORY | LOOKUP_NOALT, &nd);
 	if (error)
@@ -576,6 +625,7 @@
 dput_and_out:
 	path_release(&nd);
 out:
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 
@@ -586,6 +636,9 @@
 	struct file * file;
 	int err = -EBADF;
 	struct iattr newattrs;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	file = fget(fd);
 	if (!file)
@@ -611,6 +664,7 @@
 out_putf:
 	fput(file);
 out:
+	SWSUSP_ACTIVITY_END;
 	return err;
 }
 
@@ -620,6 +674,9 @@
 	struct inode * inode;
 	int error;
 	struct iattr newattrs;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	error = user_path_walk(filename, &nd);
 	if (error)
@@ -645,6 +702,7 @@
 dput_and_out:
 	path_release(&nd);
 out:
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 
@@ -687,12 +745,16 @@
 {
 	struct nameidata nd;
 	int error;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	error = user_path_walk(filename, &nd);
 	if (!error) {
 		error = chown_common(nd.dentry, user, group);
 		path_release(&nd);
 	}
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 
@@ -700,12 +762,16 @@
 {
 	struct nameidata nd;
 	int error;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	error = user_path_walk_link(filename, &nd);
 	if (!error) {
 		error = chown_common(nd.dentry, user, group);
 		path_release(&nd);
 	}
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 
@@ -714,12 +780,16 @@
 {
 	struct file * file;
 	int error = -EBADF;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	file = fget(fd);
 	if (file) {
 		error = chown_common(file->f_dentry, user, group);
 		fput(file);
 	}
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 
@@ -929,6 +999,9 @@
 {
 	char * tmp;
 	int fd, error;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 #if BITS_PER_LONG != 32
 	flags |= O_LARGEFILE;
@@ -947,6 +1020,7 @@
 out:
 		putname(tmp);
 	}
+	SWSUSP_ACTIVITY_END;
 	return fd;
 
 out_error:
@@ -1009,6 +1083,9 @@
 {
 	struct file * filp;
 	struct files_struct *files = current->files;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	spin_lock(&files->file_lock);
 	if (fd >= files->max_fds)
@@ -1020,10 +1097,12 @@
 	FD_CLR(fd, files->close_on_exec);
 	__put_unused_fd(files, fd);
 	spin_unlock(&files->file_lock);
+	SWSUSP_ACTIVITY_END;
 	return filp_close(filp, files);
 
 out_unlock:
 	spin_unlock(&files->file_lock);
+	SWSUSP_ACTIVITY_END;
 	return -EBADF;
 }
 
@@ -1035,10 +1114,15 @@
  */
 asmlinkage long sys_vhangup(void)
 {
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 	if (capable(CAP_SYS_TTY_CONFIG)) {
 		tty_vhangup(current->tty);
+		SWSUSP_ACTIVITY_END;
 		return 0;
 	}
+	SWSUSP_ACTIVITY_END;
 	return -EPERM;
 }
 
diff -ruN linux-2.6.2/fs/pipe.c software-suspend-linux-2.6.2/fs/pipe.c
--- linux-2.6.2/fs/pipe.c	2004-02-06 17:27:48.000000000 +1300
+++ software-suspend-linux-2.6.2/fs/pipe.c	2004-02-06 17:41:09.000000000 +1300
@@ -14,6 +14,7 @@
 #include <linux/mount.h>
 #include <linux/pipe_fs_i.h>
 #include <linux/uio.h>
+#include <linux/suspend.h>
 #include <asm/uaccess.h>
 #include <asm/ioctls.h>
 
@@ -36,10 +37,13 @@
 void pipe_wait(struct inode * inode)
 {
 	DEFINE_WAIT(wait);
+	DECLARE_SWSUSP_LOCAL_VAR;
 
 	prepare_to_wait(PIPE_WAIT(*inode), &wait, TASK_INTERRUPTIBLE);
 	up(PIPE_SEM(*inode));
+	SWSUSP_ACTIVITY_PAUSING;
 	schedule();
+	SWSUSP_ACTIVITY_RESTARTING(0);
 	finish_wait(PIPE_WAIT(*inode), &wait);
 	down(PIPE_SEM(*inode));
 }

(and more)
+++ software-suspend-linux-2.6.2/fs/proc/generic.c	2004-02-06 17:41:09.000000000 +1300
+++ software-suspend-linux-2.6.2/fs/proc/kmsg.c	2004-02-06 17:41:09.000000000 +1300
diff -ruN linux-2.6.2/fs/read_write.c software-suspend-linux-2.6.2/fs/read_write.c
--- linux-2.6.2/fs/read_write.c	2004-02-06 17:27:48.000000000 +1300
+++ software-suspend-linux-2.6.2/fs/read_write.c	2004-02-06 17:41:09.000000000 +1300
@@ -13,6 +13,7 @@
 #include <linux/dnotify.h>
 #include <linux/security.h>
 #include <linux/module.h>
+#include <linux/suspend.h>
 
 #include <asm/uaccess.h>
 
@@ -126,6 +127,9 @@
 	off_t retval;
 	struct file * file;
 	int fput_needed;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	retval = -EBADF;
 	file = fget_light(fd, &fput_needed);
@@ -141,6 +145,7 @@
 	}
 	fput_light(file, fput_needed);
 bad:
+	SWSUSP_ACTIVITY_END;
 	return retval;
 }
 
@@ -153,6 +158,9 @@
 	struct file * file;
 	loff_t offset;
 	int fput_needed;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	retval = -EBADF;
 	file = fget_light(fd, &fput_needed);
@@ -175,6 +183,7 @@
 out_putf:
 	fput_light(file, fput_needed);
 bad:
+	SWSUSP_ACTIVITY_END;
 	return retval;
 }
 #endif
@@ -272,12 +281,16 @@
 	struct file *file;
 	ssize_t ret = -EBADF;
 	int fput_needed;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	file = fget_light(fd, &fput_needed);
 	if (file) {
 		ret = vfs_read(file, buf, count, &file->f_pos);
 		fput_light(file, fput_needed);
 	}
+	SWSUSP_ACTIVITY_END;
 
 	return ret;
 }
@@ -287,6 +300,9 @@
 	struct file *file;
 	ssize_t ret = -EBADF;
 	int fput_needed;
+	DECLARE_SWSUSP_LOCAL_VAR;
+	
+	SWSUSP_ACTIVITY_START(0);
 
 	file = fget_light(fd, &fput_needed);
 	if (file) {
@@ -294,6 +310,7 @@
 		fput_light(file, fput_needed);
 	}
 
+	SWSUSP_ACTIVITY_END;
 	return ret;
 }
 
@@ -303,16 +320,20 @@
 	struct file *file;
 	ssize_t ret = -EBADF;
 	int fput_needed;
-
+	DECLARE_SWSUSP_LOCAL_VAR;
+	
 	if (pos < 0)
 		return -EINVAL;
 
+	SWSUSP_ACTIVITY_START(0);
+
 	file = fget_light(fd, &fput_needed);
 	if (file) {
 		ret = vfs_read(file, buf, count, &pos);
 		fput_light(file, fput_needed);
 	}
 
+	SWSUSP_ACTIVITY_END;
 	return ret;
 }
 
@@ -322,16 +343,19 @@
 	struct file *file;
 	ssize_t ret = -EBADF;
 	int fput_needed;
+	DECLARE_SWSUSP_LOCAL_VAR;
 
 	if (pos < 0)
 		return -EINVAL;
 
+	SWSUSP_ACTIVITY_START(0);
 	file = fget_light(fd, &fput_needed);
 	if (file) {
 		ret = vfs_write(file, buf, count, &pos);
 		fput_light(file, fput_needed);
 	}
 
+	SWSUSP_ACTIVITY_END;
 	return ret;
 }
 
@@ -509,13 +533,16 @@
 	struct file *file;
 	ssize_t ret = -EBADF;
 	int fput_needed;
+	DECLARE_SWSUSP_LOCAL_VAR;
 
+	SWSUSP_ACTIVITY_START(0);
 	file = fget_light(fd, &fput_needed);
 	if (file) {
 		ret = vfs_readv(file, vec, vlen, &file->f_pos);
 		fput_light(file, fput_needed);
 	}
 
+	SWSUSP_ACTIVITY_END;
 	return ret;
 }
 
@@ -525,6 +552,9 @@
 	struct file *file;
 	ssize_t ret = -EBADF;
 	int fput_needed;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	file = fget_light(fd, &fput_needed);
 	if (file) {
@@ -532,6 +562,7 @@
 		fput_light(file, fput_needed);
 	}
 
+	SWSUSP_ACTIVITY_END;
 	return ret;
 }
 
@@ -622,33 +653,48 @@
 	loff_t pos;
 	off_t off;
 	ssize_t ret;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	if (offset) {
 		if (unlikely(get_user(off, offset)))
-			return -EFAULT;
-		pos = off;
-		ret = do_sendfile(out_fd, in_fd, &pos, count, MAX_NON_LFS);
-		if (unlikely(put_user(pos, offset)))
-			return -EFAULT;
+			ret = -EFAULT;
+		else {
+			pos = off;
+			ret = do_sendfile(out_fd, in_fd, &pos, count, MAX_NON_LFS);
+			if (unlikely(put_user(pos, offset)))
+				ret = -EFAULT;
+		}
+		SWSUSP_ACTIVITY_END;
 		return ret;
 	}
 
-	return do_sendfile(out_fd, in_fd, NULL, count, MAX_NON_LFS);
+	ret = do_sendfile(out_fd, in_fd, NULL, count, MAX_NON_LFS);
+	SWSUSP_ACTIVITY_END;
+	return ret;
 }
 
 asmlinkage ssize_t sys_sendfile64(int out_fd, int in_fd, loff_t __user *offset, size_t count)
 {
 	loff_t pos;
 	ssize_t ret;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	if (offset) {
 		if (unlikely(copy_from_user(&pos, offset, sizeof(loff_t))))
 			return -EFAULT;
-		ret = do_sendfile(out_fd, in_fd, &pos, count, 0);
-		if (unlikely(put_user(pos, offset)))
-			return -EFAULT;
+		else {
+			ret = do_sendfile(out_fd, in_fd, &pos, count, 0);
+			if (unlikely(put_user(pos, offset)))
+				ret = -EFAULT;
+		}
+		SWSUSP_ACTIVITY_END;
 		return ret;
 	}
 
+	SWSUSP_ACTIVITY_END;
 	return do_sendfile(out_fd, in_fd, NULL, count, 0);
 }
diff -ruN linux-2.6.2/fs/stat.c software-suspend-linux-2.6.2/fs/stat.c
--- linux-2.6.2/fs/stat.c	2004-02-06 17:27:49.000000000 +1300
+++ software-suspend-linux-2.6.2/fs/stat.c	2004-02-06 17:43:15.000000000 +1300
@@ -14,6 +14,7 @@
 #include <linux/fs.h>
 #include <linux/namei.h>
 #include <linux/security.h>
+#include <linux/suspend.h>
 
 #include <asm/uaccess.h>
 
@@ -150,30 +151,42 @@
 {
 	struct kstat stat;
 	int error = vfs_stat(filename, &stat);
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	if (!error)
 		error = cp_old_stat(&stat, statbuf);
 
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 asmlinkage long sys_lstat(char __user * filename, struct __old_kernel_stat __user * statbuf)
 {
 	struct kstat stat;
 	int error = vfs_lstat(filename, &stat);
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	if (!error)
 		error = cp_old_stat(&stat, statbuf);
 
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 asmlinkage long sys_fstat(unsigned int fd, struct __old_kernel_stat __user * statbuf)
 {
 	struct kstat stat;
 	int error = vfs_fstat(fd, &stat);
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	if (!error)
 		error = cp_old_stat(&stat, statbuf);
 
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 
@@ -229,30 +242,42 @@
 {
 	struct kstat stat;
 	int error = vfs_stat(filename, &stat);
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	if (!error)
 		error = cp_new_stat(&stat, statbuf);
 
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 asmlinkage long sys_newlstat(char __user * filename, struct stat __user * statbuf)
 {
 	struct kstat stat;
 	int error = vfs_lstat(filename, &stat);
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	if (!error)
 		error = cp_new_stat(&stat, statbuf);
 
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 asmlinkage long sys_newfstat(unsigned int fd, struct stat __user * statbuf)
 {
 	struct kstat stat;
 	int error = vfs_fstat(fd, &stat);
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	if (!error)
 		error = cp_new_stat(&stat, statbuf);
 
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 
@@ -260,10 +285,13 @@
 {
 	struct nameidata nd;
 	int error;
+	DECLARE_SWSUSP_LOCAL_VAR;
 
 	if (bufsiz <= 0)
 		return -EINVAL;
 
+	SWSUSP_ACTIVITY_START(0);
+
 	error = user_path_walk_link(path, &nd);
 	if (!error) {
 		struct inode * inode = nd.dentry->d_inode;
@@ -278,6 +306,7 @@
 		}
 		path_release(&nd);
 	}
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 
@@ -324,30 +353,42 @@
 {
 	struct kstat stat;
 	int error = vfs_stat(filename, &stat);
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	if (!error)
 		error = cp_new_stat64(&stat, statbuf);
 
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 asmlinkage long sys_lstat64(char __user * filename, struct stat64 __user * statbuf)
 {
 	struct kstat stat;
 	int error = vfs_lstat(filename, &stat);
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	if (!error)
 		error = cp_new_stat64(&stat, statbuf);
 
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 asmlinkage long sys_fstat64(unsigned long fd, struct stat64 __user * statbuf)
 {
 	struct kstat stat;
 	int error = vfs_fstat(fd, &stat);
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
 	if (!error)
 		error = cp_new_stat64(&stat, statbuf);
 
+	SWSUSP_ACTIVITY_END;
 	return error;
 }
 
diff -ruN linux-2.6.2/fs/super.c software-suspend-linux-2.6.2/fs/super.c
--- linux-2.6.2/fs/super.c	2004-01-13 16:19:45.000000000 +1300
+++ software-suspend-linux-2.6.2/fs/super.c	2004-02-06 17:41:09.000000000 +1300
@@ -34,6 +34,7 @@
 #include <linux/vfs.h>
 #include <linux/writeback.h>		/* for the emergency remount stuff */
 #include <asm/uaccess.h>
+#include <linux/suspend.h>
 
 
 void get_filesystem(struct file_system_type *fs);
@@ -430,6 +431,9 @@
         struct ustat tmp;
         struct kstatfs sbuf;
 	int err = -EINVAL;
+	DECLARE_SWSUSP_LOCAL_VAR;
+
+	SWSUSP_ACTIVITY_START(0);
 
         s = user_get_super(new_decode_dev(dev));
         if (s == NULL)
@@ -445,6 +449,7 @@
 
         err = copy_to_user(ubuf,&tmp,sizeof(struct ustat)) ? -EFAULT : 0;
 out:
+	SWSUSP_ACTIVITY_END;
 	return err;
 }
 

...and more....

-- 
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]

  reply	other threads:[~2004-03-14  0:39 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-03-12 22:46 Dealing with swsusp vs. pmdisk Pavel Machek
2004-03-13  0:47 ` Theodore Ts'o
2004-03-13  2:51   ` Benjamin Herrenschmidt
2004-03-13 12:36     ` Pavel Machek
2004-03-13 22:19       ` Micha Feigin
2004-03-14  0:18       ` Benjamin Herrenschmidt
2004-03-14  0:37         ` Pavel Machek [this message]
2004-03-15 20:05           ` Nigel Cunningham
2004-03-16  0:01             ` Benjamin Herrenschmidt
2004-03-15 23:31               ` Nigel Cunningham
2004-03-16  1:40                 ` Benjamin Herrenschmidt
2004-03-15 23:59                   ` Nigel Cunningham
2004-03-16 10:09                   ` Pavel Machek
2004-03-13 12:28   ` Pavel Machek
2004-03-15 23:17     ` Jan Rychter
2004-03-16 18:16       ` Kevin Fenzi, Kevin Fenzi
2004-03-18 10:21     ` Jan Rychter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20040314003717.GI549@elf.ucw.cz \
    --to=pavel@ucw.cz \
    --cc=akpm@zip.com.au \
    --cc=benh@kernel.crashing.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tytso@mit.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox