From: Pavel Shilovsky <[email protected]>

Signed-off-by: Pavel Shilovsky <[email protected]>
---
 fs/cifs/cifsglob.h  |    1 +
 fs/cifs/cifsproto.h |    5 +++++
 fs/cifs/file.c      |   34 +++++++++++++++++++++++++---------
 fs/cifs/smb2file.c  |   30 ++++++++++++++++++++++++------
 fs/cifs/smb2proto.h |    6 ++++--
 5 files changed, 59 insertions(+), 17 deletions(-)

diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
index d878378..b71c3fc 100644
--- a/fs/cifs/cifsglob.h
+++ b/fs/cifs/cifsglob.h
@@ -656,6 +656,7 @@ typedef int (iread_callback_t)(int, struct cifsFileInfo *,
 typedef int (read_callback_t)(int, struct cifsFileInfo *,
                              struct cifs_io_parms *, unsigned int *, char **,
                              int *, unsigned int);
+typedef int (fsync_callback_t)(int, struct cifsFileInfo *);
 
 /*
  * Take a reference on the file private data. Must be called with
diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
index 4285c10..c8b1d50 100644
--- a/fs/cifs/cifsproto.h
+++ b/fs/cifs/cifsproto.h
@@ -220,6 +220,11 @@ extern int is_dir_changed(struct file *file);
 extern struct dentry *cifs_readdir_lookup(struct dentry *parent,
                                          struct qstr *name,
                                          struct cifs_fattr *fattr);
+extern int cifs_strict_fsync_generic(struct file *file, loff_t start,
+                                    loff_t end, int datasync,
+                                    fsync_callback_t *fsync_cb);
+extern int cifs_fsync_generic(struct file *file, loff_t start, loff_t end,
+                             int datasync, fsync_callback_t *fsync_cb);
 void cifs_proc_init(void);
 void cifs_proc_clean(void);
 
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index 22cf18b..2c9471c 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -2044,12 +2044,17 @@ int cifs_write_end(struct file *file, struct 
address_space *mapping, loff_t pos,
        return rc;
 }
 
-int cifs_strict_fsync(struct file *file, loff_t start, loff_t end,
-                     int datasync)
+static int
+cifs_fsync_cb(int xid, struct cifsFileInfo *cfile)
+{
+       return CIFSSMBFlush(xid, tlink_tcon(cfile->tlink), cfile->netfid);
+}
+
+int cifs_strict_fsync_generic(struct file *file, loff_t start, loff_t end,
+                             int datasync, fsync_callback_t *fsync_cb)
 {
        int xid;
        int rc = 0;
-       struct cifs_tcon *tcon;
        struct cifsFileInfo *smbfile = file->private_data;
        struct inode *inode = file->f_path.dentry->d_inode;
        struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
@@ -2072,20 +2077,26 @@ int cifs_strict_fsync(struct file *file, loff_t start, 
loff_t end,
                }
        }
 
-       tcon = tlink_tcon(smbfile->tlink);
        if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC))
-               rc = CIFSSMBFlush(xid, tcon, smbfile->netfid);
+               rc = fsync_cb(xid, smbfile);
 
        FreeXid(xid);
        mutex_unlock(&inode->i_mutex);
        return rc;
 }
 
-int cifs_fsync(struct file *file, loff_t start, loff_t end, int datasync)
+int
+cifs_strict_fsync(struct file *file, loff_t start, loff_t end, int datasync)
+{
+       return cifs_strict_fsync_generic(file, datasync, start, end,
+                                        cifs_fsync_cb);
+}
+
+int cifs_fsync_generic(struct file *file, loff_t start, loff_t end,
+                      int datasync, fsync_callback_t *fsync_cb)
 {
        int xid;
        int rc = 0;
-       struct cifs_tcon *tcon;
        struct cifsFileInfo *smbfile = file->private_data;
        struct cifs_sb_info *cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
        struct inode *inode = file->f_mapping->host;
@@ -2100,15 +2111,20 @@ int cifs_fsync(struct file *file, loff_t start, loff_t 
end, int datasync)
        cFYI(1, "Sync file - name: %s datasync: 0x%x",
                file->f_path.dentry->d_name.name, datasync);
 
-       tcon = tlink_tcon(smbfile->tlink);
        if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC))
-               rc = CIFSSMBFlush(xid, tcon, smbfile->netfid);
+               rc = fsync_cb(xid, smbfile);
 
        FreeXid(xid);
        mutex_unlock(&inode->i_mutex);
        return rc;
 }
 
+int
+cifs_fsync(struct file *file, loff_t start, loff_t end, int datasync)
+{
+       return cifs_fsync_generic(file, start, end, datasync, cifs_fsync_cb);
+}
+
 /*
  * As file closes, flush all cached write data for this inode checking
  * for write behind errors.
diff --git a/fs/cifs/smb2file.c b/fs/cifs/smb2file.c
index 48e2a36..ae4ea13 100644
--- a/fs/cifs/smb2file.c
+++ b/fs/cifs/smb2file.c
@@ -43,7 +43,7 @@ const struct file_operations smb2_file_ops = {
        .open = smb2_open,
        .release = cifs_close,
        .lock = cifs_lock,
-       .fsync = cifs_fsync,
+       .fsync = smb2_fsync,
        .flush = cifs_flush,
        .mmap  = cifs_file_mmap,
        .splice_read = generic_file_splice_read,
@@ -62,7 +62,7 @@ const struct file_operations smb2_file_strict_ops = {
        .open = smb2_open,
        .release = cifs_close,
        .lock = cifs_lock,
-       .fsync = cifs_strict_fsync,
+       .fsync = smb2_strict_fsync,
        .flush = cifs_flush,
        .mmap = cifs_file_strict_mmap,
        .splice_read = generic_file_splice_read,
@@ -82,7 +82,7 @@ const struct file_operations smb2_file_direct_ops = {
        .open = smb2_open,
        .release = cifs_close,
        .lock = cifs_lock,
-       .fsync = cifs_fsync,
+       .fsync = smb2_fsync,
        .flush = cifs_flush,
        .mmap = cifs_file_mmap,
        .splice_read = generic_file_splice_read,
@@ -100,7 +100,7 @@ const struct file_operations smb2_file_nobrl_ops = {
        .aio_write = cifs_file_aio_write,
        .open = smb2_open,
        .release = cifs_close,
-       .fsync = cifs_fsync,
+       .fsync = smb2_fsync,
        .flush = cifs_flush,
        .mmap  = cifs_file_mmap,
        .splice_read = generic_file_splice_read,
@@ -118,7 +118,7 @@ const struct file_operations smb2_file_strict_nobrl_ops = {
        .aio_write = cifs_strict_writev,
        .open = smb2_open,
        .release = cifs_close,
-       .fsync = cifs_strict_fsync,
+       .fsync = smb2_strict_fsync,
        .flush = cifs_flush,
        .mmap = cifs_file_strict_mmap,
        .splice_read = generic_file_splice_read,
@@ -137,7 +137,7 @@ const struct file_operations smb2_file_direct_nobrl_ops = {
        .aio_write = smb2_user_writev,
        .open = smb2_open,
        .release = cifs_close,
-       .fsync = cifs_fsync,
+       .fsync = smb2_fsync,
        .flush = cifs_flush,
        .mmap = cifs_file_mmap,
        .splice_read = generic_file_splice_read,
@@ -473,3 +473,21 @@ smb2_readpages(struct file *file, struct address_space 
*mapping,
        return cifs_readpages_generic(file, mapping, page_list, num_pages,
                                      smb2_async_readv);
 }
+
+static int
+smb2_fsync_cb(int xid, struct cifsFileInfo *cfile)
+{
+       return SMB2_flush(xid, tlink_tcon(cfile->tlink), cfile->persist_fid,
+                         cfile->volatile_fid);
+}
+
+int smb2_fsync(struct file *file, loff_t start, loff_t end, int datasync)
+{
+       return cifs_fsync_generic(file, start, end, datasync, smb2_fsync_cb);
+}
+
+int smb2_strict_fsync(struct file *file, loff_t start, loff_t end, int 
datasync)
+{
+       return cifs_strict_fsync_generic(file, start, end, datasync,
+                                        smb2_fsync_cb);
+}
diff --git a/fs/cifs/smb2proto.h b/fs/cifs/smb2proto.h
index 4e7337c..ea44077 100644
--- a/fs/cifs/smb2proto.h
+++ b/fs/cifs/smb2proto.h
@@ -124,8 +124,6 @@ extern void smb2_allinfo_to_fattr(struct cifs_fattr *attr,
 extern void smb2_create_dfs_attr(struct cifs_fattr *fattr,
                                 struct super_block *sb);
 extern void cifs_fattr_to_inode(struct inode *pinode, struct cifs_fattr *attr);
-extern int smb2_fsync(struct file *file, int datasync);
-extern int smb2_flush(struct file *file, fl_owner_t id);
 extern struct cifsFileInfo *smb2_new_fileinfo(__u64 persist_fid,
                                              __u64 volatile_fid,
                                              struct file *file,
@@ -142,6 +140,10 @@ extern int smb2_write_cb(int xid, struct cifsFileInfo 
*cfile,
                         struct cifs_io_parms *parms, unsigned int *written,
                         struct kvec *iov, unsigned long nr_segs,
                         unsigned int remaining_bytes, int timeout);
+extern int smb2_strict_fsync(struct file *file, loff_t start, loff_t end,
+                            int datasync);
+extern int smb2_fsync(struct file *file, loff_t start, loff_t end,
+                     int datasync);
 
 extern int smb2_open(struct inode *inode, struct file *file);
 extern ssize_t smb2_user_readv(struct kiocb *iocb, const struct iovec *iov,
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to