msi-wmi: depend on backlight and fix corner-cases problems
[safe/jmp/linux-2.6] / fs / sync.c
index 1923409..36752a6 100644 (file)
--- a/fs/sync.c
+++ b/fs/sync.c
  */
 static int __sync_filesystem(struct super_block *sb, int wait)
 {
+       /*
+        * This should be safe, as we require bdi backing to actually
+        * write out data in the first place
+        */
+       if (!sb->s_bdi)
+               return 0;
+
        /* Avoid doing twice syncing and cache pruning for quota sync */
        if (!wait) {
                writeout_quota_sb(sb, -1);
@@ -101,7 +108,7 @@ restart:
                spin_unlock(&sb_lock);
 
                down_read(&sb->s_umount);
-               if (!(sb->s_flags & MS_RDONLY) && sb->s_root)
+               if (!(sb->s_flags & MS_RDONLY) && sb->s_root && sb->s_bdi)
                        __sync_filesystem(sb, wait);
                up_read(&sb->s_umount);
 
@@ -176,6 +183,7 @@ int file_fsync(struct file *filp, struct dentry *dentry, int datasync)
                ret = err;
        return ret;
 }
+EXPORT_SYMBOL(file_fsync);
 
 /**
  * vfs_fsync_range - helper to sync a range of data & metadata to disk
@@ -287,10 +295,11 @@ SYSCALL_DEFINE1(fdatasync, unsigned int, fd)
  */
 int generic_write_sync(struct file *file, loff_t pos, loff_t count)
 {
-       if (!(file->f_flags & O_SYNC) && !IS_SYNC(file->f_mapping->host))
+       if (!(file->f_flags & O_DSYNC) && !IS_SYNC(file->f_mapping->host))
                return 0;
        return vfs_fsync_range(file, file->f_path.dentry, pos,
-                              pos + count - 1, 1);
+                              pos + count - 1,
+                              (file->f_flags & __O_SYNC) ? 0 : 1);
 }
 EXPORT_SYMBOL(generic_write_sync);
 
@@ -444,9 +453,7 @@ int do_sync_mapping_range(struct address_space *mapping, loff_t offset,
 
        ret = 0;
        if (flags & SYNC_FILE_RANGE_WAIT_BEFORE) {
-               ret = wait_on_page_writeback_range(mapping,
-                                       offset >> PAGE_CACHE_SHIFT,
-                                       endbyte >> PAGE_CACHE_SHIFT);
+               ret = filemap_fdatawait_range(mapping, offset, endbyte);
                if (ret < 0)
                        goto out;
        }
@@ -459,9 +466,7 @@ int do_sync_mapping_range(struct address_space *mapping, loff_t offset,
        }
 
        if (flags & SYNC_FILE_RANGE_WAIT_AFTER) {
-               ret = wait_on_page_writeback_range(mapping,
-                                       offset >> PAGE_CACHE_SHIFT,
-                                       endbyte >> PAGE_CACHE_SHIFT);
+               ret = filemap_fdatawait_range(mapping, offset, endbyte);
        }
 out:
        return ret;