Whamcloud - gitweb
LU-1030 osc: new IO engine implementation
[fs/lustre-release.git] / lustre / llite / file.c
index 109d3b9..cc6214c 100644 (file)
@@ -809,8 +809,10 @@ void ll_io_init(struct cl_io *io, const struct file *file, int write)
         struct inode *inode = file->f_dentry->d_inode;
 
         io->u.ci_rw.crw_nonblock = file->f_flags & O_NONBLOCK;
-        if (write)
-                io->u.ci_wr.wr_append = !!(file->f_flags & O_APPEND);
+       if (write) {
+               io->u.ci_wr.wr_append = !!(file->f_flags & O_APPEND);
+               io->u.ci_wr.wr_sync = file->f_flags & O_SYNC || IS_SYNC(inode);
+       }
         io->ci_obj     = ll_i2info(inode)->lli_clob;
         io->ci_lockreq = CILR_MAYBE;
         if (ll_file_nolock(file)) {
@@ -1985,8 +1987,11 @@ int ll_flush(struct file *file)
 /**
  * Called to make sure a portion of file has been written out.
  * if @local_only is not true, it will send OST_SYNC RPCs to ost.
+ *
+ * Return how many pages have been written.
  */
-int cl_sync_file_range(struct inode *inode, loff_t start, loff_t end)
+int cl_sync_file_range(struct inode *inode, loff_t start, loff_t end,
+                      enum cl_fsync_mode mode)
 {
        struct cl_env_nest nest;
        struct lu_env *env;
@@ -1996,6 +2001,10 @@ int cl_sync_file_range(struct inode *inode, loff_t start, loff_t end)
        int result;
        ENTRY;
 
+       if (mode != CL_FSYNC_NONE && mode != CL_FSYNC_LOCAL &&
+           mode != CL_FSYNC_DISCARD && mode != CL_FSYNC_ALL)
+               RETURN(-EINVAL);
+
        env = cl_env_nested_get(&nest);
        if (IS_ERR(env))
                RETURN(PTR_ERR(env));
@@ -2011,11 +2020,15 @@ int cl_sync_file_range(struct inode *inode, loff_t start, loff_t end)
        fio->fi_start = start;
        fio->fi_end = end;
        fio->fi_fid = ll_inode2fid(inode);
+       fio->fi_mode = mode;
+       fio->fi_nr_written = 0;
 
        if (cl_io_init(env, io, CIT_FSYNC, io->ci_obj) == 0)
                result = cl_io_loop(env, io);
        else
                result = io->ci_result;
+       if (result == 0)
+               result = fio->fi_nr_written;
        cl_io_fini(env, io);
        cl_env_nested_put(&nest, env);
 
@@ -2071,8 +2084,9 @@ int ll_fsync(struct file *file, struct dentry *dentry, int data)
                 ptlrpc_req_finished(req);
 
         if (data && lsm) {
-               err = cl_sync_file_range(inode, 0, OBD_OBJECT_EOF);
-                if (!rc)
+               err = cl_sync_file_range(inode, 0, OBD_OBJECT_EOF,
+                                        CL_FSYNC_ALL);
+               if (rc == 0 && err < 0)
                         rc = err;
                 lli->lli_write_rc = rc < 0 ? rc : 0;
         }