diff -ruNp 351-syncthreads.patch-old/fs/buffer.c 
351-syncthreads.patch-new/fs/buffer.c
--- 351-syncthreads.patch-old/fs/buffer.c       2005-07-06 11:15:04.000000000 
+1000
+++ 351-syncthreads.patch-new/fs/buffer.c       2005-07-04 23:14:18.000000000 
+1000
@@ -173,6 +173,15 @@ EXPORT_SYMBOL(sync_blockdev);
  */
 int fsync_super(struct super_block *sb)
 {
+       int ret;
+
+       /* A safety net. During suspend, we might overwrite
+        * memory containing filesystem info. We don't then
+        * want to sync it to disk. */
+       BUG_ON(test_suspend_state(SUSPEND_DISABLE_SYNCING));
+       
+       current->flags |= PF_SYNCTHREAD;
+
        sync_inodes_sb(sb, 0);
        DQUOT_SYNC(sb);
        lock_super(sb);
@@ -184,7 +193,10 @@ int fsync_super(struct super_block *sb)
        sync_blockdev(sb->s_bdev);
        sync_inodes_sb(sb, 1);
 
-       return sync_blockdev(sb->s_bdev);
+       ret = sync_blockdev(sb->s_bdev);
+
+       current->flags &= ~PF_SYNCTHREAD;
+       return ret;
 }
 
 /*
@@ -195,12 +207,21 @@ int fsync_super(struct super_block *sb)
 int fsync_bdev(struct block_device *bdev)
 {
        struct super_block *sb = get_super(bdev);
+       int ret;
+
+       BUG_ON(test_suspend_state(SUSPEND_DISABLE_SYNCING));
+
+       current->flags |= PF_SYNCTHREAD;
+
        if (sb) {
                int res = fsync_super(sb);
                drop_super(sb);
+               current->flags &= ~PF_SYNCTHREAD;
                return res;
        }
-       return sync_blockdev(bdev);
+       ret = sync_blockdev(bdev);
+       current->flags &= ~PF_SYNCTHREAD;
+       return ret;
 }
 
 /**
@@ -280,6 +301,13 @@ EXPORT_SYMBOL(thaw_bdev);
  */
 static void do_sync(unsigned long wait)
 {
+       /* A safety net. During suspend, we might overwrite
+        * memory containing filesystem info. We don't then
+        * want to sync it to disk. */
+       BUG_ON(test_suspend_state(SUSPEND_DISABLE_SYNCING));
+
+       current->flags |= PF_SYNCTHREAD;
+
        wakeup_bdflush(0);
        sync_inodes(0);         /* All mappings, inodes and their blockdevs */
        DQUOT_SYNC(NULL);
@@ -291,6 +319,8 @@ static void do_sync(unsigned long wait)
                printk("Emergency Sync complete\n");
        if (unlikely(laptop_mode))
                laptop_sync_completion();
+
+       current->flags &= ~PF_SYNCTHREAD;
 }
 
 asmlinkage long sys_sync(void)
