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
9b45d209
Commit
9b45d209
authored
Sep 18, 2003
by
Paul Mackerras
Browse files
Options
Browse Files
Download
Plain Diff
Merge samba.org:/home/paulus/kernel/linux-2.5
into samba.org:/home/paulus/kernel/for-linus-ppc64
parents
9d6cb0a2
ec7ee636
Changes
48
Show whitespace changes
Inline
Side-by-side
Showing
48 changed files
with
829 additions
and
587 deletions
+829
-587
CREDITS
CREDITS
+2
-1
MAINTAINERS
MAINTAINERS
+50
-2
arch/i386/kernel/timers/timer_tsc.c
arch/i386/kernel/timers/timer_tsc.c
+11
-9
arch/sparc64/mm/init.c
arch/sparc64/mm/init.c
+0
-4
drivers/bluetooth/hci_usb.c
drivers/bluetooth/hci_usb.c
+2
-1
fs/Kconfig
fs/Kconfig
+14
-0
fs/coda/cache.c
fs/coda/cache.c
+11
-14
fs/coda/cnode.c
fs/coda/cnode.c
+9
-20
fs/coda/coda_linux.c
fs/coda/coda_linux.c
+6
-81
fs/coda/dir.c
fs/coda/dir.c
+5
-6
fs/coda/file.c
fs/coda/file.c
+2
-3
fs/coda/inode.c
fs/coda/inode.c
+3
-10
fs/coda/psdev.c
fs/coda/psdev.c
+13
-13
fs/coda/upcall.c
fs/coda/upcall.c
+59
-44
fs/jfs/jfs_imap.c
fs/jfs/jfs_imap.c
+5
-3
include/asm-sparc64/bugs.h
include/asm-sparc64/bugs.h
+10
-1
include/asm-sparc64/delay.h
include/asm-sparc64/delay.h
+0
-6
include/linux/coda.h
include/linux/coda.h
+91
-108
include/linux/coda_cache.h
include/linux/coda_cache.h
+1
-1
include/linux/coda_fs_i.h
include/linux/coda_fs_i.h
+7
-7
include/linux/coda_linux.h
include/linux/coda_linux.h
+3
-8
include/linux/coda_psdev.h
include/linux/coda_psdev.h
+31
-34
include/linux/ipv6.h
include/linux/ipv6.h
+46
-0
include/linux/netdevice.h
include/linux/netdevice.h
+2
-2
include/linux/proc_fs.h
include/linux/proc_fs.h
+4
-3
include/linux/rtnetlink.h
include/linux/rtnetlink.h
+15
-1
include/net/bluetooth/bluetooth.h
include/net/bluetooth/bluetooth.h
+1
-1
include/net/bluetooth/hci.h
include/net/bluetooth/hci.h
+2
-0
include/net/bluetooth/l2cap.h
include/net/bluetooth/l2cap.h
+2
-0
include/net/if_inet6.h
include/net/if_inet6.h
+5
-22
net/bluetooth/af_bluetooth.c
net/bluetooth/af_bluetooth.c
+9
-13
net/bluetooth/bnep/bnep.h
net/bluetooth/bnep/bnep.h
+2
-2
net/bluetooth/bnep/core.c
net/bluetooth/bnep/core.c
+16
-20
net/bluetooth/bnep/netdev.c
net/bluetooth/bnep/netdev.c
+2
-5
net/bluetooth/hci_core.c
net/bluetooth/hci_core.c
+6
-3
net/bluetooth/hci_event.c
net/bluetooth/hci_event.c
+13
-0
net/bluetooth/hci_sock.c
net/bluetooth/hci_sock.c
+1
-1
net/bluetooth/l2cap.c
net/bluetooth/l2cap.c
+49
-25
net/bluetooth/rfcomm/core.c
net/bluetooth/rfcomm/core.c
+89
-13
net/bluetooth/rfcomm/sock.c
net/bluetooth/rfcomm/sock.c
+41
-34
net/bluetooth/rfcomm/tty.c
net/bluetooth/rfcomm/tty.c
+55
-56
net/bluetooth/sco.c
net/bluetooth/sco.c
+16
-5
net/bluetooth/syms.c
net/bluetooth/syms.c
+1
-1
net/ipv4/ip_input.c
net/ipv4/ip_input.c
+1
-1
net/ipv4/netfilter/ip_nat_amanda.c
net/ipv4/netfilter/ip_nat_amanda.c
+2
-2
net/ipv4/netfilter/ip_nat_irc.c
net/ipv4/netfilter/ip_nat_irc.c
+1
-1
net/ipv6/addrconf.c
net/ipv6/addrconf.c
+102
-0
net/ipv6/ndisc.c
net/ipv6/ndisc.c
+11
-0
No files found.
CREDITS
View file @
9b45d209
...
...
@@ -1394,7 +1394,8 @@ S: USA
N: Marcel Holtmann
E: marcel@holtmann.org
W: http://www.holtmann.org
D: Author of the Linux Bluetooth Subsystem PC Card drivers
D: Author and maintainer of the various Bluetooth HCI drivers
D: Various other Bluetooth related patches, cleanups and fixes
S: Germany
N: Rob W. W. Hooft
...
...
MAINTAINERS
View file @
9b45d209
...
...
@@ -328,18 +328,66 @@ M: axboe@suse.de
L: linux-kernel@vger.kernel.org
S: Maintained
BLUETOOTH SUBSYSTEM
(BlueZ)
BLUETOOTH SUBSYSTEM
P: Maxim Krasnyansky
M: maxk@qualcomm.com
W: http://bluez.sf.net
S: Maintained
BLUETOOTH SUBSYSTEM (PC Card Drivers)
BLUETOOTH RFCOMM LAYER
P: Maxim Krasnyansky
M: maxk@qualcomm.com
W: http://bluez.sf.net
S: Maintained
BLUETOOTH BNEP LAYER
P: Maxim Krasnyansky
M: maxk@qualcomm.com
W: http://bluez.sf.net
S: Maintained
BLUETOOTH HCI USB DRIVER
P: Maxim Krasnyansky
M: maxk@qualcomm.com
W: http://bluez.sf.net
S: Maintained
BLUETOOTH HCI UART DRIVER
P: Maxim Krasnyansky
M: maxk@qualcomm.com
W: http://bluez.sf.net
S: Maintained
BLUETOOTH HCI DTL1 DRIVER
P: Marcel Holtmann
M: marcel@holtmann.org
W: http://www.holtmann.org/linux/bluetooth/
S: Maintained
BLUETOOTH HCI BLUECARD DRIVER
P: Marcel Holtmann
M: marcel@holtmann.org
W: http://www.holtmann.org/linux/bluetooth/
S: Maintained
BLUETOOTH HCI BT3C DRIVER
P: Marcel Holtmann
M: marcel@holtmann.org
W: http://www.holtmann.org/linux/bluetooth/
S: Maintained
BLUETOOTH HCI BTUART DRIVER
P: Marcel Holtmann
M: marcel@holtmann.org
W: http://www.holtmann.org/linux/bluetooth/
S: Maintained
BLUETOOTH HCI VHCI DRIVER
P: Maxim Krasnyansky
M: maxk@qualcomm.com
W: http://bluez.sf.net
S: Maintained
BONDING DRIVER
P: Chad Tindel
M: ctindel@users.sourceforge.net
...
...
arch/i386/kernel/timers/timer_tsc.c
View file @
9b45d209
...
...
@@ -39,7 +39,7 @@ static int delay_at_last_interrupt;
static
unsigned
long
last_tsc_low
;
/* lsb 32 bits of Time Stamp Counter */
static
unsigned
long
last_tsc_high
;
/* msb 32 bits of Time Stamp Counter */
static
unsigned
long
long
monotonic_base
;
static
rwlock_t
monotonic_lock
=
RW_
LOCK_UNLOCKED
;
static
seqlock_t
monotonic_lock
=
SEQ
LOCK_UNLOCKED
;
/* convert from cycles(64bits) => nanoseconds (64bits)
* basic equation:
...
...
@@ -111,12 +111,14 @@ static unsigned long get_offset_tsc(void)
static
unsigned
long
long
monotonic_clock_tsc
(
void
)
{
unsigned
long
long
last_offset
,
this_offset
,
base
;
unsigned
seq
;
/* atomically read monotonic base & last_offset */
read_lock_irq
(
&
monotonic_lock
);
do
{
seq
=
read_seqbegin
(
&
monotonic_lock
);
last_offset
=
((
unsigned
long
long
)
last_tsc_high
<<
32
)
|
last_tsc_low
;
base
=
monotonic_base
;
read_unlock_irq
(
&
monotonic_lock
);
}
while
(
read_seqretry
(
&
monotonic_lock
,
seq
)
);
/* Read the Time Stamp Counter */
rdtscll
(
this_offset
);
...
...
@@ -135,7 +137,7 @@ static void mark_offset_tsc(void)
unsigned
long
long
this_offset
,
last_offset
;
static
int
lost_count
=
0
;
write_lock
(
&
monotonic_lock
);
write_
seq
lock
(
&
monotonic_lock
);
last_offset
=
((
unsigned
long
long
)
last_tsc_high
<<
32
)
|
last_tsc_low
;
/*
* It is important that these two operations happen almost at
...
...
@@ -204,7 +206,7 @@ static void mark_offset_tsc(void)
/* update the monotonic base value */
this_offset
=
((
unsigned
long
long
)
last_tsc_high
<<
32
)
|
last_tsc_low
;
monotonic_base
+=
cycles_2_ns
(
this_offset
-
last_offset
);
write_unlock
(
&
monotonic_lock
);
write_
seq
unlock
(
&
monotonic_lock
);
/* calculate delay_at_last_interrupt */
count
=
((
LATCH
-
1
)
-
count
)
*
TICK_SIZE
;
...
...
@@ -236,7 +238,7 @@ static void mark_offset_tsc_hpet(void)
unsigned
long
long
this_offset
,
last_offset
;
unsigned
long
offset
,
temp
,
hpet_current
;
write_lock
(
&
monotonic_lock
);
write_
seq
lock
(
&
monotonic_lock
);
last_offset
=
((
unsigned
long
long
)
last_tsc_high
<<
32
)
|
last_tsc_low
;
/*
* It is important that these two operations happen almost at
...
...
@@ -264,7 +266,7 @@ static void mark_offset_tsc_hpet(void)
/* update the monotonic base value */
this_offset
=
((
unsigned
long
long
)
last_tsc_high
<<
32
)
|
last_tsc_low
;
monotonic_base
+=
cycles_2_ns
(
this_offset
-
last_offset
);
write_unlock
(
&
monotonic_lock
);
write_
seq
unlock
(
&
monotonic_lock
);
/* calculate delay_at_last_interrupt */
/*
...
...
arch/sparc64/mm/init.c
View file @
9b45d209
...
...
@@ -1706,10 +1706,6 @@ void __init mem_init(void)
unsigned
long
addr
,
last
;
int
i
;
#ifndef CONFIG_SMP
cpu_data
(
0
).
udelay_val
=
loops_per_jiffy
;
#endif
i
=
last_valid_pfn
>>
((
22
-
PAGE_SHIFT
)
+
6
);
i
+=
1
;
sparc64_valid_addr_bitmap
=
(
unsigned
long
*
)
...
...
drivers/bluetooth/hci_usb.c
View file @
9b45d209
...
...
@@ -302,6 +302,7 @@ static int hci_usb_open(struct hci_dev *hdev)
hci_usb_bulk_rx_submit
(
husb
);
#ifdef CONFIG_BT_USB_SCO
if
(
husb
->
isoc_iface
)
hci_usb_isoc_rx_submit
(
husb
);
#endif
}
else
{
...
...
fs/Kconfig
View file @
9b45d209
...
...
@@ -1562,6 +1562,20 @@ config CODA_FS
whenever you want), say M here and read
<file:Documentation/modules.txt>. The module will be called coda.
config CODA_FS_OLD_API
bool "Use 96-bit Coda file identifiers"
depends on CODA_FS
help
A new kernel-userspace API had to be introduced for Coda v6.0
to support larger 128-bit file identifiers as needed by the
new realms implementation.
However this new API is not backward compatible with older
clients. If you really need to run the old Coda userspace
cache manager then say Y.
For most cases you probably want to say N.
config INTERMEZZO_FS
tristate "InterMezzo file system support (replicating fs) (EXPERIMENTAL)"
depends on INET && EXPERIMENTAL
...
...
fs/coda/cache.c
View file @
9b45d209
...
...
@@ -23,13 +23,16 @@
#include <linux/coda_fs_i.h>
#include <linux/coda_cache.h>
static
atomic_t
permission_epoch
=
ATOMIC_INIT
(
0
);
/* replace or extend an acl cache hit */
void
coda_cache_enter
(
struct
inode
*
inode
,
int
mask
)
{
struct
coda_inode_info
*
cii
=
ITOC
(
inode
);
if
(
!
coda_cred_ok
(
&
cii
->
c_cached_cred
)
)
{
coda_load_creds
(
&
cii
->
c_cached_cred
);
cii
->
c_cached_epoch
=
atomic_read
(
&
permission_epoch
);
if
(
cii
->
c_uid
!=
current
->
fsuid
)
{
cii
->
c_uid
=
current
->
fsuid
;
cii
->
c_cached_perm
=
mask
;
}
else
cii
->
c_cached_perm
|=
mask
;
...
...
@@ -42,22 +45,15 @@ void coda_cache_clear_inode(struct inode *inode)
cii
->
c_cached_perm
=
0
;
}
/* remove all acl caches
for a principal (or all principals when cred == NULL)
*/
void
coda_cache_clear_all
(
struct
super_block
*
sb
,
struct
coda_cred
*
cred
)
/* remove all acl caches */
void
coda_cache_clear_all
(
struct
super_block
*
sb
)
{
struct
coda_sb_info
*
sbi
;
struct
coda_inode_info
*
cii
;
struct
list_head
*
tmp
;
sbi
=
coda_sbp
(
sb
);
if
(
!
sbi
)
BUG
();
list_for_each
(
tmp
,
&
sbi
->
sbi_cihead
)
{
cii
=
list_entry
(
tmp
,
struct
coda_inode_info
,
c_cilist
);
if
(
!
cred
||
coda_cred_eq
(
cred
,
&
cii
->
c_cached_cred
))
cii
->
c_cached_perm
=
0
;
}
atomic_inc
(
&
permission_epoch
);
}
...
...
@@ -67,8 +63,9 @@ int coda_cache_check(struct inode *inode, int mask)
struct
coda_inode_info
*
cii
=
ITOC
(
inode
);
int
hit
;
hit
=
((
mask
&
cii
->
c_cached_perm
)
==
mask
)
&&
coda_cred_ok
(
&
cii
->
c_cached_cred
);
hit
=
(
mask
&
cii
->
c_cached_perm
)
==
mask
&&
cii
->
c_uid
==
current
->
fsuid
&&
cii
->
c_cached_epoch
==
atomic_read
(
&
permission_epoch
);
return
hit
;
}
...
...
fs/coda/cnode.c
View file @
9b45d209
...
...
@@ -11,18 +11,9 @@
#include <linux/coda_fs_i.h>
#include <linux/coda_psdev.h>
inline
int
coda_fideq
(
ViceFid
*
fid1
,
Vice
Fid
*
fid2
)
inline
int
coda_fideq
(
struct
CodaFid
*
fid1
,
struct
Coda
Fid
*
fid2
)
{
if
(
fid1
->
Vnode
!=
fid2
->
Vnode
)
return
0
;
if
(
fid1
->
Volume
!=
fid2
->
Volume
)
return
0
;
if
(
fid1
->
Unique
!=
fid2
->
Unique
)
return
0
;
return
1
;
}
inline
int
coda_isnullfid
(
ViceFid
*
fid
)
{
if
(
fid
->
Vnode
||
fid
->
Volume
||
fid
->
Unique
)
return
0
;
return
1
;
return
memcmp
(
fid1
,
fid2
,
sizeof
(
*
fid1
))
==
0
;
}
static
struct
inode_operations
coda_symlink_inode_operations
=
{
...
...
@@ -52,13 +43,13 @@ static void coda_fill_inode(struct inode *inode, struct coda_vattr *attr)
static
int
coda_test_inode
(
struct
inode
*
inode
,
void
*
data
)
{
ViceFid
*
fid
=
(
Vice
Fid
*
)
data
;
struct
CodaFid
*
fid
=
(
struct
Coda
Fid
*
)
data
;
return
coda_fideq
(
&
(
ITOC
(
inode
)
->
c_fid
),
fid
);
}
static
int
coda_set_inode
(
struct
inode
*
inode
,
void
*
data
)
{
ViceFid
*
fid
=
(
Vice
Fid
*
)
data
;
struct
CodaFid
*
fid
=
(
struct
Coda
Fid
*
)
data
;
ITOC
(
inode
)
->
c_fid
=
*
fid
;
return
0
;
}
...
...
@@ -68,12 +59,11 @@ static int coda_fail_inode(struct inode *inode, void *data)
return
-
1
;
}
struct
inode
*
coda_iget
(
struct
super_block
*
sb
,
Vice
Fid
*
fid
,
struct
inode
*
coda_iget
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
,
struct
coda_vattr
*
attr
)
{
struct
inode
*
inode
;
struct
coda_inode_info
*
cii
;
struct
coda_sb_info
*
sbi
=
coda_sbp
(
sb
);
unsigned
long
hash
=
coda_f2i
(
fid
);
inode
=
iget5_locked
(
sb
,
hash
,
coda_test_inode
,
coda_set_inode
,
fid
);
...
...
@@ -86,7 +76,6 @@ struct inode * coda_iget(struct super_block * sb, ViceFid * fid,
/* we still need to set i_ino for things like stat(2) */
inode
->
i_ino
=
hash
;
cii
->
c_mapcount
=
0
;
list_add
(
&
cii
->
c_cilist
,
&
sbi
->
sbi_cihead
);
unlock_new_inode
(
inode
);
}
...
...
@@ -101,7 +90,7 @@ struct inode * coda_iget(struct super_block * sb, ViceFid * fid,
- link the two up if this is needed
- fill in the attributes
*/
int
coda_cnode_make
(
struct
inode
**
inode
,
Vice
Fid
*
fid
,
struct
super_block
*
sb
)
int
coda_cnode_make
(
struct
inode
**
inode
,
struct
Coda
Fid
*
fid
,
struct
super_block
*
sb
)
{
struct
coda_vattr
attr
;
int
error
;
...
...
@@ -122,8 +111,8 @@ int coda_cnode_make(struct inode **inode, ViceFid *fid, struct super_block *sb)
}
void
coda_replace_fid
(
struct
inode
*
inode
,
struct
Vice
Fid
*
oldfid
,
struct
Vice
Fid
*
newfid
)
void
coda_replace_fid
(
struct
inode
*
inode
,
struct
Coda
Fid
*
oldfid
,
struct
Coda
Fid
*
newfid
)
{
struct
coda_inode_info
*
cii
;
unsigned
long
hash
=
coda_f2i
(
newfid
);
...
...
@@ -142,7 +131,7 @@ void coda_replace_fid(struct inode *inode, struct ViceFid *oldfid,
}
/* convert a fid to an inode. */
struct
inode
*
coda_fid_to_inode
(
Vice
Fid
*
fid
,
struct
super_block
*
sb
)
struct
inode
*
coda_fid_to_inode
(
struct
Coda
Fid
*
fid
,
struct
super_block
*
sb
)
{
struct
inode
*
inode
;
unsigned
long
hash
=
coda_f2i
(
fid
);
...
...
fs/coda/coda_linux.c
View file @
9b45d209
...
...
@@ -25,10 +25,14 @@
int
coda_fake_statfs
;
/* print a fid */
char
*
coda_f2s
(
Vice
Fid
*
f
)
char
*
coda_f2s
(
struct
Coda
Fid
*
f
)
{
static
char
s
[
60
];
sprintf
(
s
,
"(%-#lx.%-#lx.%-#lx)"
,
f
->
Volume
,
f
->
Vnode
,
f
->
Unique
);
#ifdef CODA_FS_OLD_API
sprintf
(
s
,
"(%08x.%08x.%08x)"
,
f
->
opaque
[
0
],
f
->
opaque
[
1
],
f
->
opaque
[
2
]);
#else
sprintf
(
s
,
"(%08x.%08x.%08x.%08x)"
,
f
->
opaque
[
0
],
f
->
opaque
[
1
],
f
->
opaque
[
2
],
f
->
opaque
[
3
]);
#endif
return
s
;
}
...
...
@@ -45,30 +49,6 @@ int coda_isroot(struct inode *i)
return
(
i
->
i_sb
->
s_root
->
d_inode
==
i
);
}
/* put the current process credentials in the cred */
void
coda_load_creds
(
struct
coda_cred
*
cred
)
{
cred
->
cr_uid
=
(
vuid_t
)
current
->
uid
;
cred
->
cr_euid
=
(
vuid_t
)
current
->
euid
;
cred
->
cr_suid
=
(
vuid_t
)
current
->
suid
;
cred
->
cr_fsuid
=
(
vuid_t
)
current
->
fsuid
;
cred
->
cr_groupid
=
(
vgid_t
)
current
->
gid
;
cred
->
cr_egid
=
(
vgid_t
)
current
->
egid
;
cred
->
cr_sgid
=
(
vgid_t
)
current
->
sgid
;
cred
->
cr_fsgid
=
(
vgid_t
)
current
->
fsgid
;
}
int
coda_cred_ok
(
struct
coda_cred
*
cred
)
{
return
(
current
->
fsuid
==
cred
->
cr_fsuid
);
}
int
coda_cred_eq
(
struct
coda_cred
*
cred1
,
struct
coda_cred
*
cred2
)
{
return
(
cred1
->
cr_fsuid
==
cred2
->
cr_fsuid
);
}
unsigned
short
coda_flags_to_cflags
(
unsigned
short
flags
)
{
unsigned
short
coda_flags
=
0
;
...
...
@@ -215,58 +195,3 @@ void coda_iattr_to_vattr(struct iattr *iattr, struct coda_vattr *vattr)
}
}
void
print_vattr
(
struct
coda_vattr
*
attr
)
{
char
*
typestr
;
switch
(
attr
->
va_type
)
{
case
C_VNON
:
typestr
=
"C_VNON"
;
break
;
case
C_VREG
:
typestr
=
"C_VREG"
;
break
;
case
C_VDIR
:
typestr
=
"C_VDIR"
;
break
;
case
C_VBLK
:
typestr
=
"C_VBLK"
;
break
;
case
C_VCHR
:
typestr
=
"C_VCHR"
;
break
;
case
C_VLNK
:
typestr
=
"C_VLNK"
;
break
;
case
C_VSOCK
:
typestr
=
"C_VSCK"
;
break
;
case
C_VFIFO
:
typestr
=
"C_VFFO"
;
break
;
case
C_VBAD
:
typestr
=
"C_VBAD"
;
break
;
default:
typestr
=
"????"
;
break
;
}
printk
(
"attr: type %s (%o) mode %o uid %d gid %d rdev %d
\n
"
,
typestr
,
(
int
)
attr
->
va_type
,
(
int
)
attr
->
va_mode
,
(
int
)
attr
->
va_uid
,
(
int
)
attr
->
va_gid
,
(
int
)
attr
->
va_rdev
);
printk
(
" fileid %d nlink %d size %d blocksize %d bytes %d
\n
"
,
(
int
)
attr
->
va_fileid
,
(
int
)
attr
->
va_nlink
,
(
int
)
attr
->
va_size
,
(
int
)
attr
->
va_blocksize
,(
int
)
attr
->
va_bytes
);
printk
(
" gen %ld flags %ld
\n
"
,
attr
->
va_gen
,
attr
->
va_flags
);
printk
(
" atime sec %d nsec %d
\n
"
,
(
int
)
attr
->
va_atime
.
tv_sec
,
(
int
)
attr
->
va_atime
.
tv_nsec
);
printk
(
" mtime sec %d nsec %d
\n
"
,
(
int
)
attr
->
va_mtime
.
tv_sec
,
(
int
)
attr
->
va_mtime
.
tv_nsec
);
printk
(
" ctime sec %d nsec %d
\n
"
,
(
int
)
attr
->
va_ctime
.
tv_sec
,
(
int
)
attr
->
va_ctime
.
tv_nsec
);
}
fs/coda/dir.c
View file @
9b45d209
...
...
@@ -93,7 +93,7 @@ struct file_operations coda_dir_operations = {
static
struct
dentry
*
coda_lookup
(
struct
inode
*
dir
,
struct
dentry
*
entry
,
struct
nameidata
*
nd
)
{
struct
inode
*
res_inode
=
NULL
;
struct
ViceFid
resfid
=
{
0
,
0
,
0
};
struct
CodaFid
resfid
=
{
{
0
,
}
};
int
dropme
=
0
;
/* to indicate entry should not be cached */
int
type
=
0
;
int
error
=
0
;
...
...
@@ -196,7 +196,7 @@ static int coda_create(struct inode *dir, struct dentry *de, int mode, struct na
const
char
*
name
=
de
->
d_name
.
name
;
int
length
=
de
->
d_name
.
len
;
struct
inode
*
inode
;
struct
Vice
Fid
newfid
;
struct
Coda
Fid
newfid
;
struct
coda_vattr
attrs
;
lock_kernel
();
...
...
@@ -236,7 +236,7 @@ static int coda_mknod(struct inode *dir, struct dentry *de, int mode, dev_t rdev
const
char
*
name
=
de
->
d_name
.
name
;
int
length
=
de
->
d_name
.
len
;
struct
inode
*
inode
;
struct
Vice
Fid
newfid
;
struct
Coda
Fid
newfid
;
struct
coda_vattr
attrs
;
if
(
coda_hasmknod
==
0
)
...
...
@@ -283,7 +283,7 @@ static int coda_mkdir(struct inode *dir, struct dentry *de, int mode)
const
char
*
name
=
de
->
d_name
.
name
;
int
len
=
de
->
d_name
.
len
;
int
error
;
struct
Vice
Fid
newfid
;
struct
Coda
Fid
newfid
;
lock_kernel
();
coda_vfs_stat
.
mkdir
++
;
...
...
@@ -588,8 +588,7 @@ static int coda_venus_readdir(struct file *filp, filldir_t filldir,
break
;
}
/* validate whether the directory file actually makes sense */
if
(
vdir
->
d_reclen
<
vdir_size
+
vdir
->
d_namlen
||
vdir
->
d_namlen
>
CODA_MAXNAMLEN
)
{
if
(
vdir
->
d_reclen
<
vdir_size
+
vdir
->
d_namlen
)
{
printk
(
"coda_venus_readdir: Invalid dir: %ld
\n
"
,
filp
->
f_dentry
->
d_inode
->
i_ino
);
ret
=
-
EBADF
;
...
...
fs/coda/file.c
View file @
9b45d209
...
...
@@ -136,7 +136,6 @@ int coda_open(struct inode *coda_inode, struct file *coda_file)
cfi
->
cfi_magic
=
CODA_MAGIC
;
cfi
->
cfi_mapcount
=
0
;
cfi
->
cfi_container
=
host_file
;
coda_load_creds
(
&
cfi
->
cfi_cred
);
BUG_ON
(
coda_file
->
private_data
!=
NULL
);
coda_file
->
private_data
=
cfi
;
...
...
@@ -176,7 +175,7 @@ int coda_flush(struct file *coda_file)
coda_inode
=
coda_file
->
f_dentry
->
d_inode
;
err
=
venus_store
(
coda_inode
->
i_sb
,
coda_i2f
(
coda_inode
),
coda_flags
,
&
cfi
->
cfi_cre
d
);
coda_file
->
f_ui
d
);
if
(
err
==
-
EOPNOTSUPP
)
{
use_coda_close
=
1
;
...
...
@@ -214,7 +213,7 @@ int coda_release(struct inode *coda_inode, struct file *coda_file)
if
(
use_coda_close
)
err
=
venus_close
(
coda_inode
->
i_sb
,
coda_i2f
(
coda_inode
),
coda_flags
,
&
cfi
->
cfi_cre
d
);
coda_flags
,
coda_file
->
f_ui
d
);
host_inode
=
cfi
->
cfi_container
->
f_dentry
->
d_inode
;
cii
=
ITOC
(
coda_inode
);
...
...
fs/coda/inode.c
View file @
9b45d209
...
...
@@ -44,10 +44,9 @@ static struct inode *coda_alloc_inode(struct super_block *sb)
ei
=
(
struct
coda_inode_info
*
)
kmem_cache_alloc
(
coda_inode_cachep
,
SLAB_KERNEL
);
if
(
!
ei
)
return
NULL
;
memset
(
&
ei
->
c_fid
,
0
,
sizeof
(
struct
Vice
Fid
));
memset
(
&
ei
->
c_fid
,
0
,
sizeof
(
struct
Coda
Fid
));
ei
->
c_flags
=
0
;
INIT_LIST_HEAD
(
&
ei
->
c_cilist
);
memset
(
&
ei
->
c_cached_cred
,
0
,
sizeof
(
struct
coda_cred
));
ei
->
c_uid
=
0
;
ei
->
c_cached_perm
=
0
;
return
&
ei
->
vfs_inode
;
}
...
...
@@ -139,7 +138,7 @@ static int coda_fill_super(struct super_block *sb, void *data, int silent)
struct
inode
*
root
=
0
;
struct
coda_sb_info
*
sbi
=
NULL
;
struct
venus_comm
*
vc
=
NULL
;
Vice
Fid
fid
;
struct
Coda
Fid
fid
;
int
error
;
int
idx
;
...
...
@@ -169,9 +168,7 @@ static int coda_fill_super(struct super_block *sb, void *data, int silent)
vc
->
vc_sb
=
sb
;
sbi
->
sbi_sb
=
sb
;
sbi
->
sbi_vcomm
=
vc
;
INIT_LIST_HEAD
(
&
sbi
->
sbi_cihead
);
sb
->
s_fs_info
=
sbi
;
sb
->
s_blocksize
=
1024
;
/* XXXXX what do we put here?? */
...
...
@@ -218,7 +215,6 @@ static void coda_put_super(struct super_block *sb)
sbi
=
coda_sbp
(
sb
);
sbi
->
sbi_vcomm
->
vc_sb
=
NULL
;
list_del_init
(
&
sbi
->
sbi_cihead
);
printk
(
"Coda: Bye bye.
\n
"
);
kfree
(
sbi
);
...
...
@@ -226,9 +222,6 @@ static void coda_put_super(struct super_block *sb)
static
void
coda_clear_inode
(
struct
inode
*
inode
)
{
struct
coda_inode_info
*
cii
=
ITOC
(
inode
);
list_del_init
(
&
cii
->
c_cilist
);
coda_cache_clear_inode
(
inode
);
}
...
...
fs/coda/psdev.c
View file @
9b45d209
...
...
@@ -61,7 +61,6 @@ unsigned long coda_timeout = 30; /* .. secs, then signals will dequeue */
struct
venus_comm
coda_comms
[
MAX_CODADEVS
];
kmem_cache_t
*
cii_cache
,
*
cred_cache
,
*
upc_cache
;
/*
* Device operations
...
...
@@ -126,13 +125,13 @@ static ssize_t coda_psdev_write(struct file *file, const char *buf,
}
if
(
nbytes
<
sizeof
(
struct
coda_out_hdr
)
)
{
printk
(
"coda_downcall opc %
ld uniq %l
d, not enough!
\n
"
,
printk
(
"coda_downcall opc %
d uniq %
d, not enough!
\n
"
,
hdr
.
opcode
,
hdr
.
unique
);
count
=
nbytes
;
goto
out
;
}
if
(
nbytes
>
size
)
{
printk
(
"Coda: downcall opc %
ld, uniq %l
d, too much!"
,
printk
(
"Coda: downcall opc %
d, uniq %
d, too much!"
,
hdr
.
opcode
,
hdr
.
unique
);
nbytes
=
size
;
}
...
...
@@ -171,7 +170,7 @@ static ssize_t coda_psdev_write(struct file *file, const char *buf,
unlock_kernel
();
if
(
!
req
)
{
printk
(
"psdev_write: msg (%
ld, %l
d) not found
\n
"
,
printk
(
"psdev_write: msg (%
d, %
d) not found
\n
"
,
hdr
.
opcode
,
hdr
.
unique
);
retval
=
-
ESRCH
;
goto
out
;
...
...
@@ -179,7 +178,7 @@ static ssize_t coda_psdev_write(struct file *file, const char *buf,
/* move data into response buffer. */
if
(
req
->
uc_outSize
<
nbytes
)
{
printk
(
"psdev_write: too much cnt: %d, cnt: %ld, opc: %
ld, uniq: %l
d.
\n
"
,
printk
(
"psdev_write: too much cnt: %d, cnt: %ld, opc: %
d, uniq: %
d.
\n
"
,
req
->
uc_outSize
,
(
long
)
nbytes
,
hdr
.
opcode
,
hdr
.
unique
);
nbytes
=
req
->
uc_outSize
;
/* don't have more space! */
}
...
...
@@ -325,10 +324,7 @@ static int coda_psdev_release(struct inode * inode, struct file * file)
}
/* Wakeup clients so they can return. */
lh
=
vcp
->
vc_pending
.
next
;
next
=
lh
;
while
(
(
lh
=
next
)
!=
&
vcp
->
vc_pending
)
{
next
=
lh
->
next
;
list_for_each_safe
(
lh
,
next
,
&
vcp
->
vc_pending
)
{
req
=
list_entry
(
lh
,
struct
upc_req
,
uc_chain
);
/* Async requests need to be freed here */
if
(
req
->
uc_flags
&
REQ_ASYNC
)
{
...
...
@@ -340,9 +336,7 @@ static int coda_psdev_release(struct inode * inode, struct file * file)
wake_up
(
&
req
->
uc_sleep
);
}
lh
=
&
vcp
->
vc_processing
;
while
(
(
lh
=
lh
->
next
)
!=
&
vcp
->
vc_processing
)
{
req
=
list_entry
(
lh
,
struct
upc_req
,
uc_chain
);
list_for_each_entry
(
req
,
&
vcp
->
vc_processing
,
uc_chain
)
{
req
->
uc_flags
|=
REQ_ABORT
;
wake_up
(
&
req
->
uc_sleep
);
}
...
...
@@ -390,7 +384,13 @@ static int __init init_coda(void)
{
int
status
;
int
i
;
printk
(
KERN_INFO
"Coda Kernel/Venus communications, v5.3.15, coda@cs.cmu.edu
\n
"
);
printk
(
KERN_INFO
"Coda Kernel/Venus communications, "
#ifdef CODA_FS_OLD_API
"v5.3.20"
#else
"v6.0.0"
#endif
", coda@cs.cmu.edu
\n
"
);
status
=
coda_init_inodecache
();
if
(
status
)
...
...
fs/coda/upcall.c
View file @
9b45d209
...
...
@@ -55,8 +55,12 @@ static void *alloc_upcall(int opcode, int size)
inp
->
ih
.
opcode
=
opcode
;
inp
->
ih
.
pid
=
current
->
pid
;
inp
->
ih
.
pgid
=
current
->
pgrp
;
coda_load_creds
(
&
(
inp
->
ih
.
cred
));
#ifdef CODA_FS_OLD_API
memset
(
&
inp
->
ih
.
cred
,
0
,
sizeof
(
struct
coda_cred
));
inp
->
ih
.
cred
.
cr_fsuid
=
current
->
fsuid
;
#else
inp
->
ih
.
uid
=
current
->
fsuid
;
#endif
return
(
void
*
)
inp
;
}
...
...
@@ -74,7 +78,7 @@ do {\
/* the upcalls */
int
venus_rootfid
(
struct
super_block
*
sb
,
Vice
Fid
*
fidp
)
int
venus_rootfid
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fidp
)
{
union
inputArgs
*
inp
;
union
outputArgs
*
outp
;
...
...
@@ -88,14 +92,14 @@ int venus_rootfid(struct super_block *sb, ViceFid *fidp)
if
(
error
)
{
printk
(
"coda_get_rootfid: error %d
\n
"
,
error
);
}
else
{
*
fidp
=
(
ViceFid
)
outp
->
coda_root
.
VFid
;
*
fidp
=
outp
->
coda_root
.
VFid
;
}
CODA_FREE
(
inp
,
insize
);
return
error
;
}
int
venus_getattr
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
fid
,
int
venus_getattr
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
,
struct
coda_vattr
*
attr
)
{
union
inputArgs
*
inp
;
...
...
@@ -114,7 +118,7 @@ int venus_getattr(struct super_block *sb, struct ViceFid *fid,
return
error
;
}
int
venus_setattr
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
fid
,
int
venus_setattr
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
,
struct
coda_vattr
*
vattr
)
{
union
inputArgs
*
inp
;
...
...
@@ -133,9 +137,9 @@ int venus_setattr(struct super_block *sb, struct ViceFid *fid,
return
error
;
}
int
venus_lookup
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
fid
,
int
venus_lookup
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
,
const
char
*
name
,
int
length
,
int
*
type
,
struct
Vice
Fid
*
resfid
)
struct
Coda
Fid
*
resfid
)
{
union
inputArgs
*
inp
;
union
outputArgs
*
outp
;
...
...
@@ -162,17 +166,25 @@ int venus_lookup(struct super_block *sb, struct ViceFid *fid,
return
error
;
}
int
venus_store
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
fid
,
int
flags
,
struct
coda_cred
*
cre
d
)
int
venus_store
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
,
int
flags
,
vuid_t
ui
d
)
{
union
inputArgs
*
inp
;
union
outputArgs
*
outp
;
int
insize
,
outsize
,
error
;
#ifdef CODA_FS_OLD_API
struct
coda_cred
cred
=
{
0
,
};
cred
.
cr_fsuid
=
uid
;
#endif
insize
=
SIZE
(
store
);
UPARG
(
CODA_STORE
);
memcpy
(
&
(
inp
->
ih
.
cred
),
cred
,
sizeof
(
*
cred
));
#ifdef CODA_FS_OLD_API
memcpy
(
&
(
inp
->
ih
.
cred
),
&
cred
,
sizeof
(
cred
));
#else
inp
->
ih
.
uid
=
uid
;
#endif
inp
->
coda_store
.
VFid
=
*
fid
;
inp
->
coda_store
.
flags
=
flags
;
...
...
@@ -183,7 +195,7 @@ int venus_store(struct super_block *sb, struct ViceFid *fid, int flags,
return
error
;
}
int
venus_release
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
fid
,
int
flags
)
int
venus_release
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
,
int
flags
)
{
union
inputArgs
*
inp
;
union
outputArgs
*
outp
;
...
...
@@ -201,17 +213,25 @@ int venus_release(struct super_block *sb, struct ViceFid *fid, int flags)
return
error
;
}
int
venus_close
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
fid
,
int
flags
,
struct
coda_cred
*
cre
d
)
int
venus_close
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
,
int
flags
,
vuid_t
ui
d
)
{
union
inputArgs
*
inp
;
union
outputArgs
*
outp
;
int
insize
,
outsize
,
error
;
#ifdef CODA_FS_OLD_API
struct
coda_cred
cred
=
{
0
,
};
cred
.
cr_fsuid
=
uid
;
#endif
insize
=
SIZE
(
release
);
UPARG
(
CODA_CLOSE
);
memcpy
(
&
(
inp
->
ih
.
cred
),
cred
,
sizeof
(
*
cred
));
#ifdef CODA_FS_OLD_API
memcpy
(
&
(
inp
->
ih
.
cred
),
&
cred
,
sizeof
(
cred
));
#else
inp
->
ih
.
uid
=
uid
;
#endif
inp
->
coda_close
.
VFid
=
*
fid
;
inp
->
coda_close
.
flags
=
flags
;
...
...
@@ -222,7 +242,7 @@ int venus_close(struct super_block *sb, struct ViceFid *fid, int flags,
return
error
;
}
int
venus_open
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
fid
,
int
venus_open
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
,
int
flags
,
struct
file
**
fh
)
{
union
inputArgs
*
inp
;
...
...
@@ -243,9 +263,9 @@ int venus_open(struct super_block *sb, struct ViceFid *fid,
return
error
;
}
int
venus_mkdir
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
dirfid
,
int
venus_mkdir
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
dirfid
,
const
char
*
name
,
int
length
,
struct
Vice
Fid
*
newfid
,
struct
coda_vattr
*
attrs
)
struct
Coda
Fid
*
newfid
,
struct
coda_vattr
*
attrs
)
{
union
inputArgs
*
inp
;
union
outputArgs
*
outp
;
...
...
@@ -273,8 +293,8 @@ int venus_mkdir(struct super_block *sb, struct ViceFid *dirfid,
}
int
venus_rename
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
old_fid
,
struct
Vice
Fid
*
new_fid
,
size_t
old_length
,
int
venus_rename
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
old_fid
,
struct
Coda
Fid
*
new_fid
,
size_t
old_length
,
size_t
new_length
,
const
char
*
old_name
,
const
char
*
new_name
)
{
...
...
@@ -310,9 +330,9 @@ int venus_rename(struct super_block *sb, struct ViceFid *old_fid,
return
error
;
}
int
venus_create
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
dirfid
,
int
venus_create
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
dirfid
,
const
char
*
name
,
int
length
,
int
excl
,
int
mode
,
dev_t
rdev
,
struct
Vice
Fid
*
newfid
,
struct
coda_vattr
*
attrs
)
struct
Coda
Fid
*
newfid
,
struct
coda_vattr
*
attrs
)
{
union
inputArgs
*
inp
;
union
outputArgs
*
outp
;
...
...
@@ -343,7 +363,7 @@ int venus_create(struct super_block *sb, struct ViceFid *dirfid,
return
error
;
}
int
venus_rmdir
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
dirfid
,
int
venus_rmdir
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
dirfid
,
const
char
*
name
,
int
length
)
{
union
inputArgs
*
inp
;
...
...
@@ -366,7 +386,7 @@ int venus_rmdir(struct super_block *sb, struct ViceFid *dirfid,
return
error
;
}
int
venus_remove
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
dirfid
,
int
venus_remove
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
dirfid
,
const
char
*
name
,
int
length
)
{
union
inputArgs
*
inp
;
...
...
@@ -388,7 +408,7 @@ int venus_remove(struct super_block *sb, struct ViceFid *dirfid,
return
error
;
}
int
venus_readlink
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
fid
,
int
venus_readlink
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
,
char
*
buffer
,
int
*
length
)
{
union
inputArgs
*
inp
;
...
...
@@ -421,8 +441,8 @@ int venus_readlink(struct super_block *sb, struct ViceFid *fid,
int
venus_link
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
fid
,
struct
Vice
Fid
*
dirfid
,
const
char
*
name
,
int
len
)
int
venus_link
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
,
struct
Coda
Fid
*
dirfid
,
const
char
*
name
,
int
len
)
{
union
inputArgs
*
inp
;
union
outputArgs
*
outp
;
...
...
@@ -447,7 +467,7 @@ int venus_link(struct super_block *sb, struct ViceFid *fid,
return
error
;
}
int
venus_symlink
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
fid
,
int
venus_symlink
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
,
const
char
*
name
,
int
len
,
const
char
*
symname
,
int
symlen
)
{
...
...
@@ -482,7 +502,7 @@ int venus_symlink(struct super_block *sb, struct ViceFid *fid,
return
error
;
}
int
venus_fsync
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
fid
)
int
venus_fsync
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
)
{
union
inputArgs
*
inp
;
union
outputArgs
*
outp
;
...
...
@@ -499,7 +519,7 @@ int venus_fsync(struct super_block *sb, struct ViceFid *fid)
return
error
;
}
int
venus_access
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
fid
,
int
mask
)
int
venus_access
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
,
int
mask
)
{
union
inputArgs
*
inp
;
union
outputArgs
*
outp
;
...
...
@@ -518,7 +538,7 @@ int venus_access(struct super_block *sb, struct ViceFid *fid, int mask)
}
int
venus_pioctl
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
fid
,
int
venus_pioctl
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
,
unsigned
int
cmd
,
struct
PioctlData
*
data
)
{
union
inputArgs
*
inp
;
...
...
@@ -808,7 +828,7 @@ static int coda_upcall(struct coda_sb_info *sbi,
* The last allows Venus to replace local fids with global ones
* during reintegration.
*
* CODA_REPLACE -- replace one
Vice
Fid with another throughout the name cache */
* CODA_REPLACE -- replace one
Coda
Fid with another throughout the name cache */
int
coda_downcall
(
int
opcode
,
union
outputArgs
*
out
,
struct
super_block
*
sb
)
{
...
...
@@ -819,25 +839,20 @@ int coda_downcall(int opcode, union outputArgs * out, struct super_block *sb)
switch
(
opcode
)
{
case
CODA_FLUSH
:
{
coda_cache_clear_all
(
sb
,
NULL
);
coda_cache_clear_all
(
sb
);
shrink_dcache_sb
(
sb
);
coda_flag_inode
(
sb
->
s_root
->
d_inode
,
C_FLUSH
);
return
(
0
);
}
case
CODA_PURGEUSER
:
{
struct
coda_cred
*
cred
=
&
out
->
coda_purgeuser
.
cred
;
if
(
!
cred
)
{
printk
(
"PURGEUSER: null cred!
\n
"
);
return
0
;
}
coda_cache_clear_all
(
sb
,
cred
);
coda_cache_clear_all
(
sb
);
return
(
0
);
}
case
CODA_ZAPDIR
:
{
struct
inode
*
inode
;
Vice
Fid
*
fid
=
&
out
->
coda_zapdir
.
CodaFid
;
struct
Coda
Fid
*
fid
=
&
out
->
coda_zapdir
.
CodaFid
;
inode
=
coda_fid_to_inode
(
fid
,
sb
);
if
(
inode
)
{
...
...
@@ -851,7 +866,7 @@ int coda_downcall(int opcode, union outputArgs * out, struct super_block *sb)
case
CODA_ZAPFILE
:
{
struct
inode
*
inode
;
struct
Vice
Fid
*
fid
=
&
out
->
coda_zapfile
.
CodaFid
;
struct
Coda
Fid
*
fid
=
&
out
->
coda_zapfile
.
CodaFid
;
inode
=
coda_fid_to_inode
(
fid
,
sb
);
if
(
inode
)
{
coda_flag_inode
(
inode
,
C_VATTR
);
...
...
@@ -862,7 +877,7 @@ int coda_downcall(int opcode, union outputArgs * out, struct super_block *sb)
case
CODA_PURGEFID
:
{
struct
inode
*
inode
;
Vice
Fid
*
fid
=
&
out
->
coda_purgefid
.
CodaFid
;
struct
Coda
Fid
*
fid
=
&
out
->
coda_purgefid
.
CodaFid
;
inode
=
coda_fid_to_inode
(
fid
,
sb
);
if
(
inode
)
{
coda_flag_inode_children
(
inode
,
C_PURGE
);
...
...
@@ -878,8 +893,8 @@ int coda_downcall(int opcode, union outputArgs * out, struct super_block *sb)
case
CODA_REPLACE
:
{
struct
inode
*
inode
;
Vice
Fid
*
oldfid
=
&
out
->
coda_replace
.
OldFid
;
Vice
Fid
*
newfid
=
&
out
->
coda_replace
.
NewFid
;
struct
Coda
Fid
*
oldfid
=
&
out
->
coda_replace
.
OldFid
;
struct
Coda
Fid
*
newfid
=
&
out
->
coda_replace
.
NewFid
;
inode
=
coda_fid_to_inode
(
oldfid
,
sb
);
if
(
inode
)
{
coda_replace_fid
(
inode
,
oldfid
,
newfid
);
...
...
fs/jfs/jfs_imap.c
View file @
9b45d209
...
...
@@ -3041,10 +3041,11 @@ static int copy_from_dinode(struct dinode * dip, struct inode *ip)
jfs_ip
->
next_index
=
le32_to_cpu
(
dip
->
di_next_index
);
jfs_ip
->
otime
=
le32_to_cpu
(
dip
->
di_otime
.
tv_sec
);
jfs_ip
->
acltype
=
le32_to_cpu
(
dip
->
di_acltype
);
jfs_ip
->
dev
=
le32_to_cpu
(
dip
->
di_rdev
);
if
(
S_ISCHR
(
ip
->
i_mode
)
||
S_ISBLK
(
ip
->
i_mode
))
if
(
S_ISCHR
(
ip
->
i_mode
)
||
S_ISBLK
(
ip
->
i_mode
))
{
jfs_ip
->
dev
=
le32_to_cpu
(
dip
->
di_rdev
);
ip
->
i_rdev
=
old_decode_dev
(
jfs_ip
->
dev
);
}
if
(
S_ISDIR
(
ip
->
i_mode
))
{
memcpy
(
&
jfs_ip
->
i_dirtable
,
&
dip
->
di_dirtable
,
384
);
...
...
@@ -3101,6 +3102,7 @@ static void copy_to_dinode(struct dinode * dip, struct inode *ip)
dip
->
di_otime
.
tv_sec
=
cpu_to_le32
(
jfs_ip
->
otime
);
dip
->
di_otime
.
tv_nsec
=
0
;
dip
->
di_acltype
=
cpu_to_le32
(
jfs_ip
->
acltype
);
if
(
S_ISCHR
(
ip
->
i_mode
)
||
S_ISBLK
(
ip
->
i_mode
))
dip
->
di_rdev
=
cpu_to_le32
(
jfs_ip
->
dev
);
}
...
...
include/asm-sparc64/bugs.h
View file @
9b45d209
...
...
@@ -4,4 +4,13 @@
* Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
*/
static
void
check_bugs
(
void
)
{
}
#include <linux/config.h>
extern
unsigned
long
loops_per_jiffy
;
static
void
check_bugs
(
void
)
{
#ifndef CONFIG_SMP
cpu_data
(
0
).
udelay_val
=
loops_per_jiffy
;
#endif
}
include/asm-sparc64/delay.h
View file @
9b45d209
...
...
@@ -13,12 +13,6 @@
#ifndef __ASSEMBLY__
#ifdef CONFIG_SMP
#include <asm/smp.h>
#else
extern
unsigned
long
loops_per_jiffy
;
#endif
static
__inline__
void
__delay
(
unsigned
long
loops
)
{
__asm__
__volatile__
(
...
...
include/linux/coda.h
View file @
9b45d209
...
...
@@ -59,7 +59,7 @@ Mellon the rights to redistribute these changes without encumbrance.
#ifndef _CODA_HEADER_
#define _CODA_HEADER_
#include <linux/config.h>
/* Catch new _KERNEL defn for NetBSD and DJGPP/__CYGWIN32__ */
#if defined(__NetBSD__) || \
...
...
@@ -163,10 +163,10 @@ typedef unsigned int u_int32_t;
#ifndef _VENUS_DIRENT_T_
#define _VENUS_DIRENT_T_ 1
struct
venus_dirent
{
u
nsigned
long
d_fileno
;
/* file number of entry */
u
nsigned
short
d_reclen
;
/* length of this record */
u
nsigned
char
d_type
;
/* file type, see below */
u
nsigned
char
d_namlen
;
/* length of string in d_name */
u
_int32_t
d_fileno
;
/* file number of entry */
u
_int16_t
d_reclen
;
/* length of this record */
u
_int8_t
d_type
;
/* file type, see below */
u
_int8_t
d_namlen
;
/* length of string in d_name */
char
d_name
[
CODA_MAXNAMLEN
+
1
];
/* name must be no longer than this */
};
#undef DIRSIZ
...
...
@@ -194,53 +194,41 @@ struct venus_dirent {
#endif
#ifndef _FID_T_
#define _FID_T_ 1
typedef
u_long
VolumeId
;
typedef
u_long
VnodeId
;
typedef
u_long
Unique_t
;
typedef
u_long
FileVersion
;
#endif
#ifndef _VICEFID_T_
#define _VICEFID_T_ 1
typedef
struct
ViceFid
{
VolumeId
Volume
;
VnodeId
Vnode
;
Unique_t
Unique
;
}
ViceFid
;
#endif
/* VICEFID */
#ifndef _VUID_T_
#define _VUID_T_
typedef
u_int32_t
vuid_t
;
typedef
u_int32_t
vgid_t
;
#endif
/*_VUID_T_ */
#ifdef CODA_FS_OLD_API
struct
CodaFid
{
u_int32_t
opaque
[
3
];
};
#ifdef __linux__
static
__inline__
ino_t
coda_f2i
(
struct
ViceFid
*
fid
)
static
__inline__
ino_t
coda_f2i
(
struct
CodaFid
*
fid
)
{
if
(
!
fid
)
return
0
;
if
(
fid
->
Vnode
==
0xfffffffe
||
fid
->
Vnode
==
0xffffffff
)
return
((
fid
->
Volume
<<
20
)
|
(
fid
->
Unique
&
0xfffff
));
if
(
fid
->
opaque
[
1
]
==
0xfffffffe
||
fid
->
opaque
[
1
]
==
0xffffffff
)
return
((
fid
->
opaque
[
0
]
<<
20
)
|
(
fid
->
opaque
[
2
]
&
0xfffff
));
else
return
(
fid
->
Unique
+
(
fid
->
Vnode
<<
10
)
+
(
fid
->
Volume
<<
20
));
return
(
fid
->
opaque
[
2
]
+
(
fid
->
opaque
[
1
]
<<
10
)
+
(
fid
->
opaque
[
0
]
<<
20
));
}
#else
#define coda_f2i(fid)\
((fid) ? ((fid)->Unique + ((fid)->Vnode<<10) + ((fid)->Volume<<20)) : 0)
#endif
#ifndef _VUID_T_
#define _VUID_T_
typedef
u_int32_t
vuid_t
;
typedef
u_int32_t
vgid_t
;
#endif
/*_VUID_T_ */
#ifndef _CODACRED_T_
#define _CODACRED_T_
struct
coda_cred
{
vuid_t
cr_uid
,
cr_euid
,
cr_suid
,
cr_fsuid
;
/* Real, efftve, set, fs uid*/
vgid_t
cr_groupid
,
cr_egid
,
cr_sgid
,
cr_fsgid
;
/* same for groups */
};
#else
/* not defined(CODA_FS_OLD_API) */
struct
CodaFid
{
u_int32_t
opaque
[
4
];
};
#define coda_f2i(fid)\
(fid ? (fid->opaque[3] ^ (fid->opaque[2]<<10) ^ (fid->opaque[1]<<20) ^ fid->opaque[0]) : 0)
#endif
#ifndef _VENUS_VATTR_T_
...
...
@@ -330,31 +318,41 @@ struct coda_statfs {
#define CODA_KERNEL_VERSION 0 /* don't care about kernel version number */
#define CODA_KERNEL_VERSION 1 /* The old venus 4.6 compatible interface */
#endif
#define CODA_KERNEL_VERSION 2
/* venus_lookup gets an extra parameter */
#ifdef CODA_FS_OLD_API
#define CODA_KERNEL_VERSION 2
/* venus_lookup got an extra parameter */
#else
#define CODA_KERNEL_VERSION 3
/* 128-bit file identifiers */
#endif
/*
* Venus <-> Coda RPC arguments
*/
struct
coda_in_hdr
{
unsigned
long
opcode
;
unsigned
long
unique
;
/* Keep multiple outstanding msgs distinct */
u_short
pid
;
/* Common to all */
u_short
pgid
;
/* Common to all */
u_short
sid
;
/* Common to all */
u_int32_t
opcode
;
u_int32_t
unique
;
/* Keep multiple outstanding msgs distinct */
#ifdef CODA_FS_OLD_API
u_int16_t
pid
;
/* Common to all */
u_int16_t
pgid
;
/* Common to all */
u_int16_t
sid
;
/* Common to all */
struct
coda_cred
cred
;
/* Common to all */
#else
pid_t
pid
;
pid_t
pgid
;
vuid_t
uid
;
#endif
};
/* Really important that opcode and unique are 1st two fields! */
struct
coda_out_hdr
{
u
nsigned
long
opcode
;
u
nsigned
long
unique
;
u
nsigned
long
result
;
u
_int32_t
opcode
;
u
_int32_t
unique
;
u
_int32_t
result
;
};
/* coda_root: NO_IN */
struct
coda_root_out
{
struct
coda_out_hdr
oh
;
Vice
Fid
VFid
;
struct
Coda
Fid
VFid
;
};
struct
coda_root_in
{
...
...
@@ -364,7 +362,7 @@ struct coda_root_in {
/* coda_open: */
struct
coda_open_in
{
struct
coda_in_hdr
ih
;
ViceFid
VFid
;
struct
CodaFid
VFid
;
int
flags
;
};
...
...
@@ -378,7 +376,7 @@ struct coda_open_out {
/* coda_store: */
struct
coda_store_in
{
struct
coda_in_hdr
ih
;
ViceFid
VFid
;
struct
CodaFid
VFid
;
int
flags
;
};
...
...
@@ -389,7 +387,7 @@ struct coda_store_out {
/* coda_release: */
struct
coda_release_in
{
struct
coda_in_hdr
ih
;
ViceFid
VFid
;
struct
CodaFid
VFid
;
int
flags
;
};
...
...
@@ -400,7 +398,7 @@ struct coda_release_out {
/* coda_close: */
struct
coda_close_in
{
struct
coda_in_hdr
ih
;
ViceFid
VFid
;
struct
CodaFid
VFid
;
int
flags
;
};
...
...
@@ -411,7 +409,7 @@ struct coda_close_out {
/* coda_ioctl: */
struct
coda_ioctl_in
{
struct
coda_in_hdr
ih
;
Vice
Fid
VFid
;
struct
Coda
Fid
VFid
;
int
cmd
;
int
len
;
int
rwflag
;
...
...
@@ -428,7 +426,7 @@ struct coda_ioctl_out {
/* coda_getattr: */
struct
coda_getattr_in
{
struct
coda_in_hdr
ih
;
Vice
Fid
VFid
;
struct
Coda
Fid
VFid
;
};
struct
coda_getattr_out
{
...
...
@@ -440,7 +438,7 @@ struct coda_getattr_out {
/* coda_setattr: NO_OUT */
struct
coda_setattr_in
{
struct
coda_in_hdr
ih
;
Vice
Fid
VFid
;
struct
Coda
Fid
VFid
;
struct
coda_vattr
attr
;
};
...
...
@@ -451,7 +449,7 @@ struct coda_setattr_out {
/* coda_access: NO_OUT */
struct
coda_access_in
{
struct
coda_in_hdr
ih
;
ViceFid
VFid
;
struct
CodaFid
VFid
;
int
flags
;
};
...
...
@@ -467,14 +465,14 @@ struct coda_access_out {
/* coda_lookup: */
struct
coda_lookup_in
{
struct
coda_in_hdr
ih
;
ViceFid
VFid
;
struct
CodaFid
VFid
;
int
name
;
/* Place holder for data. */
int
flags
;
};
struct
coda_lookup_out
{
struct
coda_out_hdr
oh
;
Vice
Fid
VFid
;
struct
Coda
Fid
VFid
;
int
vtype
;
};
...
...
@@ -482,7 +480,7 @@ struct coda_lookup_out {
/* coda_create: */
struct
coda_create_in
{
struct
coda_in_hdr
ih
;
Vice
Fid
VFid
;
struct
Coda
Fid
VFid
;
struct
coda_vattr
attr
;
int
excl
;
int
mode
;
...
...
@@ -491,7 +489,7 @@ struct coda_create_in {
struct
coda_create_out
{
struct
coda_out_hdr
oh
;
Vice
Fid
VFid
;
struct
Coda
Fid
VFid
;
struct
coda_vattr
attr
;
};
...
...
@@ -499,7 +497,7 @@ struct coda_create_out {
/* coda_remove: NO_OUT */
struct
coda_remove_in
{
struct
coda_in_hdr
ih
;
ViceFid
VFid
;
struct
CodaFid
VFid
;
int
name
;
/* Place holder for data. */
};
...
...
@@ -510,8 +508,8 @@ struct coda_remove_out {
/* coda_link: NO_OUT */
struct
coda_link_in
{
struct
coda_in_hdr
ih
;
ViceFid
sourceFid
;
/* cnode to link *to* */
ViceFid
destFid
;
/* Directory in which to place link */
struct
CodaFid
sourceFid
;
/* cnode to link *to* */
struct
CodaFid
destFid
;
/* Directory in which to place link */
int
tname
;
/* Place holder for data. */
};
...
...
@@ -523,9 +521,9 @@ struct coda_link_out {
/* coda_rename: NO_OUT */
struct
coda_rename_in
{
struct
coda_in_hdr
ih
;
ViceFid
sourceFid
;
struct
CodaFid
sourceFid
;
int
srcname
;
Vice
Fid
destFid
;
struct
Coda
Fid
destFid
;
int
destname
;
};
...
...
@@ -536,14 +534,14 @@ struct coda_rename_out {
/* coda_mkdir: */
struct
coda_mkdir_in
{
struct
coda_in_hdr
ih
;
ViceFid
VFid
;
struct
CodaFid
VFid
;
struct
coda_vattr
attr
;
int
name
;
/* Place holder for data. */
};
struct
coda_mkdir_out
{
struct
coda_out_hdr
oh
;
Vice
Fid
VFid
;
struct
Coda
Fid
VFid
;
struct
coda_vattr
attr
;
};
...
...
@@ -551,7 +549,7 @@ struct coda_mkdir_out {
/* coda_rmdir: NO_OUT */
struct
coda_rmdir_in
{
struct
coda_in_hdr
ih
;
ViceFid
VFid
;
struct
CodaFid
VFid
;
int
name
;
/* Place holder for data. */
};
...
...
@@ -562,7 +560,7 @@ struct coda_rmdir_out {
/* coda_symlink: NO_OUT */
struct
coda_symlink_in
{
struct
coda_in_hdr
ih
;
ViceFid
VFid
;
/* Directory to put symlink in */
struct
CodaFid
VFid
;
/* Directory to put symlink in */
int
srcname
;
struct
coda_vattr
attr
;
int
tname
;
...
...
@@ -575,7 +573,7 @@ struct coda_symlink_out {
/* coda_readlink: */
struct
coda_readlink_in
{
struct
coda_in_hdr
ih
;
Vice
Fid
VFid
;
struct
Coda
Fid
VFid
;
};
struct
coda_readlink_out
{
...
...
@@ -588,7 +586,7 @@ struct coda_readlink_out {
/* coda_fsync: NO_OUT */
struct
coda_fsync_in
{
struct
coda_in_hdr
ih
;
Vice
Fid
VFid
;
struct
Coda
Fid
VFid
;
};
struct
coda_fsync_out
{
...
...
@@ -598,12 +596,12 @@ struct coda_fsync_out {
/* coda_vget: */
struct
coda_vget_in
{
struct
coda_in_hdr
ih
;
Vice
Fid
VFid
;
struct
Coda
Fid
VFid
;
};
struct
coda_vget_out
{
struct
coda_out_hdr
oh
;
Vice
Fid
VFid
;
struct
Coda
Fid
VFid
;
int
vtype
;
};
...
...
@@ -616,50 +614,46 @@ struct coda_vget_out {
/* CODA_PURGEUSER is a venus->kernel call */
struct
coda_purgeuser_out
{
struct
coda_out_hdr
oh
;
#ifdef CODA_FS_OLD_API
struct
coda_cred
cred
;
#else
vuid_t
uid
;
#endif
};
/* coda_zapfile: */
/* CODA_ZAPFILE is a venus->kernel call */
struct
coda_zapfile_out
{
struct
coda_out_hdr
oh
;
Vice
Fid
CodaFid
;
struct
Coda
Fid
CodaFid
;
};
/* coda_zapdir: */
/* CODA_ZAPDIR is a venus->kernel call */
struct
coda_zapdir_out
{
struct
coda_out_hdr
oh
;
ViceFid
CodaFid
;
};
/* coda_zapnode: */
/* CODA_ZAPVNODE is a venus->kernel call */
struct
coda_zapvnode_out
{
struct
coda_out_hdr
oh
;
struct
coda_cred
cred
;
ViceFid
VFid
;
struct
CodaFid
CodaFid
;
};
/* coda_purgefid: */
/* CODA_PURGEFID is a venus->kernel call */
struct
coda_purgefid_out
{
struct
coda_out_hdr
oh
;
Vice
Fid
CodaFid
;
struct
Coda
Fid
CodaFid
;
};
/* coda_replace: */
/* CODA_REPLACE is a venus->kernel call */
struct
coda_replace_out
{
/* coda_replace is a venus->kernel call */
struct
coda_out_hdr
oh
;
Vice
Fid
NewFid
;
Vice
Fid
OldFid
;
struct
Coda
Fid
NewFid
;
struct
Coda
Fid
OldFid
;
};
/* coda_open_by_fd: */
struct
coda_open_by_fd_in
{
struct
coda_in_hdr
ih
;
ViceFid
VFid
;
struct
CodaFid
VFid
;
int
flags
;
};
...
...
@@ -675,7 +669,7 @@ struct coda_open_by_fd_out {
/* coda_open_by_path: */
struct
coda_open_by_path_in
{
struct
coda_in_hdr
ih
;
ViceFid
VFid
;
struct
CodaFid
VFid
;
int
flags
;
};
...
...
@@ -741,7 +735,6 @@ union outputArgs {
struct
coda_purgeuser_out
coda_purgeuser
;
struct
coda_zapfile_out
coda_zapfile
;
struct
coda_zapdir_out
coda_zapdir
;
struct
coda_zapvnode_out
coda_zapvnode
;
struct
coda_purgefid_out
coda_purgefid
;
struct
coda_replace_out
coda_replace
;
struct
coda_open_by_fd_out
coda_open_by_fd
;
...
...
@@ -755,7 +748,6 @@ union coda_downcalls {
struct
coda_purgeuser_out
purgeuser
;
struct
coda_zapfile_out
zapfile
;
struct
coda_zapdir_out
zapdir
;
struct
coda_zapvnode_out
zapvnode
;
struct
coda_purgefid_out
purgefid
;
struct
coda_replace_out
replace
;
};
...
...
@@ -780,16 +772,7 @@ struct PioctlData {
#define CODA_CONTROL ".CONTROL"
#define CODA_CONTROLLEN 8
#define CTL_VOL -1
#define CTL_VNO -1
#define CTL_UNI -1
#define CTL_INO -1
#define CTL_FILE "/coda/.CONTROL"
#define IS_CTL_FID(fidp) ((fidp)->Volume == CTL_VOL &&\
(fidp)->Vnode == CTL_VNO &&\
(fidp)->Unique == CTL_UNI)
/* Data passed to mount */
...
...
include/linux/coda_cache.h
View file @
9b45d209
...
...
@@ -13,7 +13,7 @@
/* credential cache */
void
coda_cache_enter
(
struct
inode
*
inode
,
int
mask
);
void
coda_cache_clear_inode
(
struct
inode
*
);
void
coda_cache_clear_all
(
struct
super_block
*
sb
,
struct
coda_cred
*
cred
);
void
coda_cache_clear_all
(
struct
super_block
*
sb
);
int
coda_cache_check
(
struct
inode
*
inode
,
int
mask
);
/* for downcalls and attributes and lookups */
...
...
include/linux/coda_fs_i.h
View file @
9b45d209
...
...
@@ -17,11 +17,12 @@
* coda fs inode data
*/
struct
coda_inode_info
{
struct
ViceFid
c_fid
;
/* Coda identifier */
struct
CodaFid
c_fid
;
/* Coda identifier */
u_short
c_flags
;
/* flags (see below) */
struct
list_head
c_cilist
;
/* list of all coda inodes */
unsigned
int
c_mapcount
;
/* nr of times this inode is mapped */
struct
coda_cred
c_cached_cred
;
/* credentials of cached perms */
unsigned
int
c_cached_epoch
;
/* epoch for cached permissions */
vuid_t
c_uid
;
/* fsuid for cached permissions */
unsigned
int
c_cached_perm
;
/* cached access permissions */
struct
inode
vfs_inode
;
};
...
...
@@ -34,7 +35,6 @@ struct coda_file_info {
int
cfi_magic
;
/* magic number */
struct
file
*
cfi_container
;
/* container file for this cnode */
unsigned
int
cfi_mapcount
;
/* nr of times this file is mapped */
struct
coda_cred
cfi_cred
;
/* credentials of opener */
};
#define CODA_FTOC(file) ((struct coda_file_info *)((file)->private_data))
...
...
@@ -45,11 +45,11 @@ struct coda_file_info {
#define C_DYING 0x4
/* from venus (which died) */
#define C_PURGE 0x8
int
coda_cnode_make
(
struct
inode
**
,
struct
Vice
Fid
*
,
struct
super_block
*
);
struct
inode
*
coda_iget
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
fid
,
struct
coda_vattr
*
attr
);
int
coda_cnode_make
(
struct
inode
**
,
struct
Coda
Fid
*
,
struct
super_block
*
);
struct
inode
*
coda_iget
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
,
struct
coda_vattr
*
attr
);
int
coda_cnode_makectl
(
struct
inode
**
inode
,
struct
super_block
*
sb
);
struct
inode
*
coda_fid_to_inode
(
Vice
Fid
*
fid
,
struct
super_block
*
sb
);
void
coda_replace_fid
(
struct
inode
*
,
ViceFid
*
,
Vice
Fid
*
);
struct
inode
*
coda_fid_to_inode
(
struct
Coda
Fid
*
fid
,
struct
super_block
*
sb
);
void
coda_replace_fid
(
struct
inode
*
,
struct
CodaFid
*
,
struct
Coda
Fid
*
);
#endif
#endif
include/linux/coda_linux.h
View file @
9b45d209
...
...
@@ -42,26 +42,21 @@ int coda_permission(struct inode *inode, int mask, struct nameidata *nd);
int
coda_revalidate_inode
(
struct
dentry
*
);
int
coda_getattr
(
struct
vfsmount
*
,
struct
dentry
*
,
struct
kstat
*
);
int
coda_setattr
(
struct
dentry
*
,
struct
iattr
*
);
int
coda_isnullfid
(
ViceFid
*
fid
);
/* global variables */
extern
int
coda_fake_statfs
;
/* this file: heloers */
static
__inline__
struct
Vice
Fid
*
coda_i2f
(
struct
inode
*
);
static
__inline__
struct
Coda
Fid
*
coda_i2f
(
struct
inode
*
);
static
__inline__
char
*
coda_i2s
(
struct
inode
*
);
static
__inline__
void
coda_flag_inode
(
struct
inode
*
,
int
flag
);
char
*
coda_f2s
(
Vice
Fid
*
f
);
char
*
coda_f2s
(
struct
Coda
Fid
*
f
);
int
coda_isroot
(
struct
inode
*
i
);
int
coda_iscontrol
(
const
char
*
name
,
size_t
length
);
void
coda_load_creds
(
struct
coda_cred
*
cred
);
void
coda_vattr_to_iattr
(
struct
inode
*
,
struct
coda_vattr
*
);
void
coda_iattr_to_vattr
(
struct
iattr
*
,
struct
coda_vattr
*
);
unsigned
short
coda_flags_to_cflags
(
unsigned
short
);
void
print_vattr
(
struct
coda_vattr
*
attr
);
int
coda_cred_ok
(
struct
coda_cred
*
cred
);
int
coda_cred_eq
(
struct
coda_cred
*
cred1
,
struct
coda_cred
*
cred2
);
/* sysctl.h */
void
coda_sysctl_init
(
void
);
...
...
@@ -88,7 +83,7 @@ static inline struct coda_inode_info *ITOC(struct inode *inode)
return
list_entry
(
inode
,
struct
coda_inode_info
,
vfs_inode
);
}
static
__inline__
struct
Vice
Fid
*
coda_i2f
(
struct
inode
*
inode
)
static
__inline__
struct
Coda
Fid
*
coda_i2f
(
struct
inode
*
inode
)
{
return
&
(
ITOC
(
inode
)
->
c_fid
);
}
...
...
include/linux/coda_psdev.h
View file @
9b45d209
...
...
@@ -6,13 +6,11 @@
#define CODA_SUPER_MAGIC 0x73757245
struct
statfs
;
struct
k
statfs
;
struct
coda_sb_info
{
struct
venus_comm
*
sbi_vcomm
;
struct
super_block
*
sbi_sb
;
struct
list_head
sbi_cihead
;
struct
venus_comm
*
sbi_vcomm
;
};
/* communication pending/processing queues */
...
...
@@ -33,46 +31,45 @@ static inline struct coda_sb_info *coda_sbp(struct super_block *sb)
/* upcalls */
int
venus_rootfid
(
struct
super_block
*
sb
,
Vice
Fid
*
fidp
);
int
venus_getattr
(
struct
super_block
*
sb
,
struct
ViceFid
*
fid
,
int
venus_rootfid
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fidp
);
int
venus_getattr
(
struct
super_block
*
sb
,
struct
CodaFid
*
fid
,
struct
coda_vattr
*
attr
);
int
venus_setattr
(
struct
super_block
*
,
struct
ViceFid
*
,
struct
coda_vattr
*
);
int
venus_lookup
(
struct
super_block
*
sb
,
struct
ViceFid
*
fid
,
int
venus_setattr
(
struct
super_block
*
,
struct
CodaFid
*
,
struct
coda_vattr
*
);
int
venus_lookup
(
struct
super_block
*
sb
,
struct
CodaFid
*
fid
,
const
char
*
name
,
int
length
,
int
*
type
,
struct
Vice
Fid
*
resfid
);
int
venus_store
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
fid
,
int
flags
,
struct
coda_cred
*
);
int
venus_release
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
fid
,
int
flags
);
int
venus_close
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
fid
,
int
flags
,
struct
coda_cred
*
);
int
venus_open
(
struct
super_block
*
sb
,
struct
ViceFid
*
fid
,
int
flags
,
struct
file
**
f
);
int
venus_mkdir
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
dirfid
,
struct
Coda
Fid
*
resfid
);
int
venus_store
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
,
int
flags
,
vuid_t
uid
);
int
venus_release
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
,
int
flags
);
int
venus_close
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
,
int
flags
,
vuid_t
uid
);
int
venus_open
(
struct
super_block
*
sb
,
struct
CodaFid
*
fid
,
int
flags
,
struct
file
**
f
);
int
venus_mkdir
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
dirfid
,
const
char
*
name
,
int
length
,
struct
Vice
Fid
*
newfid
,
struct
coda_vattr
*
attrs
);
int
venus_create
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
dirfid
,
struct
Coda
Fid
*
newfid
,
struct
coda_vattr
*
attrs
);
int
venus_create
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
dirfid
,
const
char
*
name
,
int
length
,
int
excl
,
int
mode
,
dev_t
rdev
,
struct
Vice
Fid
*
newfid
,
struct
coda_vattr
*
attrs
)
;
int
venus_rmdir
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
dirfid
,
struct
Coda
Fid
*
newfid
,
struct
coda_vattr
*
attrs
)
;
int
venus_rmdir
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
dirfid
,
const
char
*
name
,
int
length
);
int
venus_remove
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
dirfid
,
int
venus_remove
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
dirfid
,
const
char
*
name
,
int
length
);
int
venus_readlink
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
fid
,
int
venus_readlink
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
,
char
*
buffer
,
int
*
length
);
int
venus_rename
(
struct
super_block
*
,
struct
Vice
Fid
*
new_fid
,
struct
Vice
Fid
*
old_fid
,
size_t
old_length
,
int
venus_rename
(
struct
super_block
*
,
struct
Coda
Fid
*
new_fid
,
struct
Coda
Fid
*
old_fid
,
size_t
old_length
,
size_t
new_length
,
const
char
*
old_name
,
const
char
*
new_name
);
int
venus_link
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
fid
,
struct
Vice
Fid
*
dirfid
,
const
char
*
name
,
int
len
);
int
venus_symlink
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
fid
,
int
venus_link
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
,
struct
Coda
Fid
*
dirfid
,
const
char
*
name
,
int
len
);
int
venus_symlink
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
,
const
char
*
name
,
int
len
,
const
char
*
symname
,
int
symlen
);
int
venus_access
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
fid
,
int
mask
);
int
venus_pioctl
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
fid
,
int
venus_access
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
,
int
mask
);
int
venus_pioctl
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
,
unsigned
int
cmd
,
struct
PioctlData
*
data
);
int
coda_downcall
(
int
opcode
,
union
outputArgs
*
out
,
struct
super_block
*
sb
);
int
venus_fsync
(
struct
super_block
*
sb
,
struct
Vice
Fid
*
fid
);
int
venus_fsync
(
struct
super_block
*
sb
,
struct
Coda
Fid
*
fid
);
int
venus_statfs
(
struct
super_block
*
sb
,
struct
kstatfs
*
sfs
);
...
...
include/linux/ipv6.h
View file @
9b45d209
...
...
@@ -122,6 +122,52 @@ struct ipv6hdr {
struct
in6_addr
daddr
;
};
/*
* This structure contains configuration options per IPv6 link.
*/
struct
ipv6_devconf
{
__s32
forwarding
;
__s32
hop_limit
;
__s32
mtu6
;
__s32
accept_ra
;
__s32
accept_redirects
;
__s32
autoconf
;
__s32
dad_transmits
;
__s32
rtr_solicits
;
__s32
rtr_solicit_interval
;
__s32
rtr_solicit_delay
;
#ifdef CONFIG_IPV6_PRIVACY
__s32
use_tempaddr
;
__s32
temp_valid_lft
;
__s32
temp_prefered_lft
;
__s32
regen_max_retry
;
__s32
max_desync_factor
;
#endif
void
*
sysctl
;
};
/* index values for the variables in ipv6_devconf */
enum
{
DEVCONF_FORWARDING
=
0
,
DEVCONF_HOPLIMIT
,
DEVCONF_MTU6
,
DEVCONF_ACCEPT_RA
,
DEVCONF_ACCEPT_REDIRECTS
,
DEVCONF_AUTOCONF
,
DEVCONF_DAD_TRANSMITS
,
DEVCONF_RTR_SOLICITS
,
DEVCONF_RTR_SOLICIT_INTERVAL
,
DEVCONF_RTR_SOLICIT_DELAY
,
#ifdef CONFIG_IPV6_PRIVACY
DEVCONF_USE_TEMPADDR
,
DEVCONF_TEMP_VALID_LFT
,
DEVCONF_TEMP_PREFERED_LFT
,
DEVCONF_REGEN_MAX_RETRY
,
DEVCONF_MAX_DESYNC_FACTOR
,
#endif
DEVCONF_MAX
};
#ifdef __KERNEL__
#include <linux/in6.h>
/* struct sockaddr_in6 */
#include <linux/icmpv6.h>
...
...
include/linux/netdevice.h
View file @
9b45d209
...
...
@@ -28,8 +28,6 @@
#include <linux/if.h>
#include <linux/if_ether.h>
#include <linux/if_packet.h>
#include <linux/device.h>
#include <linux/percpu.h>
#include <asm/atomic.h>
#include <asm/cache.h>
...
...
@@ -37,6 +35,8 @@
#ifdef __KERNEL__
#include <linux/config.h>
#include <linux/device.h>
#include <linux/percpu.h>
struct
divert_blk
;
struct
vlan_group
;
...
...
include/linux/proc_fs.h
View file @
9b45d209
...
...
@@ -185,9 +185,10 @@ static inline void proc_net_remove(const char *name)
#else
#define proc_root_driver NULL
#define proc_net_fops_create(name,mode,fops) do {} while(0)
static
inline
struct
proc_dir_entry
*
proc_net_create
(
const
char
*
name
,
mode_t
mode
,
get_info_t
*
get_info
)
{
return
NULL
;}
#define proc_net NULL
#define proc_net_fops_create(name, mode, fops) ({ (void)(mode), NULL; })
#define proc_net_create(name, mode, info) ({ (void)(mode), NULL; })
static
inline
void
proc_net_remove
(
const
char
*
name
)
{}
static
inline
struct
dentry
*
proc_pid_unhash
(
struct
task_struct
*
p
)
{
return
NULL
;
}
...
...
include/linux/rtnetlink.h
View file @
9b45d209
...
...
@@ -508,10 +508,12 @@ enum
#define IFLA_MASTER IFLA_MASTER
IFLA_WIRELESS
,
/* Wireless Extension event - see wireless.h */
#define IFLA_WIRELESS IFLA_WIRELESS
IFLA_PROTINFO
,
/* Protocol specific information for a link */
#define IFLA_PROTINFO IFLA_PROTINFO
};
#define IFLA_MAX IFLA_
WIRELESS
#define IFLA_MAX IFLA_
PROTINFO
#define IFLA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg))))
#define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg))
...
...
@@ -545,6 +547,18 @@ enum
for IPIP tunnels, when route to endpoint is allowed to change)
*/
/* Subtype attributes for IFLA_PROTINFO */
enum
{
IFLA_INET6_UNSPEC
,
IFLA_INET6_FLAGS
,
/* link flags */
IFLA_INET6_CONF
,
/* sysctl parameters */
IFLA_INET6_STATS
,
/* statistics */
IFLA_INET6_MCAST
,
/* MC things. What of them? */
};
#define IFLA_INET6_MAX IFLA_INET6_MCAST
/*****************************************************************
* Traffic control messages.
****/
...
...
include/net/bluetooth/bluetooth.h
View file @
9b45d209
...
...
@@ -131,7 +131,7 @@ void bt_sock_link(struct bt_sock_list *l, struct sock *s);
void
bt_sock_unlink
(
struct
bt_sock_list
*
l
,
struct
sock
*
s
);
int
bt_sock_recvmsg
(
struct
kiocb
*
iocb
,
struct
socket
*
sock
,
struct
msghdr
*
msg
,
int
len
,
int
flags
);
uint
bt_sock_poll
(
struct
file
*
file
,
struct
socket
*
sock
,
poll_table
*
wait
);
int
bt_sock_w
4_connect
(
struct
sock
*
sk
,
int
flags
);
int
bt_sock_w
ait_state
(
struct
sock
*
sk
,
int
state
,
unsigned
long
timeo
);
void
bt_accept_enqueue
(
struct
sock
*
parent
,
struct
sock
*
sk
);
struct
sock
*
bt_accept_dequeue
(
struct
sock
*
parent
,
struct
socket
*
newsock
);
...
...
include/net/bluetooth/hci.h
View file @
9b45d209
...
...
@@ -304,6 +304,8 @@ struct hci_cp_inquiry {
__u8
num_rsp
;
}
__attribute__
((
packed
));
#define OCF_INQUIRY_CANCEL 0x0002
#define OCF_LINK_KEY_REPLY 0x000B
#define OCF_LINK_KEY_NEG_REPLY 0x000C
struct
hci_cp_link_key_reply
{
...
...
include/net/bluetooth/l2cap.h
View file @
9b45d209
...
...
@@ -220,6 +220,7 @@ struct l2cap_pinfo {
__u32
link_mode
;
__u8
conf_state
;
__u8
conf_retry
;
__u16
conf_mtu
;
__u8
ident
;
...
...
@@ -234,6 +235,7 @@ struct l2cap_pinfo {
#define L2CAP_CONF_REQ_SENT 0x01
#define L2CAP_CONF_INPUT_DONE 0x02
#define L2CAP_CONF_OUTPUT_DONE 0x04
#define L2CAP_CONF_MAX_RETRIES 2
void
l2cap_load
(
void
);
...
...
include/net/if_inet6.h
View file @
9b45d209
...
...
@@ -16,7 +16,12 @@
#define _NET_IF_INET6_H
#include <net/snmp.h>
#include <linux/ipv6.h>
/* inet6_dev.if_flags */
#define IF_RA_OTHERCONF 0x80
#define IF_RA_MANAGED 0x40
#define IF_RA_RCVD 0x20
#define IF_RS_SENT 0x10
...
...
@@ -132,28 +137,6 @@ struct ifacaddr6
#define IFA_SITE IPV6_ADDR_SITELOCAL
#define IFA_GLOBAL 0x0000U
struct
ipv6_devconf
{
int
forwarding
;
int
hop_limit
;
int
mtu6
;
int
accept_ra
;
int
accept_redirects
;
int
autoconf
;
int
dad_transmits
;
int
rtr_solicits
;
int
rtr_solicit_interval
;
int
rtr_solicit_delay
;
#ifdef CONFIG_IPV6_PRIVACY
int
use_tempaddr
;
int
temp_valid_lft
;
int
temp_prefered_lft
;
int
regen_max_retry
;
int
max_desync_factor
;
#endif
void
*
sysctl
;
};
struct
ipv6_devstat
{
struct
proc_dir_entry
*
proc_dir_entry
;
DEFINE_SNMP_STAT
(
struct
icmpv6_mib
,
icmpv6
);
...
...
net/bluetooth/af_bluetooth.c
View file @
9b45d209
...
...
@@ -27,7 +27,7 @@
*
* $Id: af_bluetooth.c,v 1.3 2002/04/17 17:37:15 maxk Exp $
*/
#define VERSION "2.
2
"
#define VERSION "2.
3
"
#include <linux/config.h>
#include <linux/module.h>
...
...
@@ -272,39 +272,35 @@ unsigned int bt_sock_poll(struct file * file, struct socket *sock, poll_table *w
return
mask
;
}
int
bt_sock_w
4_connect
(
struct
sock
*
sk
,
int
flags
)
int
bt_sock_w
ait_state
(
struct
sock
*
sk
,
int
state
,
unsigned
long
timeo
)
{
DECLARE_WAITQUEUE
(
wait
,
current
);
long
timeo
=
sock_sndtimeo
(
sk
,
flags
&
O_NONBLOCK
);
int
err
=
0
;
BT_DBG
(
"sk %p"
,
sk
);
add_wait_queue
(
sk
->
sk_sleep
,
&
wait
);
while
(
sk
->
sk_state
!=
BT_CONNECTED
)
{
while
(
sk
->
sk_state
!=
state
)
{
set_current_state
(
TASK_INTERRUPTIBLE
);
if
(
!
timeo
)
{
err
=
-
EAGAIN
;
break
;
}
if
(
signal_pending
(
current
))
{
err
=
sock_intr_errno
(
timeo
);
break
;
}
release_sock
(
sk
);
timeo
=
schedule_timeout
(
timeo
);
lock_sock
(
sk
);
err
=
0
;
if
(
sk
->
sk_state
==
BT_CONNECTED
)
break
;
if
(
sk
->
sk_err
)
{
err
=
sock_error
(
sk
);
break
;
}
if
(
signal_pending
(
current
))
{
err
=
sock_intr_errno
(
timeo
);
break
;
}
}
set_current_state
(
TASK_RUNNING
);
remove_wait_queue
(
sk
->
sk_sleep
,
&
wait
);
...
...
net/bluetooth/bnep/bnep.h
View file @
9b45d209
...
...
@@ -168,11 +168,11 @@ struct bnep_session {
u64
mc_filter
;
struct
socket
*
sock
;
struct
net_device
dev
;
struct
net_device
*
dev
;
struct
net_device_stats
stats
;
};
int
bnep_net_init
(
struct
net_device
*
dev
);
void
bnep_net_setup
(
struct
net_device
*
dev
);
int
bnep_sock_init
(
void
);
int
bnep_sock_cleanup
(
void
);
...
...
net/bluetooth/bnep/core.c
View file @
9b45d209
...
...
@@ -180,7 +180,7 @@ static int bnep_ctrl_set_mcfilter(struct bnep_session *s, u8 *data, int len)
s
->
mc_filter
=
0
;
/* Always send broadcast */
set_bit
(
bnep_mc_hash
(
s
->
dev
.
broadcast
),
(
ulong
*
)
&
s
->
mc_filter
);
set_bit
(
bnep_mc_hash
(
s
->
dev
->
broadcast
),
(
ulong
*
)
&
s
->
mc_filter
);
/* Add address ranges to the multicast hash */
for
(;
n
>
0
;
n
--
)
{
...
...
@@ -293,7 +293,7 @@ static u8 __bnep_rx_hlen[] = {
static
inline
int
bnep_rx_frame
(
struct
bnep_session
*
s
,
struct
sk_buff
*
skb
)
{
struct
net_device
*
dev
=
&
s
->
dev
;
struct
net_device
*
dev
=
s
->
dev
;
struct
sk_buff
*
nskb
;
u8
type
;
...
...
@@ -451,7 +451,7 @@ static inline int bnep_tx_frame(struct bnep_session *s, struct sk_buff *skb)
static
int
bnep_session
(
void
*
arg
)
{
struct
bnep_session
*
s
=
arg
;
struct
net_device
*
dev
=
&
s
->
dev
;
struct
net_device
*
dev
=
s
->
dev
;
struct
sock
*
sk
=
s
->
sock
->
sk
;
struct
sk_buff
*
skb
;
wait_queue_t
wait
;
...
...
@@ -501,7 +501,7 @@ static int bnep_session(void *arg)
__bnep_unlink_session
(
s
);
up_write
(
&
bnep_session_sem
);
kfree
(
s
);
kfree
(
dev
);
return
0
;
}
...
...
@@ -517,10 +517,13 @@ int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock)
baswap
((
void
*
)
dst
,
&
bt_sk
(
sock
->
sk
)
->
dst
);
baswap
((
void
*
)
src
,
&
bt_sk
(
sock
->
sk
)
->
src
);
s
=
kmalloc
(
sizeof
(
struct
bnep_session
),
GFP_KERNEL
);
if
(
!
s
)
return
-
ENOMEM
;
memset
(
s
,
0
,
sizeof
(
struct
bnep_session
));
/* session struct allocated as private part of net_device */
dev
=
alloc_netdev
(
sizeof
(
struct
bnep_session
),
(
*
req
->
device
)
?
req
->
device
:
"bnep%d"
,
bnep_net_setup
);
if
(
!
dev
)
return
ENOMEM
;
down_write
(
&
bnep_session_sem
);
...
...
@@ -530,20 +533,15 @@ int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock)
goto
failed
;
}
dev
=
&
s
->
dev
;
if
(
*
req
->
device
)
strcpy
(
dev
->
name
,
req
->
device
);
else
strcpy
(
dev
->
name
,
"bnep%d"
);
memset
(
dev
->
broadcast
,
0xff
,
ETH_ALEN
);
s
=
dev
->
priv
;
/* This is rx header therefore addresses are swapped.
* ie eh.h_dest is our local address. */
memcpy
(
s
->
eh
.
h_dest
,
&
src
,
ETH_ALEN
);
memcpy
(
s
->
eh
.
h_source
,
&
dst
,
ETH_ALEN
);
memcpy
(
dev
->
dev_addr
,
s
->
eh
.
h_dest
,
ETH_ALEN
);
s
->
dev
=
dev
;
s
->
sock
=
sock
;
s
->
role
=
req
->
role
;
s
->
state
=
BT_CONNECTED
;
...
...
@@ -569,8 +567,6 @@ int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock)
s
->
proto_filter
[
2
].
end
=
htons
(
0x86DD
);
#endif
dev
->
init
=
bnep_net_init
;
dev
->
priv
=
s
;
err
=
register_netdev
(
dev
);
if
(
err
)
{
goto
failed
;
...
...
@@ -592,7 +588,7 @@ int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock)
failed:
up_write
(
&
bnep_session_sem
);
kfree
(
s
);
kfree
(
dev
);
return
err
;
}
...
...
@@ -624,7 +620,7 @@ int bnep_del_connection(struct bnep_conndel_req *req)
static
void
__bnep_copy_ci
(
struct
bnep_conninfo
*
ci
,
struct
bnep_session
*
s
)
{
memcpy
(
ci
->
dst
,
s
->
eh
.
h_source
,
ETH_ALEN
);
strcpy
(
ci
->
device
,
s
->
dev
.
name
);
strcpy
(
ci
->
device
,
s
->
dev
->
name
);
ci
->
flags
=
s
->
flags
;
ci
->
state
=
s
->
state
;
ci
->
role
=
s
->
role
;
...
...
net/bluetooth/bnep/netdev.c
View file @
9b45d209
...
...
@@ -226,11 +226,10 @@ static int bnep_net_xmit(struct sk_buff *skb, struct net_device *dev)
return
0
;
}
int
bnep_net_init
(
struct
net_device
*
dev
)
void
bnep_net_setup
(
struct
net_device
*
dev
)
{
struct
bnep_session
*
s
=
dev
->
priv
;
mem
cpy
(
dev
->
dev_addr
,
s
->
eh
.
h_dest
,
ETH_ALEN
);
mem
set
(
dev
->
broadcast
,
0xff
,
ETH_ALEN
);
dev
->
addr_len
=
ETH_ALEN
;
ether_setup
(
dev
);
...
...
@@ -245,6 +244,4 @@ int bnep_net_init(struct net_device *dev)
dev
->
watchdog_timeo
=
HZ
*
2
;
dev
->
tx_timeout
=
bnep_net_timeout
;
return
0
;
}
net/bluetooth/hci_core.c
View file @
9b45d209
...
...
@@ -394,7 +394,7 @@ int hci_inquiry(unsigned long arg)
{
struct
hci_inquiry_req
ir
;
struct
hci_dev
*
hdev
;
int
err
=
0
,
do_inquiry
=
0
;
int
err
=
0
,
do_inquiry
=
0
,
max_rsp
;
long
timeo
;
__u8
*
buf
,
*
ptr
;
...
...
@@ -417,16 +417,19 @@ int hci_inquiry(unsigned long arg)
if
(
do_inquiry
&&
(
err
=
hci_request
(
hdev
,
hci_inq_req
,
(
unsigned
long
)
&
ir
,
timeo
))
<
0
)
goto
done
;
/* for unlimited number of responses we will use buffer with 255 entries */
max_rsp
=
(
ir
.
num_rsp
==
0
)
?
255
:
ir
.
num_rsp
;
/* cache_dump can't sleep. Therefore we allocate temp buffer and then
* copy it to the user space.
*/
if
(
!
(
buf
=
kmalloc
(
sizeof
(
struct
inquiry_info
)
*
ir
.
num
_rsp
,
GFP_KERNEL
)))
{
if
(
!
(
buf
=
kmalloc
(
sizeof
(
struct
inquiry_info
)
*
max
_rsp
,
GFP_KERNEL
)))
{
err
=
-
ENOMEM
;
goto
done
;
}
hci_dev_lock_bh
(
hdev
);
ir
.
num_rsp
=
inquiry_cache_dump
(
hdev
,
ir
.
num
_rsp
,
buf
);
ir
.
num_rsp
=
inquiry_cache_dump
(
hdev
,
max
_rsp
,
buf
);
hci_dev_unlock_bh
(
hdev
);
BT_DBG
(
"num_rsp %d"
,
ir
.
num_rsp
);
...
...
net/bluetooth/hci_event.c
View file @
9b45d209
...
...
@@ -62,9 +62,22 @@
/* Command Complete OGF LINK_CTL */
static
void
hci_cc_link_ctl
(
struct
hci_dev
*
hdev
,
__u16
ocf
,
struct
sk_buff
*
skb
)
{
__u8
status
;
BT_DBG
(
"%s ocf 0x%x"
,
hdev
->
name
,
ocf
);
switch
(
ocf
)
{
case
OCF_INQUIRY_CANCEL
:
status
=
*
((
__u8
*
)
skb
->
data
);
if
(
status
)
{
BT_DBG
(
"%s Inquiry cancel error: status 0x%x"
,
hdev
->
name
,
status
);
}
else
{
clear_bit
(
HCI_INQUIRY
,
&
hdev
->
flags
);
hci_req_complete
(
hdev
,
status
);
}
break
;
default:
BT_DBG
(
"%s Command complete: ogf LINK_CTL ocf %x"
,
hdev
->
name
,
ocf
);
break
;
...
...
net/bluetooth/hci_sock.c
View file @
9b45d209
...
...
@@ -75,7 +75,7 @@ static struct hci_sec_filter hci_sec_filter = {
/* OGF_LINK_POLICY */
{
0x1200
,
0x0
,
0x0
,
0x0
},
/* OGF_HOST_CTL */
{
0x80100000
,
0x2a
,
0x0
,
0x0
},
{
0x80100000
,
0x2
02
a
,
0x0
,
0x0
},
/* OGF_INFO_PARAM */
{
0x22a
,
0x0
,
0x0
,
0x0
},
/* OGF_STATUS_PARAM */
...
...
net/bluetooth/l2cap.c
View file @
9b45d209
...
...
@@ -289,7 +289,7 @@ static void __l2cap_sock_close(struct sock *sk, int reason)
struct
l2cap_disconn_req
req
;
sk
->
sk_state
=
BT_DISCONN
;
l2cap_sock_set_timer
(
sk
,
HZ
*
5
);
l2cap_sock_set_timer
(
sk
,
sk
->
sk_sndtimeo
);
req
.
dcid
=
__cpu_to_le16
(
l2cap_pi
(
sk
)
->
dcid
);
req
.
scid
=
__cpu_to_le16
(
l2cap_pi
(
sk
)
->
scid
);
...
...
@@ -314,11 +314,9 @@ static void __l2cap_sock_close(struct sock *sk, int reason)
static
void
l2cap_sock_close
(
struct
sock
*
sk
)
{
l2cap_sock_clear_timer
(
sk
);
lock_sock
(
sk
);
__l2cap_sock_close
(
sk
,
ECONNRESET
);
release_sock
(
sk
);
l2cap_sock_kill
(
sk
);
}
...
...
@@ -530,8 +528,8 @@ static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int al
goto
done
;
wait:
err
=
bt_sock_w
4_connect
(
sk
,
flags
);
err
=
bt_sock_w
ait_state
(
sk
,
BT_CONNECTED
,
sock_sndtimeo
(
sk
,
flags
&
O_NONBLOCK
));
done:
release_sock
(
sk
);
return
err
;
...
...
@@ -831,32 +829,39 @@ static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, ch
static
int
l2cap_sock_shutdown
(
struct
socket
*
sock
,
int
how
)
{
struct
sock
*
sk
=
sock
->
sk
;
int
err
=
0
;
BT_DBG
(
"sock %p, sk %p"
,
sock
,
sk
);
if
(
!
sk
)
return
0
;
l2cap_sock_clear_timer
(
sk
);
lock_sock
(
sk
);
if
(
!
sk
->
sk_shutdown
)
{
sk
->
sk_shutdown
=
SHUTDOWN_MASK
;
__l2cap_sock_close
(
sk
,
ECONNRESET
);
release_sock
(
sk
);
l2cap_sock_clear_timer
(
sk
);
__l2cap_sock_close
(
sk
,
0
);
return
0
;
if
(
sock_flag
(
sk
,
SOCK_LINGER
)
&&
sk
->
sk_lingertime
)
err
=
bt_sock_wait_state
(
sk
,
BT_CLOSED
,
sk
->
sk_lingertime
);
}
release_sock
(
sk
);
return
err
;
}
static
int
l2cap_sock_release
(
struct
socket
*
sock
)
{
struct
sock
*
sk
=
sock
->
sk
;
int
err
;
BT_DBG
(
"sock %p, sk %p"
,
sock
,
sk
);
if
(
!
sk
)
return
0
;
err
=
l2cap_sock_shutdown
(
sock
,
2
);
sock_orphan
(
sk
);
l2cap_sock_
close
(
sk
);
return
0
;
l2cap_sock_
kill
(
sk
);
return
err
;
}
/* ---- L2CAP channels ---- */
...
...
@@ -981,9 +986,11 @@ static void l2cap_chan_del(struct sock *sk, int err)
}
sk
->
sk_state
=
BT_CLOSED
;
sk
->
sk_err
=
err
;
sk
->
sk_zapped
=
1
;
if
(
err
)
sk
->
sk_err
=
err
;
if
(
parent
)
parent
->
sk_data_ready
(
parent
,
0
);
else
...
...
@@ -1518,18 +1525,35 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr
if
(
!
(
sk
=
l2cap_get_chan_by_scid
(
&
conn
->
chan_list
,
scid
)))
return
-
ENOENT
;
if
(
result
)
{
struct
l2cap_disconn_req
req
;
switch
(
result
)
{
case
L2CAP_CONF_SUCCESS
:
break
;
/* They didn't like our options. Well... we do not negotiate.
* Close channel.
case
L2CAP_CONF_UNACCEPT
:
if
(
++
l2cap_pi
(
sk
)
->
conf_retry
<
L2CAP_CONF_MAX_RETRIES
)
{
char
req
[
128
];
/*
It does not make sense to adjust L2CAP parameters
that are currently defined in the spec. We simply
resend config request that we sent earlier. It is
stupid :) but it helps qualification testing
which expects at least some response from us.
*/
l2cap_send_req
(
conn
,
L2CAP_CONF_REQ
,
l2cap_build_conf_req
(
sk
,
req
),
req
);
goto
done
;
}
default:
sk
->
sk_state
=
BT_DISCONN
;
sk
->
sk_err
=
ECONNRESET
;
l2cap_sock_set_timer
(
sk
,
HZ
*
5
);
{
struct
l2cap_disconn_req
req
;
req
.
dcid
=
__cpu_to_le16
(
l2cap_pi
(
sk
)
->
dcid
);
req
.
scid
=
__cpu_to_le16
(
l2cap_pi
(
sk
)
->
scid
);
l2cap_send_req
(
conn
,
L2CAP_DISCONN_REQ
,
sizeof
(
req
),
&
req
);
}
goto
done
;
}
...
...
@@ -1590,7 +1614,7 @@ static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn, struct l2cap_cmd
if
(
!
(
sk
=
l2cap_get_chan_by_scid
(
&
conn
->
chan_list
,
scid
)))
return
0
;
l2cap_chan_del
(
sk
,
ECONNABORTED
);
l2cap_chan_del
(
sk
,
0
);
bh_unlock_sock
(
sk
);
l2cap_sock_kill
(
sk
);
...
...
net/bluetooth/rfcomm/core.c
View file @
9b45d209
...
...
@@ -280,13 +280,13 @@ static struct rfcomm_dlc *rfcomm_dlc_get(struct rfcomm_session *s, u8 dlci)
static
int
__rfcomm_dlc_open
(
struct
rfcomm_dlc
*
d
,
bdaddr_t
*
src
,
bdaddr_t
*
dst
,
u8
channel
)
{
struct
rfcomm_session
*
s
;
u8
dlci
=
__dlci
(
0
,
channel
);
int
err
=
0
;
u8
dlci
;
BT_DBG
(
"dlc %p state %ld %s %s channel %d
dlci %d
"
,
d
,
d
->
state
,
batostr
(
src
),
batostr
(
dst
),
channel
,
dlci
);
BT_DBG
(
"dlc %p state %ld %s %s channel %d"
,
d
,
d
->
state
,
batostr
(
src
),
batostr
(
dst
),
channel
);
if
(
dlci
<
1
||
dlci
>
62
)
if
(
channel
<
1
||
channel
>
30
)
return
-
EINVAL
;
if
(
d
->
state
!=
BT_OPEN
&&
d
->
state
!=
BT_CLOSED
)
...
...
@@ -299,6 +299,8 @@ static int __rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst,
return
err
;
}
dlci
=
__dlci
(
!
s
->
initiator
,
channel
);
/* Check if DLCI already exists */
if
(
rfcomm_dlc_get
(
s
,
dlci
))
return
-
EBUSY
;
...
...
@@ -715,7 +717,7 @@ static int rfcomm_send_nsc(struct rfcomm_session *s, int cr, u8 type)
hdr
->
len
=
__len8
(
sizeof
(
*
mcc
)
+
1
);
mcc
=
(
void
*
)
ptr
;
ptr
+=
sizeof
(
*
mcc
);
mcc
->
type
=
__mcc_type
(
s
->
initiato
r
,
RFCOMM_NSC
);
mcc
->
type
=
__mcc_type
(
c
r
,
RFCOMM_NSC
);
mcc
->
len
=
__len8
(
1
);
/* Type that we didn't like */
...
...
@@ -741,7 +743,7 @@ static int rfcomm_send_pn(struct rfcomm_session *s, int cr, struct rfcomm_dlc *d
hdr
->
len
=
__len8
(
sizeof
(
*
mcc
)
+
sizeof
(
*
pn
));
mcc
=
(
void
*
)
ptr
;
ptr
+=
sizeof
(
*
mcc
);
mcc
->
type
=
__mcc_type
(
s
->
initiato
r
,
RFCOMM_PN
);
mcc
->
type
=
__mcc_type
(
c
r
,
RFCOMM_PN
);
mcc
->
len
=
__len8
(
sizeof
(
*
pn
));
pn
=
(
void
*
)
ptr
;
ptr
+=
sizeof
(
*
pn
);
...
...
@@ -850,7 +852,51 @@ static int rfcomm_send_msc(struct rfcomm_session *s, int cr, u8 dlci, u8 v24_sig
msc
=
(
void
*
)
ptr
;
ptr
+=
sizeof
(
*
msc
);
msc
->
dlci
=
__addr
(
1
,
dlci
);
msc
->
v24_sig
=
v24_sig
;
msc
->
v24_sig
=
v24_sig
|
0x01
;
*
ptr
=
__fcs
(
buf
);
ptr
++
;
return
rfcomm_send_frame
(
s
,
buf
,
ptr
-
buf
);
}
static
int
rfcomm_send_fcoff
(
struct
rfcomm_session
*
s
,
int
cr
)
{
struct
rfcomm_hdr
*
hdr
;
struct
rfcomm_mcc
*
mcc
;
u8
buf
[
16
],
*
ptr
=
buf
;
BT_DBG
(
"%p cr %d"
,
s
,
cr
);
hdr
=
(
void
*
)
ptr
;
ptr
+=
sizeof
(
*
hdr
);
hdr
->
addr
=
__addr
(
s
->
initiator
,
0
);
hdr
->
ctrl
=
__ctrl
(
RFCOMM_UIH
,
0
);
hdr
->
len
=
__len8
(
sizeof
(
*
mcc
));
mcc
=
(
void
*
)
ptr
;
ptr
+=
sizeof
(
*
mcc
);
mcc
->
type
=
__mcc_type
(
cr
,
RFCOMM_FCOFF
);
mcc
->
len
=
__len8
(
0
);
*
ptr
=
__fcs
(
buf
);
ptr
++
;
return
rfcomm_send_frame
(
s
,
buf
,
ptr
-
buf
);
}
static
int
rfcomm_send_fcon
(
struct
rfcomm_session
*
s
,
int
cr
)
{
struct
rfcomm_hdr
*
hdr
;
struct
rfcomm_mcc
*
mcc
;
u8
buf
[
16
],
*
ptr
=
buf
;
BT_DBG
(
"%p cr %d"
,
s
,
cr
);
hdr
=
(
void
*
)
ptr
;
ptr
+=
sizeof
(
*
hdr
);
hdr
->
addr
=
__addr
(
s
->
initiator
,
0
);
hdr
->
ctrl
=
__ctrl
(
RFCOMM_UIH
,
0
);
hdr
->
len
=
__len8
(
sizeof
(
*
mcc
));
mcc
=
(
void
*
)
ptr
;
ptr
+=
sizeof
(
*
mcc
);
mcc
->
type
=
__mcc_type
(
cr
,
RFCOMM_FCON
);
mcc
->
len
=
__len8
(
0
);
*
ptr
=
__fcs
(
buf
);
ptr
++
;
...
...
@@ -1085,6 +1131,8 @@ static int rfcomm_recv_sabm(struct rfcomm_session *s, u8 dlci)
d
->
state
=
BT_CONNECTED
;
d
->
state_change
(
d
,
0
);
rfcomm_dlc_unlock
(
d
);
rfcomm_send_msc
(
s
,
1
,
dlci
,
d
->
v24_sig
);
}
else
{
rfcomm_send_dm
(
s
,
dlci
);
}
...
...
@@ -1207,6 +1255,14 @@ static int rfcomm_recv_rpn(struct rfcomm_session *s, int cr, int len, struct sk_
}
/* check for sane values: ignore/accept bit_rate, 8 bits, 1 stop bit, no parity,
no flow control lines, normal XON/XOFF chars */
if
(
rpn
->
param_mask
&
RFCOMM_RPN_PM_BITRATE
)
{
bit_rate
=
rpn
->
bit_rate
;
if
(
bit_rate
!=
RFCOMM_RPN_BR_115200
)
{
BT_DBG
(
"RPN bit rate mismatch 0x%x"
,
bit_rate
);
bit_rate
=
RFCOMM_RPN_BR_115200
;
rpn_mask
^=
RFCOMM_RPN_PM_BITRATE
;
}
}
if
(
rpn
->
param_mask
&
RFCOMM_RPN_PM_DATA
)
{
data_bits
=
__get_rpn_data_bits
(
rpn
->
line_settings
);
if
(
data_bits
!=
RFCOMM_RPN_DATA_8
)
{
...
...
@@ -1232,22 +1288,25 @@ static int rfcomm_recv_rpn(struct rfcomm_session *s, int cr, int len, struct sk_
}
}
if
(
rpn
->
param_mask
&
RFCOMM_RPN_PM_FLOW
)
{
if
(
rpn
->
flow_ctrl
!=
RFCOMM_RPN_FLOW_NONE
)
{
BT_DBG
(
"RPN flow ctrl mismatch 0x%x"
,
rpn
->
flow_ctrl
);
flow_ctrl
=
rpn
->
flow_ctrl
;
if
(
flow_ctrl
!=
RFCOMM_RPN_FLOW_NONE
)
{
BT_DBG
(
"RPN flow ctrl mismatch 0x%x"
,
flow_ctrl
);
flow_ctrl
=
RFCOMM_RPN_FLOW_NONE
;
rpn_mask
^=
RFCOMM_RPN_PM_FLOW
;
}
}
if
(
rpn
->
param_mask
&
RFCOMM_RPN_PM_XON
)
{
if
(
rpn
->
xon_char
!=
RFCOMM_RPN_XON_CHAR
)
{
BT_DBG
(
"RPN XON char mismatch 0x%x"
,
rpn
->
xon_char
);
xon_char
=
rpn
->
xon_char
;
if
(
xon_char
!=
RFCOMM_RPN_XON_CHAR
)
{
BT_DBG
(
"RPN XON char mismatch 0x%x"
,
xon_char
);
xon_char
=
RFCOMM_RPN_XON_CHAR
;
rpn_mask
^=
RFCOMM_RPN_PM_XON
;
}
}
if
(
rpn
->
param_mask
&
RFCOMM_RPN_PM_XOFF
)
{
if
(
rpn
->
xoff_char
!=
RFCOMM_RPN_XOFF_CHAR
)
{
BT_DBG
(
"RPN XOFF char mismatch 0x%x"
,
rpn
->
xoff_char
);
xoff_char
=
rpn
->
xoff_char
;
if
(
xoff_char
!=
RFCOMM_RPN_XOFF_CHAR
)
{
BT_DBG
(
"RPN XOFF char mismatch 0x%x"
,
xoff_char
);
xoff_char
=
RFCOMM_RPN_XOFF_CHAR
;
rpn_mask
^=
RFCOMM_RPN_PM_XOFF
;
}
...
...
@@ -1343,6 +1402,20 @@ static int rfcomm_recv_mcc(struct rfcomm_session *s, struct sk_buff *skb)
rfcomm_recv_msc
(
s
,
cr
,
skb
);
break
;
case
RFCOMM_FCOFF
:
if
(
cr
)
{
set_bit
(
RFCOMM_TX_THROTTLED
,
&
s
->
flags
);
rfcomm_send_fcoff
(
s
,
0
);
}
break
;
case
RFCOMM_FCON
:
if
(
cr
)
{
clear_bit
(
RFCOMM_TX_THROTTLED
,
&
s
->
flags
);
rfcomm_send_fcon
(
s
,
0
);
}
break
;
case
RFCOMM_TEST
:
if
(
cr
)
rfcomm_send_test
(
s
,
0
,
skb
->
data
,
skb
->
len
);
...
...
@@ -1533,6 +1606,9 @@ static inline void rfcomm_process_dlcs(struct rfcomm_session *s)
continue
;
}
if
(
test_bit
(
RFCOMM_TX_THROTTLED
,
&
s
->
flags
))
continue
;
if
((
d
->
state
==
BT_CONNECTED
||
d
->
state
==
BT_DISCONN
)
&&
d
->
mscex
==
RFCOMM_MSCEX_OK
)
rfcomm_process_tx
(
d
);
...
...
net/bluetooth/rfcomm/sock.c
View file @
9b45d209
...
...
@@ -192,8 +192,10 @@ static void rfcomm_sock_cleanup_listen(struct sock *parent)
BT_DBG
(
"parent %p"
,
parent
);
/* Close not yet accepted dlcs */
while
((
sk
=
bt_accept_dequeue
(
parent
,
NULL
)))
while
((
sk
=
bt_accept_dequeue
(
parent
,
NULL
)))
{
rfcomm_sock_close
(
sk
);
rfcomm_sock_kill
(
sk
);
}
parent
->
sk_state
=
BT_CLOSED
;
parent
->
sk_zapped
=
1
;
...
...
@@ -215,15 +217,10 @@ static void rfcomm_sock_kill(struct sock *sk)
sock_put
(
sk
);
}
/* Close socket.
* Must be called on unlocked socket.
*/
static
void
rfcomm_sock_close
(
struct
sock
*
sk
)
static
void
__rfcomm_sock_close
(
struct
sock
*
sk
)
{
struct
rfcomm_dlc
*
d
=
rfcomm_pi
(
sk
)
->
dlc
;
lock_sock
(
sk
);
BT_DBG
(
"sk %p state %d socket %p"
,
sk
,
sk
->
sk_state
,
sk
->
sk_socket
);
switch
(
sk
->
sk_state
)
{
...
...
@@ -240,11 +237,17 @@ static void rfcomm_sock_close(struct sock *sk)
default:
sk
->
sk_zapped
=
1
;
break
;
};
}
}
/* Close socket.
* Must be called on unlocked socket.
*/
static
void
rfcomm_sock_close
(
struct
sock
*
sk
)
{
lock_sock
(
sk
);
__rfcomm_sock_close
(
sk
);
release_sock
(
sk
);
rfcomm_sock_kill
(
sk
);
}
static
void
rfcomm_sock_init
(
struct
sock
*
sk
,
struct
sock
*
parent
)
...
...
@@ -374,7 +377,8 @@ static int rfcomm_sock_connect(struct socket *sock, struct sockaddr *addr, int a
err
=
rfcomm_dlc_open
(
d
,
&
bt_sk
(
sk
)
->
src
,
&
sa
->
rc_bdaddr
,
sa
->
rc_channel
);
if
(
!
err
)
err
=
bt_sock_w4_connect
(
sk
,
flags
);
err
=
bt_sock_wait_state
(
sk
,
BT_CONNECTED
,
sock_sndtimeo
(
sk
,
flags
&
O_NONBLOCK
));
release_sock
(
sk
);
return
err
;
...
...
@@ -558,9 +562,6 @@ static int rfcomm_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
int
target
,
err
=
0
,
copied
=
0
;
long
timeo
;
if
(
sk
->
sk_state
!=
BT_CONNECTED
)
return
-
EINVAL
;
if
(
flags
&
MSG_OOB
)
return
-
EOPNOTSUPP
;
...
...
@@ -635,23 +636,6 @@ static int rfcomm_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
return
copied
?
:
err
;
}
static
int
rfcomm_sock_shutdown
(
struct
socket
*
sock
,
int
how
)
{
struct
sock
*
sk
=
sock
->
sk
;
BT_DBG
(
"sock %p, sk %p"
,
sock
,
sk
);
if
(
!
sk
)
return
0
;
lock_sock
(
sk
);
sk
->
sk_shutdown
=
SHUTDOWN_MASK
;
if
(
sk
->
sk_state
==
BT_CONNECTED
)
rfcomm_dlc_close
(
rfcomm_pi
(
sk
)
->
dlc
,
0
);
release_sock
(
sk
);
return
0
;
}
static
int
rfcomm_sock_setsockopt
(
struct
socket
*
sock
,
int
level
,
int
optname
,
char
*
optval
,
int
optlen
)
{
struct
sock
*
sk
=
sock
->
sk
;
...
...
@@ -710,19 +694,42 @@ static int rfcomm_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned lon
return
err
;
}
static
int
rfcomm_sock_shutdown
(
struct
socket
*
sock
,
int
how
)
{
struct
sock
*
sk
=
sock
->
sk
;
int
err
=
0
;
BT_DBG
(
"sock %p, sk %p"
,
sock
,
sk
);
if
(
!
sk
)
return
0
;
lock_sock
(
sk
);
if
(
!
sk
->
sk_shutdown
)
{
sk
->
sk_shutdown
=
SHUTDOWN_MASK
;
__rfcomm_sock_close
(
sk
);
if
(
sock_flag
(
sk
,
SOCK_LINGER
)
&&
sk
->
sk_lingertime
)
err
=
bt_sock_wait_state
(
sk
,
BT_CLOSED
,
sk
->
sk_lingertime
);
}
release_sock
(
sk
);
return
err
;
}
static
int
rfcomm_sock_release
(
struct
socket
*
sock
)
{
struct
sock
*
sk
=
sock
->
sk
;
int
err
;
BT_DBG
(
"sock %p, sk %p"
,
sock
,
sk
);
if
(
!
sk
)
return
0
;
sock_orphan
(
sk
);
rfcomm_sock_close
(
sk
);
err
=
rfcomm_sock_shutdown
(
sock
,
2
);
return
0
;
sock_orphan
(
sk
);
rfcomm_sock_kill
(
sk
);
return
err
;
}
/* ---- RFCOMM core layer callbacks ----
...
...
net/bluetooth/rfcomm/tty.c
View file @
9b45d209
...
...
@@ -668,40 +668,8 @@ static int rfcomm_tty_write_room(struct tty_struct *tty)
return
room
;
}
static
int
rfcomm_tty_set_modem_status
(
uint
cmd
,
struct
rfcomm_dlc
*
dlc
,
uint
status
)
{
u8
v24_sig
,
mask
;
BT_DBG
(
"dlc %p cmd 0x%02x"
,
dlc
,
cmd
);
if
(
cmd
==
TIOCMSET
)
v24_sig
=
0
;
else
rfcomm_dlc_get_modem_status
(
dlc
,
&
v24_sig
);
mask
=
((
status
&
TIOCM_DSR
)
?
RFCOMM_V24_RTC
:
0
)
|
((
status
&
TIOCM_DTR
)
?
RFCOMM_V24_RTC
:
0
)
|
((
status
&
TIOCM_RTS
)
?
RFCOMM_V24_RTR
:
0
)
|
((
status
&
TIOCM_CTS
)
?
RFCOMM_V24_RTR
:
0
)
|
((
status
&
TIOCM_RI
)
?
RFCOMM_V24_IC
:
0
)
|
((
status
&
TIOCM_CD
)
?
RFCOMM_V24_DV
:
0
);
if
(
cmd
==
TIOCMBIC
)
v24_sig
&=
~
mask
;
else
v24_sig
|=
mask
;
rfcomm_dlc_set_modem_status
(
dlc
,
v24_sig
);
return
0
;
}
static
int
rfcomm_tty_ioctl
(
struct
tty_struct
*
tty
,
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
struct
rfcomm_dev
*
dev
=
(
struct
rfcomm_dev
*
)
tty
->
driver_data
;
struct
rfcomm_dlc
*
dlc
=
dev
->
dlc
;
uint
status
;
int
err
;
BT_DBG
(
"tty %p cmd 0x%02x"
,
tty
,
cmd
);
switch
(
cmd
)
{
...
...
@@ -713,18 +681,6 @@ static int rfcomm_tty_ioctl(struct tty_struct *tty, struct file *filp, unsigned
BT_DBG
(
"TCSETS is not supported"
);
return
-
ENOIOCTLCMD
;
case
TIOCMGET
:
BT_DBG
(
"TIOCMGET"
);
return
put_user
(
dev
->
modem_status
,
(
unsigned
int
*
)
arg
);
case
TIOCMSET
:
/* Turns on and off the lines as specified by the mask */
case
TIOCMBIS
:
/* Turns on the lines as specified by the mask */
case
TIOCMBIC
:
/* Turns off the lines as specified by the mask */
if
((
err
=
get_user
(
status
,
(
unsigned
int
*
)
arg
)))
return
err
;
return
rfcomm_tty_set_modem_status
(
cmd
,
dlc
,
status
);
case
TIOCMIWAIT
:
BT_DBG
(
"TIOCMIWAIT"
);
break
;
...
...
@@ -851,6 +807,48 @@ static int rfcomm_tty_read_proc(char *buf, char **start, off_t offset, int len,
return
0
;
}
static
int
rfcomm_tty_tiocmget
(
struct
tty_struct
*
tty
,
struct
file
*
filp
)
{
struct
rfcomm_dev
*
dev
=
(
struct
rfcomm_dev
*
)
tty
->
driver_data
;
BT_DBG
(
"tty %p dev %p"
,
tty
,
dev
);
return
dev
->
modem_status
;
}
static
int
rfcomm_tty_tiocmset
(
struct
tty_struct
*
tty
,
struct
file
*
filp
,
unsigned
int
set
,
unsigned
int
clear
)
{
struct
rfcomm_dev
*
dev
=
(
struct
rfcomm_dev
*
)
tty
->
driver_data
;
struct
rfcomm_dlc
*
dlc
=
dev
->
dlc
;
u8
v24_sig
;
BT_DBG
(
"tty %p dev %p set 0x%02x clear 0x%02x"
,
tty
,
dev
,
set
,
clear
);
rfcomm_dlc_get_modem_status
(
dlc
,
&
v24_sig
);
if
(
set
&
TIOCM_DSR
||
set
&
TIOCM_DTR
)
v24_sig
|=
RFCOMM_V24_RTC
;
if
(
set
&
TIOCM_RTS
||
set
&
TIOCM_CTS
)
v24_sig
|=
RFCOMM_V24_RTR
;
if
(
set
&
TIOCM_RI
)
v24_sig
|=
RFCOMM_V24_IC
;
if
(
set
&
TIOCM_CD
)
v24_sig
|=
RFCOMM_V24_DV
;
if
(
clear
&
TIOCM_DSR
||
clear
&
TIOCM_DTR
)
v24_sig
&=
~
RFCOMM_V24_RTC
;
if
(
clear
&
TIOCM_RTS
||
clear
&
TIOCM_CTS
)
v24_sig
&=
~
RFCOMM_V24_RTR
;
if
(
clear
&
TIOCM_RI
)
v24_sig
&=
~
RFCOMM_V24_IC
;
if
(
clear
&
TIOCM_CD
)
v24_sig
&=
~
RFCOMM_V24_DV
;
rfcomm_dlc_set_modem_status
(
dlc
,
v24_sig
);
return
0
;
}
/* ---- TTY structure ---- */
static
struct
tty_driver
*
rfcomm_tty_driver
;
...
...
@@ -870,6 +868,8 @@ static struct tty_operations rfcomm_ops = {
.
hangup
=
rfcomm_tty_hangup
,
.
wait_until_sent
=
rfcomm_tty_wait_until_sent
,
.
read_proc
=
rfcomm_tty_read_proc
,
.
tiocmget
=
rfcomm_tty_tiocmget
,
.
tiocmset
=
rfcomm_tty_tiocmset
,
};
int
rfcomm_init_ttys
(
void
)
...
...
@@ -878,18 +878,17 @@ int rfcomm_init_ttys(void)
if
(
!
rfcomm_tty_driver
)
return
-
1
;
rfcomm_tty_driver
->
owner
=
THIS_MODULE
,
rfcomm_tty_driver
->
driver_name
=
"rfcomm"
,
rfcomm_tty_driver
->
devfs_name
=
"bluetooth/rfcomm/"
,
rfcomm_tty_driver
->
name
=
"rfcomm"
,
rfcomm_tty_driver
->
major
=
RFCOMM_TTY_MAJOR
,
rfcomm_tty_driver
->
minor_start
=
RFCOMM_TTY_MINOR
,
rfcomm_tty_driver
->
type
=
TTY_DRIVER_TYPE_SERIAL
,
rfcomm_tty_driver
->
subtype
=
SERIAL_TYPE_NORMAL
,
rfcomm_tty_driver
->
flags
=
TTY_DRIVER_REAL_RAW
,
rfcomm_tty_driver
->
owner
=
THIS_MODULE
;
rfcomm_tty_driver
->
driver_name
=
"rfcomm"
;
rfcomm_tty_driver
->
devfs_name
=
"bluetooth/rfcomm/"
;
rfcomm_tty_driver
->
name
=
"rfcomm"
;
rfcomm_tty_driver
->
major
=
RFCOMM_TTY_MAJOR
;
rfcomm_tty_driver
->
minor_start
=
RFCOMM_TTY_MINOR
;
rfcomm_tty_driver
->
type
=
TTY_DRIVER_TYPE_SERIAL
;
rfcomm_tty_driver
->
subtype
=
SERIAL_TYPE_NORMAL
;
rfcomm_tty_driver
->
flags
=
TTY_DRIVER_REAL_RAW
;
rfcomm_tty_driver
->
init_termios
=
tty_std_termios
;
rfcomm_tty_driver
->
init_termios
.
c_cflag
=
B9600
|
CS8
|
CREAD
|
HUPCL
|
CLOCAL
;
rfcomm_tty_driver
->
flags
=
TTY_DRIVER_REAL_RAW
;
tty_set_operations
(
rfcomm_tty_driver
,
&
rfcomm_ops
);
if
(
tty_register_driver
(
rfcomm_tty_driver
))
{
...
...
net/bluetooth/sco.c
View file @
9b45d209
...
...
@@ -353,8 +353,10 @@ static void sco_sock_cleanup_listen(struct sock *parent)
BT_DBG
(
"parent %p"
,
parent
);
/* Close not yet accepted channels */
while
((
sk
=
bt_accept_dequeue
(
parent
,
NULL
)))
while
((
sk
=
bt_accept_dequeue
(
parent
,
NULL
)))
{
sco_sock_close
(
sk
);
sco_sock_kill
(
sk
);
}
parent
->
sk_state
=
BT_CLOSED
;
parent
->
sk_zapped
=
1
;
...
...
@@ -523,7 +525,8 @@ static int sco_sock_connect(struct socket *sock, struct sockaddr *addr, int alen
if
((
err
=
sco_connect
(
sk
)))
goto
done
;
err
=
bt_sock_w4_connect
(
sk
,
flags
);
err
=
bt_sock_wait_state
(
sk
,
BT_CONNECTED
,
sock_sndtimeo
(
sk
,
flags
&
O_NONBLOCK
));
done:
release_sock
(
sk
);
...
...
@@ -727,16 +730,24 @@ int sco_sock_getsockopt(struct socket *sock, int level, int optname, char *optva
static
int
sco_sock_release
(
struct
socket
*
sock
)
{
struct
sock
*
sk
=
sock
->
sk
;
int
err
=
0
;
BT_DBG
(
"sock %p, sk %p"
,
sock
,
sk
);
if
(
!
sk
)
return
0
;
sock_orphan
(
sk
);
sco_sock_close
(
sk
);
return
0
;
if
(
sock_flag
(
sk
,
SOCK_LINGER
)
&&
sk
->
sk_lingertime
)
{
lock_sock
(
sk
);
err
=
bt_sock_wait_state
(
sk
,
BT_CLOSED
,
sk
->
sk_lingertime
);
release_sock
(
sk
);
}
sock_orphan
(
sk
);
sco_sock_kill
(
sk
);
return
err
;
}
static
void
__sco_chan_add
(
struct
sco_conn
*
conn
,
struct
sock
*
sk
,
struct
sock
*
parent
)
...
...
net/bluetooth/syms.c
View file @
9b45d209
...
...
@@ -77,6 +77,6 @@ EXPORT_SYMBOL(bt_sock_recvmsg);
EXPORT_SYMBOL
(
bt_sock_poll
);
EXPORT_SYMBOL
(
bt_accept_enqueue
);
EXPORT_SYMBOL
(
bt_accept_dequeue
);
EXPORT_SYMBOL
(
bt_sock_w
4_connect
);
EXPORT_SYMBOL
(
bt_sock_w
ait_state
);
EXPORT_SYMBOL
(
proc_bt
);
net/ipv4/ip_input.c
View file @
9b45d209
...
...
@@ -201,7 +201,7 @@ static inline int ip_local_deliver_finish(struct sk_buff *skb)
#ifdef CONFIG_NETFILTER_DEBUG
nf_debug_ip_local_deliver
(
skb
);
skb
->
nf_debug
=
3
D
0
;
skb
->
nf_debug
=
0
;
#endif
/*CONFIG_NETFILTER_DEBUG*/
__skb_pull
(
skb
,
ihl
);
...
...
net/ipv4/netfilter/ip_nat_amanda.c
View file @
9b45d209
...
...
@@ -101,7 +101,7 @@ static int amanda_data_fixup(struct ip_conntrack *ct,
struct
ip_conntrack_expect
*
exp
=
expect
;
struct
ip_ct_amanda_expect
*
ct_amanda_info
=
&
exp
->
help
.
exp_amanda_info
;
struct
ip_conntrack_tuple
t
=
exp
->
tuple
;
in
t
port
;
u_int16_
t
port
;
MUST_BE_LOCKED
(
&
ip_amanda_lock
);
...
...
@@ -115,7 +115,7 @@ static int amanda_data_fixup(struct ip_conntrack *ct,
writable */
t
.
dst
.
ip
=
newip
;
for
(
port
=
ct_amanda_info
->
port
+
10
;
port
!=
0
;
port
++
)
{
for
(
port
=
ct_amanda_info
->
port
;
port
!=
0
;
port
++
)
{
t
.
dst
.
u
.
tcp
.
port
=
htons
(
port
);
if
(
ip_conntrack_change_expect
(
exp
,
&
t
)
==
0
)
break
;
...
...
net/ipv4/netfilter/ip_nat_irc.c
View file @
9b45d209
...
...
@@ -99,7 +99,7 @@ static int irc_data_fixup(const struct ip_ct_irc_expect *ct_irc_info,
struct
ip_conntrack_tuple
t
;
struct
iphdr
*
iph
=
(
*
pskb
)
->
nh
.
iph
;
struct
tcphdr
*
tcph
=
(
void
*
)
iph
+
iph
->
ihl
*
4
;
in
t
port
;
u_int16_
t
port
;
/* "4294967296 65635 " */
char
buffer
[
18
];
...
...
net/ipv6/addrconf.c
View file @
9b45d209
...
...
@@ -2517,7 +2517,109 @@ static void inet6_ifa_notify(int event, struct inet6_ifaddr *ifa)
netlink_broadcast
(
rtnl
,
skb
,
0
,
RTMGRP_IPV6_IFADDR
,
GFP_ATOMIC
);
}
static
void
inline
ipv6_store_devconf
(
struct
ipv6_devconf
*
cnf
,
__s32
*
array
,
int
bytes
)
{
memset
(
array
,
0
,
bytes
);
array
[
DEVCONF_FORWARDING
]
=
cnf
->
forwarding
;
array
[
DEVCONF_HOPLIMIT
]
=
cnf
->
hop_limit
;
array
[
DEVCONF_MTU6
]
=
cnf
->
mtu6
;
array
[
DEVCONF_ACCEPT_RA
]
=
cnf
->
accept_ra
;
array
[
DEVCONF_ACCEPT_REDIRECTS
]
=
cnf
->
accept_redirects
;
array
[
DEVCONF_AUTOCONF
]
=
cnf
->
autoconf
;
array
[
DEVCONF_DAD_TRANSMITS
]
=
cnf
->
dad_transmits
;
array
[
DEVCONF_RTR_SOLICITS
]
=
cnf
->
rtr_solicits
;
array
[
DEVCONF_RTR_SOLICIT_INTERVAL
]
=
cnf
->
rtr_solicit_interval
;
array
[
DEVCONF_RTR_SOLICIT_DELAY
]
=
cnf
->
rtr_solicit_delay
;
#ifdef CONFIG_IPV6_PRIVACY
array
[
DEVCONF_USE_TEMPADDR
]
=
cnf
->
use_tempaddr
;
array
[
DEVCONF_TEMP_VALID_LFT
]
=
cnf
->
temp_valid_lft
;
array
[
DEVCONF_TEMP_PREFERED_LFT
]
=
cnf
->
temp_prefered_lft
;
array
[
DEVCONF_REGEN_MAX_RETRY
]
=
cnf
->
regen_max_retry
;
array
[
DEVCONF_MAX_DESYNC_FACTOR
]
=
cnf
->
max_desync_factor
;
#endif
}
static
int
inet6_fill_ifinfo
(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
,
struct
inet6_dev
*
idev
,
int
type
,
u32
pid
,
u32
seq
)
{
__s32
*
array
=
NULL
;
struct
ifinfomsg
*
r
;
struct
nlmsghdr
*
nlh
;
unsigned
char
*
b
=
skb
->
tail
;
struct
rtattr
*
subattr
;
nlh
=
NLMSG_PUT
(
skb
,
pid
,
seq
,
type
,
sizeof
(
*
r
));
if
(
pid
)
nlh
->
nlmsg_flags
|=
NLM_F_MULTI
;
r
=
NLMSG_DATA
(
nlh
);
r
->
ifi_family
=
AF_INET6
;
r
->
ifi_type
=
dev
->
type
;
r
->
ifi_index
=
dev
->
ifindex
;
r
->
ifi_flags
=
dev
->
flags
;
r
->
ifi_change
=
0
;
if
(
!
netif_running
(
dev
)
||
!
netif_carrier_ok
(
dev
))
r
->
ifi_flags
&=
~
IFF_RUNNING
;
else
r
->
ifi_flags
|=
IFF_RUNNING
;
RTA_PUT
(
skb
,
IFLA_IFNAME
,
strlen
(
dev
->
name
)
+
1
,
dev
->
name
);
subattr
=
(
struct
rtattr
*
)
skb
->
tail
;
RTA_PUT
(
skb
,
IFLA_PROTINFO
,
0
,
NULL
);
/* return the device flags */
RTA_PUT
(
skb
,
IFLA_INET6_FLAGS
,
sizeof
(
__u32
),
&
idev
->
if_flags
);
/* return the device sysctl params */
if
((
array
=
kmalloc
(
DEVCONF_MAX
*
sizeof
(
*
array
),
GFP_ATOMIC
))
==
NULL
)
goto
rtattr_failure
;
ipv6_store_devconf
(
&
idev
->
cnf
,
array
,
DEVCONF_MAX
*
sizeof
(
*
array
));
RTA_PUT
(
skb
,
IFLA_INET6_CONF
,
DEVCONF_MAX
*
sizeof
(
*
array
),
array
);
/* XXX - Statistics/MC not implemented */
subattr
->
rta_len
=
skb
->
tail
-
(
u8
*
)
subattr
;
nlh
->
nlmsg_len
=
skb
->
tail
-
b
;
kfree
(
array
);
return
skb
->
len
;
nlmsg_failure:
rtattr_failure:
if
(
array
)
kfree
(
array
);
skb_trim
(
skb
,
b
-
skb
->
data
);
return
-
1
;
}
static
int
inet6_dump_ifinfo
(
struct
sk_buff
*
skb
,
struct
netlink_callback
*
cb
)
{
int
idx
,
err
;
int
s_idx
=
cb
->
args
[
0
];
struct
net_device
*
dev
;
struct
inet6_dev
*
idev
;
read_lock
(
&
dev_base_lock
);
for
(
dev
=
dev_base
,
idx
=
0
;
dev
;
dev
=
dev
->
next
,
idx
++
)
{
if
(
idx
<
s_idx
)
continue
;
if
((
idev
=
in6_dev_get
(
dev
))
==
NULL
)
continue
;
err
=
inet6_fill_ifinfo
(
skb
,
dev
,
idev
,
RTM_NEWLINK
,
NETLINK_CB
(
cb
->
skb
).
pid
,
cb
->
nlh
->
nlmsg_seq
);
in6_dev_put
(
idev
);
if
(
err
<=
0
)
break
;
}
read_unlock
(
&
dev_base_lock
);
cb
->
args
[
0
]
=
idx
;
return
skb
->
len
;
}
static
struct
rtnetlink_link
inet6_rtnetlink_table
[
RTM_MAX
-
RTM_BASE
+
1
]
=
{
[
RTM_GETLINK
-
RTM_BASE
]
=
{
.
dumpit
=
inet6_dump_ifinfo
,
},
[
RTM_NEWADDR
-
RTM_BASE
]
=
{
.
doit
=
inet6_rtm_newaddr
,
},
[
RTM_DELADDR
-
RTM_BASE
]
=
{
.
doit
=
inet6_rtm_deladdr
,
},
[
RTM_GETADDR
-
RTM_BASE
]
=
{
.
dumpit
=
inet6_dump_ifaddr
,
},
...
...
net/ipv6/ndisc.c
View file @
9b45d209
...
...
@@ -1044,6 +1044,17 @@ static void ndisc_router_discovery(struct sk_buff *skb)
in6_dev
->
if_flags
|=
IF_RA_RCVD
;
}
/*
* Remember the managed/otherconf flags from most recently
* received RA message (RFC 2462) -- yoshfuji
*/
in6_dev
->
if_flags
=
(
in6_dev
->
if_flags
&
~
(
IF_RA_MANAGED
|
IF_RA_OTHERCONF
))
|
(
ra_msg
->
icmph
.
icmp6_addrconf_managed
?
IF_RA_MANAGED
:
0
)
|
(
ra_msg
->
icmph
.
icmp6_addrconf_other
?
IF_RA_OTHERCONF
:
0
);
lifetime
=
ntohs
(
ra_msg
->
icmph
.
icmp6_rt_lifetime
);
rt
=
rt6_get_dflt_router
(
&
skb
->
nh
.
ipv6h
->
saddr
,
skb
->
dev
);
...
...
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