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
Kirill Smelkov
linux
Commits
86c96b4b
Commit
86c96b4b
authored
Nov 18, 2005
by
Steve French
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[CIFS] Fix mknod of block and chardev over SFU mounts
Signed-off-by:
Steve French
<
sfrench@us.ibm.com
>
parent
c119b87d
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
62 additions
and
13 deletions
+62
-13
fs/cifs/cifspdu.h
fs/cifs/cifspdu.h
+9
-1
fs/cifs/dir.c
fs/cifs/dir.c
+30
-2
fs/cifs/inode.c
fs/cifs/inode.c
+23
-10
No files found.
fs/cifs/cifspdu.h
View file @
86c96b4b
...
...
@@ -603,7 +603,9 @@ typedef struct smb_com_logoff_andx_rsp {
__u16
ByteCount
;
}
__attribute__
((
packed
))
LOGOFF_ANDX_RSP
;
typedef
union
smb_com_tree_disconnect
{
/* as an altetnative can use flag on tree_connect PDU to effect disconnect *//* probably the simplest SMB PDU */
typedef
union
smb_com_tree_disconnect
{
/* as an altetnative can use flag on
tree_connect PDU to effect disconnect */
/* tdis is probably simplest SMB PDU */
struct
{
struct
smb_hdr
hdr
;
/* wct = 0 */
__u16
ByteCount
;
/* bcc = 0 */
...
...
@@ -2025,6 +2027,12 @@ typedef struct {
}
__attribute__
((
packed
))
FILE_BOTH_DIRECTORY_INFO
;
/* level 0x104 FF response data area */
struct
win_dev
{
unsigned
char
type
[
8
];
/* IntxCHR or IntxBLK */
__le64
major
;
__le64
minor
;
}
__attribute__
((
packed
));
struct
gea
{
unsigned
char
name_len
;
char
name
[
1
];
...
...
fs/cifs/dir.c
View file @
86c96b4b
...
...
@@ -292,7 +292,8 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode,
return
rc
;
}
int
cifs_mknod
(
struct
inode
*
inode
,
struct
dentry
*
direntry
,
int
mode
,
dev_t
device_number
)
int
cifs_mknod
(
struct
inode
*
inode
,
struct
dentry
*
direntry
,
int
mode
,
dev_t
device_number
)
{
int
rc
=
-
EPERM
;
int
xid
;
...
...
@@ -368,7 +369,34 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode, dev_t dev
if
(
!
rc
)
{
/* BB Do not bother to decode buf since no
local inode yet to put timestamps in */
local inode yet to put timestamps in,
but we can reuse it safely */
int
bytes_written
;
struct
win_dev
*
pdev
;
pdev
=
(
struct
win_dev
*
)
buf
;
if
(
S_ISCHR
(
mode
))
{
memcpy
(
pdev
->
type
,
"IntxCHR"
,
8
);
pdev
->
major
=
cpu_to_le64
(
MAJOR
(
device_number
));
pdev
->
minor
=
cpu_to_le64
(
MINOR
(
device_number
));
rc
=
CIFSSMBWrite
(
xid
,
pTcon
,
fileHandle
,
sizeof
(
struct
win_dev
),
0
,
&
bytes_written
,
(
char
*
)
pdev
,
NULL
,
0
);
}
else
if
(
S_ISBLK
(
mode
))
{
memcpy
(
pdev
->
type
,
"IntxBLK"
,
8
);
pdev
->
major
=
cpu_to_le64
(
MAJOR
(
device_number
));
pdev
->
minor
=
cpu_to_le64
(
MINOR
(
device_number
));
rc
=
CIFSSMBWrite
(
xid
,
pTcon
,
fileHandle
,
sizeof
(
struct
win_dev
),
0
,
&
bytes_written
,
(
char
*
)
pdev
,
NULL
,
0
);
}
/* else if(S_ISFIFO */
CIFSSMBClose
(
xid
,
pTcon
,
fileHandle
);
d_drop
(
direntry
);
}
...
...
fs/cifs/inode.c
View file @
86c96b4b
...
...
@@ -210,7 +210,7 @@ static int decode_sfu_inode(struct inode * inode, __u64 size,
int
oplock
=
FALSE
;
__u16
netfid
;
struct
cifsTconInfo
*
pTcon
=
cifs_sb
->
tcon
;
char
buf
[
8
];
char
buf
[
24
];
unsigned
int
bytes_read
;
char
*
pbuf
;
...
...
@@ -232,30 +232,43 @@ static int decode_sfu_inode(struct inode * inode, __u64 size,
/* Read header */
rc
=
CIFSSMBRead
(
xid
,
pTcon
,
netfid
,
8
/* length */
,
0
/* offset */
,
24
/* length */
,
0
/* offset */
,
&
bytes_read
,
&
pbuf
);
if
((
rc
==
0
)
&&
(
bytes_read
=
=
8
))
{
if
((
rc
==
0
)
&&
(
bytes_read
>
=
8
))
{
if
(
memcmp
(
"IntxBLK"
,
pbuf
,
8
)
==
0
)
{
cFYI
(
1
,(
"Block device"
));
inode
->
i_mode
|=
S_IFBLK
;
if
(
bytes_read
==
24
)
{
/* we have enough to decode dev num */
__u64
mjr
;
/* major */
__u64
mnr
;
/* minor */
mjr
=
le64_to_cpu
(
*
(
__le64
*
)(
pbuf
+
8
));
mnr
=
le64_to_cpu
(
*
(
__le64
*
)(
pbuf
+
16
));
inode
->
i_rdev
=
MKDEV
(
mjr
,
mnr
);
}
}
else
if
(
memcmp
(
"IntxCHR"
,
pbuf
,
8
)
==
0
)
{
cFYI
(
1
,(
"Char device"
));
inode
->
i_mode
|=
S_IFCHR
;
if
(
bytes_read
==
24
)
{
/* we have enough to decode dev num */
__u64
mjr
;
/* major */
__u64
mnr
;
/* minor */
mjr
=
le64_to_cpu
(
*
(
__le64
*
)(
pbuf
+
8
));
mnr
=
le64_to_cpu
(
*
(
__le64
*
)(
pbuf
+
16
));
inode
->
i_rdev
=
MKDEV
(
mjr
,
mnr
);
}
}
else
if
(
memcmp
(
"IntxLNK"
,
pbuf
,
7
)
==
0
)
{
cFYI
(
1
,(
"Symlink"
));
inode
->
i_mode
|=
S_IFLNK
;
}
}
else
{
inode
->
i_mode
|=
S_IFREG
;
/* file? */
rc
=
-
EOPNOTSUPP
;
}
}
else
{
inode
->
i_mode
|=
S_IFREG
;
/* then it is a file */
rc
=
-
EOPNOTSUPP
;
/* or some unknown SFU type */
}
CIFSSMBClose
(
xid
,
pTcon
,
netfid
);
/* inode->i_rdev = MKDEV(le64_to_cpu(DevMajor),
le64_to_cpu(DevMinor) & MINORMASK);*/
/* inode->i_mode |= S_IFBLK; */
}
return
rc
;
...
...
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