@@ -316,6 +346,10 @@ int file_fsync(struct file *filp, struct
        struct super_block * sb;
        int ret, err;
 
+       BUG_ON(test_suspend_state(SUSPEND_DISABLE_SYNCING));
+
+       current->flags |= PF_SYNCTHREAD;
+
        /* sync the inode to buffers */
        ret = write_inode_now(inode, 0);
 
@@ -330,6 +364,8 @@ int file_fsync(struct file *filp, struct
        err = sync_blockdev(sb->s_bdev);
        if (!ret)
                ret = err;
+
+       current->flags &= ~PF_SYNCTHREAD;
        return ret;
 }
 
@@ -339,6 +375,10 @@ asmlinkage long sys_fsync(unsigned int f
        struct address_space *mapping;
        int ret, err;
 
+       BUG_ON(test_suspend_state(SUSPEND_DISABLE_SYNCING));
+
+       current->flags |= PF_SYNCTHREAD;
+
        ret = -EBADF;
        file = fget(fd);
        if (!file)
@@ -372,6 +412,7 @@ asmlinkage long sys_fsync(unsigned int f
 out_putf:
        fput(file);
 out:
+       current->flags &= ~PF_SYNCTHREAD;
        return ret;
 }
 
@@ -381,6 +422,10 @@ asmlinkage long sys_fdatasync(unsigned i
        struct address_space *mapping;
        int ret, err;
 
+       BUG_ON(test_suspend_state(SUSPEND_DISABLE_SYNCING));
+
+       current->flags |= PF_SYNCTHREAD;
+
        ret = -EBADF;
        file = fget(fd);
        if (!file)
@@ -407,6 +452,7 @@ asmlinkage long sys_fdatasync(unsigned i
 out_putf:
        fput(file);
 out:
+       current->flags &= ~PF_SYNCTHREAD;
        return ret;
 }
 
diff -ruNp 351-syncthreads.patch-old/fs/jbd/journal.c 
351-syncthreads.patch-new/fs/jbd/journal.c
--- 351-syncthreads.patch-old/fs/jbd/journal.c  2005-07-06 11:15:04.000000000 
+1000
+++ 351-syncthreads.patch-new/fs/jbd/journal.c  2005-07-04 23:14:19.000000000 
+1000
@@ -130,6 +130,7 @@ int kjournald(void *arg)
        current_journal = journal;
 
        daemonize("kjournald");
+       current->flags |= PF_SYNCTHREAD;
 
        /* Set up an interval timer which can be used to trigger a
            commit wakeup after the commit interval expires */
diff -ruNp 351-syncthreads.patch-old/fs/jffs/intrep.c 
351-syncthreads.patch-new/fs/jffs/intrep.c
--- 351-syncthreads.patch-old/fs/jffs/intrep.c  2005-07-06 11:15:04.000000000 
+1000
+++ 351-syncthreads.patch-new/fs/jffs/intrep.c  2005-07-04 23:14:19.000000000 
+1000
@@ -3364,6 +3364,7 @@ jffs_garbage_collect_thread(void *ptr)
        D1(int i = 1);
 
        daemonize("jffs_gcd");
+       current->flags |= PF_SYNCTHREAD;
 
        c->gc_task = current;
 
diff -ruNp 351-syncthreads.patch-old/fs/jfs/jfs_logmgr.c 
351-syncthreads.patch-new/fs/jfs/jfs_logmgr.c
--- 351-syncthreads.patch-old/fs/jfs/jfs_logmgr.c       2005-07-06 
11:15:04.000000000 +1000
+++ 351-syncthreads.patch-new/fs/jfs/jfs_logmgr.c       2005-07-04 
23:14:19.000000000 +1000
@@ -2351,6 +2351,7 @@ int jfsIOWait(void *arg)
        struct lbuf *bp;
 
        daemonize("jfsIO");
+       current->flags |= PF_SYNCTHREAD;
 
        complete(&jfsIOwait);
 
diff -ruNp 351-syncthreads.patch-old/fs/jfs/jfs_txnmgr.c 
351-syncthreads.patch-new/fs/jfs/jfs_txnmgr.c
--- 351-syncthreads.patch-old/fs/jfs/jfs_txnmgr.c       2005-07-06 
11:15:04.000000000 +1000
+++ 351-syncthreads.patch-new/fs/jfs/jfs_txnmgr.c       2005-07-04 
23:14:19.000000000 +1000
@@ -47,7 +47,6 @@
 #include <linux/vmalloc.h>
 #include <linux/smp_lock.h>
 #include <linux/completion.h>
-#include <linux/suspend.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include "jfs_incore.h"
@@ -2777,6 +2776,7 @@ int jfs_lazycommit(void *arg)
        struct jfs_sb_info *sbi;
 
        daemonize("jfsCommit");
+       current->flags |= PF_SYNCTHREAD;
 
        complete(&jfsIOwait);
 
diff -ruNp 351-syncthreads.patch-old/fs/lockd/clntlock.c 
351-syncthreads.patch-new/fs/lockd/clntlock.c
--- 351-syncthreads.patch-old/fs/lockd/clntlock.c       2005-07-06 
11:15:04.000000000 +1000
+++ 351-syncthreads.patch-new/fs/lockd/clntlock.c       2005-07-04 
23:14:19.000000000 +1000
@@ -200,6 +200,7 @@ reclaimer(void *ptr)
        struct inode *inode;
 
        daemonize("%s-reclaim", host->h_name);
+       current->flags |= PF_SYNCTHREAD;
        allow_signal(SIGKILL);
 
        /* This one ensures that our parent doesn't terminate while the
diff -ruNp 351-syncthreads.patch-old/fs/lockd/svc.c 
351-syncthreads.patch-new/fs/lockd/svc.c
--- 351-syncthreads.patch-old/fs/lockd/svc.c    2005-06-20 11:47:13.000000000 
+1000
+++ 351-syncthreads.patch-new/fs/lockd/svc.c    2005-07-04 23:14:19.000000000 
+1000
@@ -115,6 +115,7 @@ lockd(struct svc_rqst *rqstp)
        up(&lockd_start);
 
        daemonize("lockd");
+       current->flags |= PF_SYNCTHREAD;
 
        /* Process request with signals blocked, but allow SIGKILL.  */
        allow_signal(SIGKILL);
@@ -138,6 +139,8 @@ lockd(struct svc_rqst *rqstp)
        while ((nlmsvc_users || !signalled()) && nlmsvc_pid == current->pid) {
                long timeout = MAX_SCHEDULE_TIMEOUT;
 
+               try_to_freeze();
+
                if (signalled()) {
                        flush_signals(current);
                        if (nlmsvc_ops) {
diff -ruNp 351-syncthreads.patch-old/fs/nfsd/nfssvc.c 
351-syncthreads.patch-new/fs/nfsd/nfssvc.c
--- 351-syncthreads.patch-old/fs/nfsd/nfssvc.c  2005-06-20 11:47:13.000000000 
+1000
+++ 351-syncthreads.patch-new/fs/nfsd/nfssvc.c  2005-07-04 23:14:19.000000000 
+1000
@@ -182,6 +182,7 @@ nfsd(struct svc_rqst *rqstp)
        /* Lock module and set up kernel thread */
        lock_kernel();
        daemonize("nfsd");
+       current->flags |= PF_SYNCTHREAD;
 
        /* After daemonize() this kernel thread shares current->fs
         * with the init process. We need to create files with a
diff -ruNp 351-syncthreads.patch-old/fs/xfs/linux-2.6/xfs_buf.c 
351-syncthreads.patch-new/fs/xfs/linux-2.6/xfs_buf.c
--- 351-syncthreads.patch-old/fs/xfs/linux-2.6/xfs_buf.c        2005-07-06 
11:15:04.000000000 +1000
+++ 351-syncthreads.patch-new/fs/xfs/linux-2.6/xfs_buf.c        2005-07-04 
23:14:19.000000000 +1000
@@ -1772,7 +1772,7 @@ pagebuf_daemon(
 
        /*  Set up the thread  */
        daemonize("xfsbufd");
-       current->flags |= PF_MEMALLOC;
+       current->flags |= PF_MEMALLOC | PF_SYNCTHREAD;
 
        pagebuf_daemon_task = current;
        pagebuf_daemon_active = 1;
diff -ruNp 351-syncthreads.patch-old/fs/xfs/linux-2.6/xfs_super.c 
351-syncthreads.patch-new/fs/xfs/linux-2.6/xfs_super.c
--- 351-syncthreads.patch-old/fs/xfs/linux-2.6/xfs_super.c      2005-07-06 
11:15:04.000000000 +1000
+++ 351-syncthreads.patch-new/fs/xfs/linux-2.6/xfs_super.c      2005-07-04 
23:14:19.000000000 +1000
@@ -470,6 +470,7 @@ xfssyncd(
        struct vfs_sync_work    *work, *n;
 
        daemonize("xfssyncd");
+       current->flags |= PF_SYNCTHREAD;
 
        vfsp->vfs_sync_work.w_vfs = vfsp;
        vfsp->vfs_sync_work.w_syncer = vfs_sync_worker;
diff -ruNp 351-syncthreads.patch-old/include/linux/sched.h 
351-syncthreads.patch-new/include/linux/sched.h
--- 351-syncthreads.patch-old/include/linux/sched.h     2005-07-06 
11:15:04.000000000 +1000
+++ 351-syncthreads.patch-new/include/linux/sched.h     2005-07-04 
23:14:19.000000000 +1000
@@ -798,6 +798,8 @@ do { if (atomic_dec_and_test(&(tsk)->usa
 #define PF_SYNCWRITE   0x00200000      /* I am doing a sync write */
 #define PF_BORROWED_MM 0x00400000      /* I am a kthread doing use_mm */
 #define PF_RANDOMIZE   0x00800000      /* randomize virtual address space */
+#define PF_SYNCTHREAD  0x01000000      /* this thread can start activity 
during the 
++                                         early part of freezing processes */
 
 /*
  * Only the _current_ task can read/write to tsk->flags, but other
diff -ruNp 351-syncthreads.patch-old/mm/pdflush.c 
351-syncthreads.patch-new/mm/pdflush.c
--- 351-syncthreads.patch-old/mm/pdflush.c      2005-07-06 11:15:04.000000000 
+1000
+++ 351-syncthreads.patch-new/mm/pdflush.c      2005-07-04 23:14:19.000000000 
+1000
@@ -89,7 +89,7 @@ struct pdflush_work {
 
 static int __pdflush(struct pdflush_work *my_work)
 {
-       current->flags |= PF_FLUSHER;
+       current->flags |= (PF_FLUSHER | PF_SYNCTHREAD);
        my_work->fn = NULL;
        my_work->who = current;
        INIT_LIST_HEAD(&my_work->list);

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to