static int smb2_open_op_close(const unsigned int xid, struct cifs_tcon *tcon, struct cifs_sb_info *cifs_sb, const char *full_path, __u32 desired_access, __u32 create_disposition, __u32 file_attributes, __u32 create_options, void *data, int command) { int rc, tmprc = 0; u64 persistent_fid, volatile_fid; __le16 *utf16_path; utf16_path = cifs_convert_path_to_utf16(full_path, cifs_sb); if (!utf16_path) return -ENOMEM; rc = SMB2_open(xid, tcon, utf16_path, &persistent_fid, &volatile_fid, desired_access, create_disposition, file_attributes, create_options); if (rc) { kfree(utf16_path); return rc; } switch (command) { case SMB2_OP_DELETE: break; case SMB2_OP_QUERY_INFO: tmprc = SMB2_query_info(xid, tcon, persistent_fid, volatile_fid, (struct smb2_file_all_info *)data); break; case SMB2_OP_MKDIR: /* * Directories are created through parameters in the * SMB2_open() call. */ break; default: cERROR(1, "Invalid command"); break; } rc = SMB2_close(xid, tcon, persistent_fid, volatile_fid); if (tmprc) rc = tmprc; kfree(utf16_path); return rc; }
static int smb2_open_op_close(const unsigned int xid, struct cifs_tcon *tcon, struct cifs_sb_info *cifs_sb, const char *full_path, __u32 desired_access, __u32 create_disposition, __u32 create_options, void *data, int command) { int rc, tmprc = 0; __le16 *utf16_path; __u8 oplock = SMB2_OPLOCK_LEVEL_NONE; struct cifs_open_parms oparms; struct cifs_fid fid; utf16_path = cifs_convert_path_to_utf16(full_path, cifs_sb); if (!utf16_path) return -ENOMEM; oparms.tcon = tcon; oparms.desired_access = desired_access; oparms.share_access = FILE_SHARE_ALL; oparms.disposition = create_disposition; oparms.create_options = create_options; oparms.fid = &fid; oparms.reconnect = false; rc = SMB2_open(xid, &oparms, utf16_path, &oplock, NULL, NULL); if (rc) { kfree(utf16_path); return rc; } switch (command) { case SMB2_OP_DELETE: break; case SMB2_OP_QUERY_INFO: tmprc = SMB2_query_info(xid, tcon, fid.persistent_fid, fid.volatile_fid, (struct smb2_file_all_info *)data); break; case SMB2_OP_MKDIR: /* * Directories are created through parameters in the * SMB2_open() call. */ break; case SMB2_OP_RENAME: tmprc = SMB2_rename(xid, tcon, fid.persistent_fid, fid.volatile_fid, (__le16 *)data); break; case SMB2_OP_HARDLINK: tmprc = SMB2_set_hardlink(xid, tcon, fid.persistent_fid, fid.volatile_fid, (__le16 *)data); break; case SMB2_OP_SET_EOF: tmprc = SMB2_set_eof(xid, tcon, fid.persistent_fid, fid.volatile_fid, current->tgid, (__le64 *)data, false); break; case SMB2_OP_SET_INFO: tmprc = SMB2_set_info(xid, tcon, fid.persistent_fid, fid.volatile_fid, (FILE_BASIC_INFO *)data); break; default: cifs_dbg(VFS, "Invalid command\n"); break; } rc = SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); if (tmprc) rc = tmprc; kfree(utf16_path); return rc; }