Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.24-git15 /fs/fs-writeback.c

Filename:/fs/fs-writeback.c
Lines Added:17
Lines Deleted:14
Also changed in: (Previous) 2.6.24  2.6.24-rc8  2.6.24-rc7-git8  2.6.24-rc7-git7  2.6.24-rc7  2.6.24-rc6 
(Following) 2.6.24-git16  2.6.24-git17  2.6.24-git18  2.6.24-git19  2.6.24-git20  2.6.24-git21 

Location
[  2.6.24-git15
  [  fs
     o  fs-writeback.c

Patch

diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
index 300324b..0b30640 100644
--- a/fs/fs-writeback.c
+++ b/fs/fs-writeback.c
@@ -284,7 +284,17 @@ __sync_single_inode(struct inode *inode, struct writeback_control *wbc)
              * soon as the queue becomes uncongested.
              */
             inode->i_state |= I_DIRTY_PAGES;
-            requeue_io(inode);
+            if (wbc->nr_to_write <= 0) {
+               /*
+                * slice used up: queue for next turn
+                */
+               requeue_io(inode);
+            } else {
+               /*
+                * somehow blocked: retry later
+                */
+               redirty_tail(inode);
+            }
          } else {
             /*
              * Otherwise fully redirty the inode so that
@@ -334,9 +344,6 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc)
       WARN_ON(inode->i_state & I_WILL_FREE);
 
    if ((wbc->sync_mode != WB_SYNC_ALL) && (inode->i_state & I_SYNC)) {
-      struct address_space *mapping = inode->i_mapping;
-      int ret;
-
       /*
        * We're skipping this inode because it's locked, and we're not
        * doing writeback-for-data-integrity.  Move it to s_more_io so
@@ -345,15 +352,7 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc)
        * completed a full scan of s_io.
        */
       requeue_io(inode);
-
-      /*
-       * Even if we don't actually write the inode itself here,
-       * we can at least start some of the data writeout..
-       */
-      spin_unlock(&inode_lock);
-      ret = do_writepages(mapping, wbc);
-      spin_lock(&inode_lock);
-      return ret;
+      return 0;
    }
 
    /*
@@ -479,8 +478,12 @@ sync_sb_inodes(struct super_block *sb, struct writeback_control *wbc)
       iput(inode);
       cond_resched();
       spin_lock(&inode_lock);
-      if (wbc->nr_to_write <= 0)
+      if (wbc->nr_to_write <= 0) {
+         wbc->more_io = 1;
          break;
+      }
+      if (!list_empty(&sb->s_more_io))
+         wbc->more_io = 1;
    }
    return;      /* Leave any unwritten inodes on s_io */
 }


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.