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
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