Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
af337a9c
Commit
af337a9c
authored
Aug 13, 2003
by
Steve French
Committed by
Steve French
Aug 13, 2003
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix rename open file to better match standard unix semantics
parent
707c5db2
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
116 additions
and
25 deletions
+116
-25
fs/cifs/cifspdu.h
fs/cifs/cifspdu.h
+29
-21
fs/cifs/cifsproto.h
fs/cifs/cifsproto.h
+2
-0
fs/cifs/cifssmb.c
fs/cifs/cifssmb.c
+68
-2
fs/cifs/inode.c
fs/cifs/inode.c
+17
-2
No files found.
fs/cifs/cifspdu.h
View file @
af337a9c
...
@@ -936,35 +936,36 @@ typedef union smb_com_transaction2 {
...
@@ -936,35 +936,36 @@ typedef union smb_com_transaction2 {
}
TRANSACTION2
;
}
TRANSACTION2
;
/* PathInfo/FileInfo infolevels */
/* PathInfo/FileInfo infolevels */
#define SMB_INFO_STANDARD 1
#define SMB_INFO_STANDARD
1
#define SMB_INFO_IS_NAME_VALID 6
#define SMB_INFO_IS_NAME_VALID
6
#define SMB_QUERY_FILE_BASIC_INFO 0x101
#define SMB_QUERY_FILE_BASIC_INFO
0x101
#define SMB_QUERY_FILE_STANDARD_INFO 0x102
#define SMB_QUERY_FILE_STANDARD_INFO
0x102
#define SMB_QUERY_FILE_NAME_INFO 0x104
#define SMB_QUERY_FILE_NAME_INFO
0x104
#define SMB_QUERY_FILE_ALLOCATION_INFO
0x105
#define SMB_QUERY_FILE_ALLOCATION_INFO
0x105
#define SMB_QUERY_FILE_END_OF_FILEINFO
0x106
#define SMB_QUERY_FILE_END_OF_FILEINFO
0x106
#define SMB_QUERY_FILE_ALL_INFO 0x107
#define SMB_QUERY_FILE_ALL_INFO
0x107
#define SMB_QUERY_ALT_NAME_INFO 0x108
#define SMB_QUERY_ALT_NAME_INFO
0x108
#define SMB_QUERY_FILE_STREAM_INFO 0x109
#define SMB_QUERY_FILE_STREAM_INFO
0x109
#define SMB_QUERY_FILE_COMPRESSION_INFO 0x10B
#define SMB_QUERY_FILE_COMPRESSION_INFO 0x10B
#define SMB_QUERY_FILE_UNIX_BASIC 0x200
#define SMB_QUERY_FILE_UNIX_BASIC
0x200
#define SMB_QUERY_FILE_UNIX_LINK 0x201
#define SMB_QUERY_FILE_UNIX_LINK
0x201
#define SMB_SET_FILE_BASIC_INFO
0x101
#define SMB_SET_FILE_BASIC_INFO
0x101
#define SMB_SET_FILE_DISPOSITION_INFO
0x102
#define SMB_SET_FILE_DISPOSITION_INFO
0x102
#define SMB_SET_FILE_ALLOCATION_INFO
0x103
#define SMB_SET_FILE_ALLOCATION_INFO
0x103
#define SMB_SET_FILE_END_OF_FILE_INFO
0x104
#define SMB_SET_FILE_END_OF_FILE_INFO
0x104
#define SMB_SET_FILE_UNIX_BASIC 0x200
#define SMB_SET_FILE_UNIX_BASIC 0x200
#define SMB_SET_FILE_UNIX_LINK 0x201
#define SMB_SET_FILE_UNIX_LINK 0x201
#define SMB_SET_FILE_UNIX_HLINK 0x203
#define SMB_SET_FILE_UNIX_HLINK 0x203
#define SMB_SET_FILE_BASIC_INFO2 0x3ec
#define SMB_SET_FILE_BASIC_INFO2 0x3ec
#define SMB_SET_FILE_ALLOCATION_INFO2 0x3fb
#define SMB_SET_FILE_RENAME_INFORMATION 0x3f2
#define SMB_SET_FILE_END_OF_FILE_INFO2 0x3fc
#define SMB_SET_FILE_ALLOCATION_INFO2 0x3fb
#define SMB_SET_FILE_END_OF_FILE_INFO2 0x3fc
/* Find File infolevels */
/* Find File infolevels */
#define SMB_FIND_FILE_DIRECTORY_INFO
0x101
#define SMB_FIND_FILE_DIRECTORY_INFO
0x101
#define SMB_FIND_FILE_FULL_DIRECTORY_INFO 0x102
#define SMB_FIND_FILE_FULL_DIRECTORY_INFO 0x102
#define SMB_FIND_FILE_NAMES_INFO
0x103
#define SMB_FIND_FILE_NAMES_INFO
0x103
#define SMB_FIND_FILE_BOTH_DIRECTORY_INFO 0x104
#define SMB_FIND_FILE_BOTH_DIRECTORY_INFO 0x104
#define SMB_FIND_FILE_UNIX 0x202
#define SMB_FIND_FILE_UNIX 0x202
...
@@ -1053,6 +1054,13 @@ typedef struct smb_com_transaction2_spi_rsp {
...
@@ -1053,6 +1054,13 @@ typedef struct smb_com_transaction2_spi_rsp {
__u16
Reserved2
;
/* parameter word reserved - present for infolevels > 100 */
__u16
Reserved2
;
/* parameter word reserved - present for infolevels > 100 */
}
TRANSACTION2_SPI_RSP
;
}
TRANSACTION2_SPI_RSP
;
struct
set_file_rename
{
__u32
overwrite
;
/* 1 = overwrite dest */
__u32
root_fid
;
/* zero */
__u32
target_name_len
;
char
target_name
[
0
];
/* Must be unicode */
};
struct
smb_com_transaction2_sfi_req
{
struct
smb_com_transaction2_sfi_req
{
struct
smb_hdr
hdr
;
/* wct = 15 */
struct
smb_hdr
hdr
;
/* wct = 15 */
__u16
TotalParameterCount
;
__u16
TotalParameterCount
;
...
@@ -1074,7 +1082,7 @@ struct smb_com_transaction2_sfi_req {
...
@@ -1074,7 +1082,7 @@ struct smb_com_transaction2_sfi_req {
__u16
ByteCount
;
__u16
ByteCount
;
__u8
Pad
;
__u8
Pad
;
__u16
Pad1
;
__u16
Pad1
;
__u16
Fid
;
__u16
Fid
;
__u16
InformationLevel
;
__u16
InformationLevel
;
__u16
Reserved4
;
__u16
Reserved4
;
};
};
...
...
fs/cifs/cifsproto.h
View file @
af337a9c
...
@@ -170,6 +170,8 @@ extern int CIFSSMBDelFile(const int xid, struct cifsTconInfo *tcon,
...
@@ -170,6 +170,8 @@ extern int CIFSSMBDelFile(const int xid, struct cifsTconInfo *tcon,
extern
int
CIFSSMBRename
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
extern
int
CIFSSMBRename
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
char
*
fromName
,
const
char
*
toName
,
const
char
*
fromName
,
const
char
*
toName
,
const
struct
nls_table
*
nls_codepage
);
const
struct
nls_table
*
nls_codepage
);
extern
int
CIFSSMBDummyRenameOpenFile
(
const
int
xid
,
struct
cifsTconInfo
*
pTcon
,
int
netfid
,
const
struct
nls_table
*
nls_codepage
);
extern
int
CIFSCreateHardLink
(
const
int
xid
,
extern
int
CIFSCreateHardLink
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
struct
cifsTconInfo
*
tcon
,
const
char
*
fromName
,
const
char
*
toName
,
const
char
*
fromName
,
const
char
*
toName
,
...
...
fs/cifs/cifssmb.c
View file @
af337a9c
...
@@ -762,6 +762,72 @@ CIFSSMBRename(const int xid, struct cifsTconInfo *tcon,
...
@@ -762,6 +762,72 @@ CIFSSMBRename(const int xid, struct cifsTconInfo *tcon,
return
rc
;
return
rc
;
}
}
int
CIFSSMBDummyRenameOpenFile
(
const
int
xid
,
struct
cifsTconInfo
*
pTcon
,
int
netfid
,
const
struct
nls_table
*
nls_codepage
)
{
struct
smb_com_transaction2_sfi_req
*
pSMB
=
NULL
;
struct
smb_com_transaction2_sfi_rsp
*
pSMBr
=
NULL
;
struct
set_file_rename
*
rename_info
;
char
*
data_offset
;
int
rc
=
0
;
int
bytes_returned
=
0
;
int
len_of_str
;
cFYI
(
1
,
(
"Rename to Dummy Random File Name"
));
rc
=
smb_init
(
SMB_COM_TRANSACTION2
,
15
,
pTcon
,
(
void
**
)
&
pSMB
,
(
void
**
)
&
pSMBr
);
if
(
rc
)
return
rc
;
pSMB
->
ParameterCount
=
6
;
pSMB
->
MaxSetupCount
=
0
;
pSMB
->
Reserved
=
0
;
pSMB
->
Flags
=
0
;
pSMB
->
Timeout
=
0
;
pSMB
->
Reserved2
=
0
;
pSMB
->
ParameterOffset
=
offsetof
(
struct
smb_com_transaction2_sfi_req
,
Fid
)
-
4
;
pSMB
->
DataOffset
=
pSMB
->
ParameterOffset
+
pSMB
->
ParameterCount
;
data_offset
=
(
char
*
)
(
&
pSMB
->
hdr
.
Protocol
)
+
pSMB
->
DataOffset
;
rename_info
=
(
struct
set_file_rename
*
)
data_offset
;
pSMB
->
MaxParameterCount
=
cpu_to_le16
(
2
);
pSMB
->
MaxDataCount
=
cpu_to_le16
(
1000
);
/* BB find max SMB PDU from sess */
pSMB
->
SetupCount
=
1
;
pSMB
->
Reserved3
=
0
;
pSMB
->
SubCommand
=
cpu_to_le16
(
TRANS2_SET_FILE_INFORMATION
);
pSMB
->
ByteCount
=
3
/* pad */
+
pSMB
->
ParameterCount
;
pSMB
->
ParameterCount
=
cpu_to_le16
(
pSMB
->
ParameterCount
);
pSMB
->
TotalParameterCount
=
pSMB
->
ParameterCount
;
pSMB
->
ParameterOffset
=
cpu_to_le16
(
pSMB
->
ParameterOffset
);
pSMB
->
DataOffset
=
cpu_to_le16
(
pSMB
->
DataOffset
);
/* construct random name ".cifs_tmp<inodenum><mid>" */
rename_info
->
overwrite
=
cpu_to_le32
(
1
);
rename_info
->
root_fid
=
0
;
len_of_str
=
cifs_strtoUCS
((
wchar_t
*
)
rename_info
->
target_name
,
".cifs"
,
12
,
nls_codepage
);
pSMB
->
DataCount
=
12
/* sizeof(struct set_file_rename) */
+
(
2
*
len_of_str
);
pSMB
->
ByteCount
+=
pSMB
->
DataCount
;
pSMB
->
DataCount
=
cpu_to_le16
(
pSMB
->
DataCount
);
pSMB
->
Fid
=
netfid
;
/* should we check the passthrough bit ? */
pSMB
->
InformationLevel
=
cpu_to_le16
(
SMB_SET_FILE_RENAME_INFORMATION
);
pSMB
->
Reserved4
=
0
;
pSMB
->
hdr
.
smb_buf_length
+=
pSMB
->
ByteCount
;
pSMB
->
ByteCount
=
cpu_to_le16
(
pSMB
->
ByteCount
);
rc
=
SendReceive
(
xid
,
pTcon
->
ses
,
(
struct
smb_hdr
*
)
pSMB
,
(
struct
smb_hdr
*
)
pSMBr
,
&
bytes_returned
,
0
);
if
(
rc
)
{
cFYI
(
1
,(
"Send error in DummyRename = %d"
,
rc
));
}
if
(
pSMB
)
buf_release
(
pSMB
);
return
rc
;
}
int
int
CIFSUnixCreateSymLink
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
CIFSUnixCreateSymLink
(
const
int
xid
,
struct
cifsTconInfo
*
tcon
,
const
char
*
fromName
,
const
char
*
toName
,
const
char
*
fromName
,
const
char
*
toName
,
...
@@ -1979,7 +2045,7 @@ CIFSSMBQFSDeviceInfo(int xid, struct cifsTconInfo *tcon,
...
@@ -1979,7 +2045,7 @@ CIFSSMBQFSDeviceInfo(int xid, struct cifsTconInfo *tcon,
rc
=
SendReceive
(
xid
,
tcon
->
ses
,
(
struct
smb_hdr
*
)
pSMB
,
rc
=
SendReceive
(
xid
,
tcon
->
ses
,
(
struct
smb_hdr
*
)
pSMB
,
(
struct
smb_hdr
*
)
pSMBr
,
&
bytes_returned
,
0
);
(
struct
smb_hdr
*
)
pSMBr
,
&
bytes_returned
,
0
);
if
(
rc
)
{
if
(
rc
)
{
c
ERROR
(
1
,
(
"Send error in QFSDeviceInfo = %d"
,
rc
));
c
FYI
(
1
,
(
"Send error in QFSDeviceInfo = %d"
,
rc
));
}
else
{
/* decode response */
}
else
{
/* decode response */
pSMBr
->
DataOffset
=
le16_to_cpu
(
pSMBr
->
DataOffset
);
pSMBr
->
DataOffset
=
le16_to_cpu
(
pSMBr
->
DataOffset
);
if
((
pSMBr
->
ByteCount
<
sizeof
(
FILE_SYSTEM_DEVICE_INFO
))
if
((
pSMBr
->
ByteCount
<
sizeof
(
FILE_SYSTEM_DEVICE_INFO
))
...
@@ -2202,10 +2268,10 @@ CIFSSMBSetFileSize(const int xid, struct cifsTconInfo *tcon, __u64 size,
...
@@ -2202,10 +2268,10 @@ CIFSSMBSetFileSize(const int xid, struct cifsTconInfo *tcon, __u64 size,
pSMB
->
TotalDataCount
=
pSMB
->
DataCount
;
pSMB
->
TotalDataCount
=
pSMB
->
DataCount
;
pSMB
->
TotalParameterCount
=
pSMB
->
ParameterCount
;
pSMB
->
TotalParameterCount
=
pSMB
->
ParameterCount
;
pSMB
->
ParameterOffset
=
cpu_to_le16
(
pSMB
->
ParameterOffset
);
pSMB
->
ParameterOffset
=
cpu_to_le16
(
pSMB
->
ParameterOffset
);
pSMB
->
DataOffset
=
cpu_to_le16
(
pSMB
->
DataOffset
);
parm_data
=
parm_data
=
(
struct
file_end_of_file_info
*
)
(((
char
*
)
&
pSMB
->
hdr
.
Protocol
)
+
(
struct
file_end_of_file_info
*
)
(((
char
*
)
&
pSMB
->
hdr
.
Protocol
)
+
pSMB
->
DataOffset
);
pSMB
->
DataOffset
);
pSMB
->
DataOffset
=
cpu_to_le16
(
pSMB
->
DataOffset
);
/* now safe to change to le */
parm_data
->
FileSize
=
size
;
parm_data
->
FileSize
=
size
;
pSMB
->
Fid
=
fid
;
pSMB
->
Fid
=
fid
;
if
(
SetAllocation
)
{
if
(
SetAllocation
)
{
...
...
fs/cifs/inode.c
View file @
af337a9c
...
@@ -353,8 +353,9 @@ cifs_unlink(struct inode *inode, struct dentry *direntry)
...
@@ -353,8 +353,9 @@ cifs_unlink(struct inode *inode, struct dentry *direntry)
CREATE_NOT_DIR
|
CREATE_DELETE_ON_CLOSE
,
CREATE_NOT_DIR
|
CREATE_DELETE_ON_CLOSE
,
&
netfid
,
&
oplock
,
NULL
,
cifs_sb
->
local_nls
);
&
netfid
,
&
oplock
,
NULL
,
cifs_sb
->
local_nls
);
if
(
rc
==
0
)
{
if
(
rc
==
0
)
{
CIFSSMBDummyRenameOpenFile
(
xid
,
pTcon
,
netfid
,
cifs_sb
->
local_nls
);
CIFSSMBClose
(
xid
,
pTcon
,
netfid
);
CIFSSMBClose
(
xid
,
pTcon
,
netfid
);
/* BB In the future chain close with the NTCreateX to narrow window */
direntry
->
d_inode
->
i_nlink
--
;
direntry
->
d_inode
->
i_nlink
--
;
}
}
}
else
if
(
rc
==
-
EACCES
)
{
}
else
if
(
rc
==
-
EACCES
)
{
...
@@ -370,8 +371,22 @@ cifs_unlink(struct inode *inode, struct dentry *direntry)
...
@@ -370,8 +371,22 @@ cifs_unlink(struct inode *inode, struct dentry *direntry)
}
}
if
(
rc
==
0
)
{
if
(
rc
==
0
)
{
rc
=
CIFSSMBDelFile
(
xid
,
pTcon
,
full_path
,
cifs_sb
->
local_nls
);
rc
=
CIFSSMBDelFile
(
xid
,
pTcon
,
full_path
,
cifs_sb
->
local_nls
);
if
(
!
rc
)
if
(
!
rc
)
{
direntry
->
d_inode
->
i_nlink
--
;
direntry
->
d_inode
->
i_nlink
--
;
}
else
if
(
rc
==
-
ETXTBSY
)
{
int
oplock
=
FALSE
;
__u16
netfid
;
rc
=
CIFSSMBOpen
(
xid
,
pTcon
,
full_path
,
FILE_OPEN
,
DELETE
,
CREATE_NOT_DIR
|
CREATE_DELETE_ON_CLOSE
,
&
netfid
,
&
oplock
,
NULL
,
cifs_sb
->
local_nls
);
if
(
rc
==
0
)
{
CIFSSMBDummyRenameOpenFile
(
xid
,
pTcon
,
netfid
,
cifs_sb
->
local_nls
);
CIFSSMBClose
(
xid
,
pTcon
,
netfid
);
direntry
->
d_inode
->
i_nlink
--
;
}
/* BB if rc = -ETXTBUSY goto the rename logic BB */
}
}
}
}
}
cifsInode
=
CIFS_I
(
direntry
->
d_inode
);
cifsInode
=
CIFS_I
(
direntry
->
d_inode
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment