CIFS: Add SMB2 support for query_file_info
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / fs / cifs / smb2ops.c
index 826209bf36842c904259533a0199fc6f5138a0b9..0fd5801682526eb4ffd6fe3684b92aba33c8804a 100644 (file)
@@ -170,7 +170,7 @@ smb2_is_path_accessible(const unsigned int xid, struct cifs_tcon *tcon,
                return -ENOMEM;
 
        rc = SMB2_open(xid, tcon, utf16_path, &persistent_fid, &volatile_fid,
-                      FILE_READ_ATTRIBUTES, FILE_OPEN, 0, 0);
+                      FILE_READ_ATTRIBUTES, FILE_OPEN, 0, 0, NULL);
        if (rc) {
                kfree(utf16_path);
                return rc;
@@ -190,6 +190,26 @@ smb2_get_srv_inum(const unsigned int xid, struct cifs_tcon *tcon,
        return 0;
 }
 
+static int
+smb2_query_file_info(const unsigned int xid, struct cifs_tcon *tcon,
+                    struct cifs_fid *fid, FILE_ALL_INFO *data)
+{
+       int rc;
+       struct smb2_file_all_info *smb2_data;
+
+       smb2_data = kzalloc(sizeof(struct smb2_file_all_info) + MAX_NAME * 2,
+                           GFP_KERNEL);
+       if (smb2_data == NULL)
+               return -ENOMEM;
+
+       rc = SMB2_query_info(xid, tcon, fid->persistent_fid, fid->volatile_fid,
+                            smb2_data);
+       if (!rc)
+               move_smb2_info_to_cifs(data, smb2_data);
+       kfree(smb2_data);
+       return rc;
+}
+
 static char *
 smb2_build_path_to_root(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
                        struct cifs_tcon *tcon)
@@ -292,6 +312,23 @@ smb2_print_stats(struct seq_file *m, struct cifs_tcon *tcon)
 #endif
 }
 
+static void
+smb2_set_fid(struct cifsFileInfo *cfile, struct cifs_fid *fid, __u32 oplock)
+{
+       /* struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode); */
+       cfile->fid.persistent_fid = fid->persistent_fid;
+       cfile->fid.volatile_fid = fid->volatile_fid;
+       /* cifs_set_oplock_level(cinode, oplock); */
+       /* cinode->can_cache_brlcks = cinode->clientCanCacheAll; */
+}
+
+static int
+smb2_close_file(const unsigned int xid, struct cifs_tcon *tcon,
+               struct cifs_fid *fid)
+{
+       return SMB2_close(xid, tcon, fid->persistent_fid, fid->volatile_fid);
+}
+
 struct smb_version_operations smb21_operations = {
        .setup_request = smb2_setup_request,
        .setup_async_request = smb2_setup_async_request,
@@ -317,10 +354,15 @@ struct smb_version_operations smb21_operations = {
        .echo = SMB2_echo,
        .query_path_info = smb2_query_path_info,
        .get_srv_inum = smb2_get_srv_inum,
+       .query_file_info = smb2_query_file_info,
        .build_path_to_root = smb2_build_path_to_root,
        .mkdir = smb2_mkdir,
        .mkdir_setinfo = smb2_mkdir_setinfo,
        .rmdir = smb2_rmdir,
+       .unlink = smb2_unlink,
+       .open = smb2_open_file,
+       .set_fid = smb2_set_fid,
+       .close = smb2_close_file,
 };
 
 struct smb_version_values smb21_values = {