Loading fs/cifs/Makefile +1 −1 Original line number Diff line number Diff line Loading @@ -17,4 +17,4 @@ cifs-$(CONFIG_CIFS_DFS_UPCALL) += dns_resolve.o cifs_dfs_ref.o cifs-$(CONFIG_CIFS_FSCACHE) += fscache.o cache.o cifs-$(CONFIG_CIFS_SMB2) += smb2ops.o smb2maperror.o smb2transport.o \ smb2misc.o smb2pdu.o smb2inode.o smb2misc.o smb2pdu.o smb2inode.o smb2file.o fs/cifs/cifsglob.h +4 −0 Original line number Diff line number Diff line Loading @@ -757,6 +757,10 @@ struct cifs_search_info { struct cifs_fid { __u16 netfid; #ifdef CONFIG_CIFS_SMB2 __u64 persistent_fid; /* persist file id for smb2 */ __u64 volatile_fid; /* volatile file id for smb2 */ #endif }; struct cifsFileInfo { Loading fs/cifs/smb2file.c 0 → 100644 +86 −0 Original line number Diff line number Diff line /* * fs/cifs/smb2file.c * * Copyright (C) International Business Machines Corp., 2002, 2011 * Author(s): Steve French (sfrench@us.ibm.com), * Pavel Shilovsky ((pshilovsky@samba.org) 2012 * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See * the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include <linux/fs.h> #include <linux/stat.h> #include <linux/slab.h> #include <linux/pagemap.h> #include <asm/div64.h> #include "cifsfs.h" #include "cifspdu.h" #include "cifsglob.h" #include "cifsproto.h" #include "cifs_debug.h" #include "cifs_fs_sb.h" #include "cifs_unicode.h" #include "fscache.h" #include "smb2proto.h" int smb2_open_file(const unsigned int xid, struct cifs_tcon *tcon, const char *path, int disposition, int desired_access, int create_options, struct cifs_fid *fid, __u32 *oplock, FILE_ALL_INFO *buf, struct cifs_sb_info *cifs_sb) { int rc; __le16 *smb2_path; struct smb2_file_all_info *smb2_data = NULL; smb2_path = cifs_convert_path_to_utf16(path, cifs_sb); if (smb2_path == NULL) { rc = -ENOMEM; goto out; } smb2_data = kzalloc(sizeof(struct smb2_file_all_info) + MAX_NAME * 2, GFP_KERNEL); if (smb2_data == NULL) { rc = -ENOMEM; goto out; } desired_access |= FILE_READ_ATTRIBUTES; rc = SMB2_open(xid, tcon, smb2_path, &fid->persistent_fid, &fid->volatile_fid, desired_access, disposition, 0, 0, smb2_data); if (rc) goto out; if (buf) { /* open response does not have IndexNumber field - get it */ rc = SMB2_get_srv_num(xid, tcon, fid->persistent_fid, fid->volatile_fid, &smb2_data->IndexNumber); if (rc) { /* let get_inode_info disable server inode numbers */ smb2_data->IndexNumber = 0; rc = 0; } move_smb2_info_to_cifs(buf, smb2_data); } out: *oplock = 0; kfree(smb2_data); kfree(smb2_path); return rc; } fs/cifs/smb2inode.c +2 −2 Original line number Diff line number Diff line Loading @@ -54,7 +54,7 @@ smb2_open_op_close(const unsigned int xid, struct cifs_tcon *tcon, rc = SMB2_open(xid, tcon, utf16_path, &persistent_fid, &volatile_fid, desired_access, create_disposition, file_attributes, create_options); create_options, NULL); if (rc) { kfree(utf16_path); return rc; Loading Loading @@ -86,7 +86,7 @@ smb2_open_op_close(const unsigned int xid, struct cifs_tcon *tcon, return rc; } static void void move_smb2_info_to_cifs(FILE_ALL_INFO *dst, struct smb2_file_all_info *src) { memcpy(dst, src, (size_t)(&src->CurrentByteOffset) - (size_t)src); Loading fs/cifs/smb2ops.c +21 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -292,6 +292,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, Loading Loading @@ -322,6 +339,9 @@ struct smb_version_operations smb21_operations = { .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 = { Loading Loading
fs/cifs/Makefile +1 −1 Original line number Diff line number Diff line Loading @@ -17,4 +17,4 @@ cifs-$(CONFIG_CIFS_DFS_UPCALL) += dns_resolve.o cifs_dfs_ref.o cifs-$(CONFIG_CIFS_FSCACHE) += fscache.o cache.o cifs-$(CONFIG_CIFS_SMB2) += smb2ops.o smb2maperror.o smb2transport.o \ smb2misc.o smb2pdu.o smb2inode.o smb2misc.o smb2pdu.o smb2inode.o smb2file.o
fs/cifs/cifsglob.h +4 −0 Original line number Diff line number Diff line Loading @@ -757,6 +757,10 @@ struct cifs_search_info { struct cifs_fid { __u16 netfid; #ifdef CONFIG_CIFS_SMB2 __u64 persistent_fid; /* persist file id for smb2 */ __u64 volatile_fid; /* volatile file id for smb2 */ #endif }; struct cifsFileInfo { Loading
fs/cifs/smb2file.c 0 → 100644 +86 −0 Original line number Diff line number Diff line /* * fs/cifs/smb2file.c * * Copyright (C) International Business Machines Corp., 2002, 2011 * Author(s): Steve French (sfrench@us.ibm.com), * Pavel Shilovsky ((pshilovsky@samba.org) 2012 * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See * the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include <linux/fs.h> #include <linux/stat.h> #include <linux/slab.h> #include <linux/pagemap.h> #include <asm/div64.h> #include "cifsfs.h" #include "cifspdu.h" #include "cifsglob.h" #include "cifsproto.h" #include "cifs_debug.h" #include "cifs_fs_sb.h" #include "cifs_unicode.h" #include "fscache.h" #include "smb2proto.h" int smb2_open_file(const unsigned int xid, struct cifs_tcon *tcon, const char *path, int disposition, int desired_access, int create_options, struct cifs_fid *fid, __u32 *oplock, FILE_ALL_INFO *buf, struct cifs_sb_info *cifs_sb) { int rc; __le16 *smb2_path; struct smb2_file_all_info *smb2_data = NULL; smb2_path = cifs_convert_path_to_utf16(path, cifs_sb); if (smb2_path == NULL) { rc = -ENOMEM; goto out; } smb2_data = kzalloc(sizeof(struct smb2_file_all_info) + MAX_NAME * 2, GFP_KERNEL); if (smb2_data == NULL) { rc = -ENOMEM; goto out; } desired_access |= FILE_READ_ATTRIBUTES; rc = SMB2_open(xid, tcon, smb2_path, &fid->persistent_fid, &fid->volatile_fid, desired_access, disposition, 0, 0, smb2_data); if (rc) goto out; if (buf) { /* open response does not have IndexNumber field - get it */ rc = SMB2_get_srv_num(xid, tcon, fid->persistent_fid, fid->volatile_fid, &smb2_data->IndexNumber); if (rc) { /* let get_inode_info disable server inode numbers */ smb2_data->IndexNumber = 0; rc = 0; } move_smb2_info_to_cifs(buf, smb2_data); } out: *oplock = 0; kfree(smb2_data); kfree(smb2_path); return rc; }
fs/cifs/smb2inode.c +2 −2 Original line number Diff line number Diff line Loading @@ -54,7 +54,7 @@ smb2_open_op_close(const unsigned int xid, struct cifs_tcon *tcon, rc = SMB2_open(xid, tcon, utf16_path, &persistent_fid, &volatile_fid, desired_access, create_disposition, file_attributes, create_options); create_options, NULL); if (rc) { kfree(utf16_path); return rc; Loading Loading @@ -86,7 +86,7 @@ smb2_open_op_close(const unsigned int xid, struct cifs_tcon *tcon, return rc; } static void void move_smb2_info_to_cifs(FILE_ALL_INFO *dst, struct smb2_file_all_info *src) { memcpy(dst, src, (size_t)(&src->CurrentByteOffset) - (size_t)src); Loading
fs/cifs/smb2ops.c +21 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -292,6 +292,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, Loading Loading @@ -322,6 +339,9 @@ struct smb_version_operations smb21_operations = { .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 = { Loading