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
ed6ac3a1
Commit
ed6ac3a1
authored
Nov 23, 2007
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Import 1.3.88
parent
f806c6db
Changes
19
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
223 additions
and
372 deletions
+223
-372
Documentation/Changes
Documentation/Changes
+113
-255
Makefile
Makefile
+1
-1
drivers/char/ftape/ftape-io.c
drivers/char/ftape/ftape-io.c
+1
-1
drivers/char/stallion.c
drivers/char/stallion.c
+1
-1
drivers/isdn/icn/icn.c
drivers/isdn/icn/icn.c
+1
-1
drivers/scsi/pas16.c
drivers/scsi/pas16.c
+0
-1
drivers/scsi/scsi.c
drivers/scsi/scsi.c
+1
-0
drivers/sound/gus_wave.c
drivers/sound/gus_wave.c
+2
-2
drivers/sound/sscape.c
drivers/sound/sscape.c
+1
-1
fs/isofs/inode.c
fs/isofs/inode.c
+21
-6
fs/isofs/namei.c
fs/isofs/namei.c
+3
-1
fs/isofs/rock.c
fs/isofs/rock.c
+2
-0
fs/nfs/dir.c
fs/nfs/dir.c
+1
-1
include/linux/iso_fs.h
include/linux/iso_fs.h
+1
-0
include/net/tcp.h
include/net/tcp.h
+2
-2
mm/filemap.c
mm/filemap.c
+6
-6
net/ipv4/tcp_input.c
net/ipv4/tcp_input.c
+23
-26
net/ipv4/tcp_timer.c
net/ipv4/tcp_timer.c
+28
-60
scripts/header.tk
scripts/header.tk
+15
-7
No files found.
Documentation/Changes
View file @
ed6ac3a1
This diff is collapsed.
Click to expand it.
Makefile
View file @
ed6ac3a1
VERSION
=
1
PATCHLEVEL
=
3
SUBLEVEL
=
8
7
SUBLEVEL
=
8
8
ARCH
=
i386
...
...
drivers/char/ftape/ftape-io.c
View file @
ed6ac3a1
...
...
@@ -951,7 +951,7 @@ int ftape_wakeup_drive(wake_up_types method)
default:
result
=
-
ENODEV
;
/* unknown wakeup method */
}
/* If wakeup succeeded we shouldn't get an
d
error here..
/* If wakeup succeeded we shouldn't get an error here..
*/
if
(
result
==
0
)
{
result
=
ftape_report_raw_drive_status
(
&
status
);
...
...
drivers/char/stallion.c
View file @
ed6ac3a1
...
...
@@ -527,7 +527,7 @@ static int stl_findpcibrds(void);
/*
* Define the driver info for a user level control device. Used mainly
* to get at port stats - only
on
t using the port device itself.
* to get at port stats - only
no
t using the port device itself.
*/
static
struct
file_operations
stl_fsiomem
=
{
NULL
,
...
...
drivers/isdn/icn/icn.c
View file @
ed6ac3a1
...
...
@@ -51,7 +51,7 @@
*
* Revision 1.8 1995/03/15 12:49:44 fritz
* Added support for SPV's
* Split pollbchan_work
i
for calling send-routine directly
* Split pollbchan_work for calling send-routine directly
*
* Revision 1.7 1995/02/20 03:48:03 fritz
* Added support of new request_region-function.
...
...
drivers/scsi/pas16.c
View file @
ed6ac3a1
...
...
@@ -419,7 +419,6 @@ int pas16_detect(Scsi_Host_Template * tpnt) {
else
instance
->
irq
=
NCR5380_probe_irq
(
instance
,
PAS16_IRQS
);
instance
->
irq
=
IRQ_NONE
;
/*****temp****/
if
(
instance
->
irq
!=
IRQ_NONE
)
if
(
request_irq
(
instance
->
irq
,
pas16_intr
,
SA_INTERRUPT
,
"pas16"
,
NULL
))
{
printk
(
"scsi%d : IRQ%d not free, interrupts disabled
\n
"
,
...
...
drivers/scsi/scsi.c
View file @
ed6ac3a1
...
...
@@ -277,6 +277,7 @@ static struct dev_info device_list[] =
{
"TEXEL"
,
"CD-ROM"
,
"1.06"
,
BLIST_BORKEN
},
{
"INSITE"
,
"Floptical F*8I"
,
"*"
,
BLIST_KEY
},
{
"INSITE"
,
"I325VM"
,
"*"
,
BLIST_KEY
},
{
"NRC"
,
"MBR-7"
,
"*"
,
BLIST_FORCELUN
|
BLIST_SINGLELUN
},
{
"PIONEER"
,
"CD-ROM DRM-602X"
,
"*"
,
BLIST_FORCELUN
|
BLIST_SINGLELUN
},
{
"PIONEER"
,
"CD-ROM DRM-604X"
,
"*"
,
BLIST_FORCELUN
|
BLIST_SINGLELUN
},
{
"EMULEX"
,
"MD21/S2 ESDI"
,
"*"
,
BLIST_FORCELUN
|
BLIST_SINGLELUN
},
...
...
drivers/sound/gus_wave.c
View file @
ed6ac3a1
...
...
@@ -2653,7 +2653,7 @@ guswave_patchmgr (int dev, struct patmgr_info *rec)
*/
offs
+=
sample_ptrs
[
sample
];
/*
* Begin offse
ss
+ offset to DRAM
* Begin offse
t
+ offset to DRAM
*/
for
(
n
=
0
;
n
<
l
;
n
++
)
...
...
@@ -2698,7 +2698,7 @@ guswave_patchmgr (int dev, struct patmgr_info *rec)
*/
offs
+=
sample_ptrs
[
sample
];
/*
* Begin offse
ss
+ offset to DRAM
* Begin offse
t
+ offset to DRAM
*/
for
(
n
=
0
;
n
<
l
;
n
++
)
...
...
drivers/sound/sscape.c
View file @
ed6ac3a1
...
...
@@ -1145,7 +1145,7 @@ attach_ss_ms_sound (long mem_start, struct address_info *hw_config)
sscape_write
(
devc
,
GA_DMACFG_REG
,
0x50
);
/*
* Take the gate-arry off of the DMA channel.
* Take the gate-arr
a
y off of the DMA channel.
*/
sscape_write
(
devc
,
GA_DMAB_REG
,
0x20
);
...
...
fs/isofs/inode.c
View file @
ed6ac3a1
...
...
@@ -430,7 +430,7 @@ void isofs_statfs (struct super_block *sb, struct statfs *buf, int bufsiz)
struct
statfs
tmp
;
tmp
.
f_type
=
ISOFS_SUPER_MAGIC
;
tmp
.
f_bsize
=
1
<<
ISOFS_BLOCK_BITS
;
tmp
.
f_bsize
=
sb
->
s_blocksize
;
tmp
.
f_blocks
=
sb
->
u
.
isofs_sb
.
s_nzones
;
tmp
.
f_bfree
=
0
;
tmp
.
f_bavail
=
0
;
...
...
@@ -681,7 +681,7 @@ int isofs_lookup_grandparent(struct inode * parent, int extent)
struct
iso_directory_record
*
de
;
offset
=
0
;
block
=
extent
<<
(
ISOFS_
BLOCK_BITS
-
bufbits
);
block
=
extent
<<
(
ISOFS_
ZONE_BITS
(
parent
)
-
bufbits
);
if
(
!
(
bh
=
bread
(
parent
->
i_dev
,
block
,
bufsize
)))
return
-
1
;
while
(
1
==
1
)
{
...
...
@@ -689,6 +689,7 @@ int isofs_lookup_grandparent(struct inode * parent, int extent)
if
(
*
((
unsigned
char
*
)
de
)
==
0
)
{
brelse
(
bh
);
printk
(
"Directory .. not found
\n
"
);
return
-
1
;
}
...
...
@@ -718,9 +719,11 @@ int isofs_lookup_grandparent(struct inode * parent, int extent)
result
=
-
1
;
offset
=
0
;
block
=
parent_dir
<<
(
ISOFS_
BLOCK_BITS
-
bufbits
);
block
=
parent_dir
<<
(
ISOFS_
ZONE_BITS
(
parent
)
-
bufbits
);
if
(
!
block
||
!
(
bh
=
bread
(
parent
->
i_dev
,
block
,
bufsize
)))
{
return
-
1
;
}
for
(;;)
{
...
...
@@ -738,11 +741,19 @@ int isofs_lookup_grandparent(struct inode * parent, int extent)
block
++
;
directory_size
-=
bufsize
;
if
(
directory_size
<
0
)
return
-
1
;
if
((
block
&
1
)
&&
(
ISOFS_BLOCK_BITS
-
bufbits
))
return
-
1
;
if
((
block
&
1
)
&&
(
ISOFS_ZONE_BITS
(
parent
)
-
bufbits
)
==
1
)
{
return
-
1
;
}
if
((
block
&
3
)
&&
(
ISOFS_ZONE_BITS
(
parent
)
-
bufbits
)
==
2
)
{
return
-
1
;
}
if
(
!
block
||
!
(
bh
=
bread
(
parent
->
i_dev
,
block
,
bufsize
)))
{
return
-
1
;
}
continue
;
}
...
...
@@ -764,7 +775,11 @@ int isofs_lookup_grandparent(struct inode * parent, int extent)
brelse
(
bh
);
offset
-=
bufsize
;
directory_size
-=
bufsize
;
if
(
directory_size
<
0
)
return
-
1
;
if
(
directory_size
<
0
)
{
printk
(
"Directory size < 0
\n
"
);
return
-
1
;
}
block
++
;
if
(
!
(
bh
=
bread
(
parent
->
i_dev
,
block
,
bufsize
)))
{
kfree
(
cpnt
);
...
...
fs/isofs/namei.c
View file @
ed6ac3a1
...
...
@@ -199,7 +199,9 @@ static struct buffer_head * isofs_find_entry(struct inode * dir,
find_rock_ridge_relocation
(
de
,
dir
));
if
(
inode_number
==
-
1
){
/* Should never happen */
printk
(
"Backlink not properly set.
\n
"
);
printk
(
"Backlink not properly set %x %lx.
\n
"
,
isonum_733
(
de
->
extent
),
dir
->
i_ino
);
goto
out
;
}
}
...
...
fs/isofs/rock.c
View file @
ed6ac3a1
...
...
@@ -507,6 +507,8 @@ char * get_rock_ridge_symlink(struct inode * inode)
if
(
slen
<
2
)
break
;
if
(
!
rootflag
)
strcat
(
rpnt
,
"/"
);
};
case
SIG
(
'C'
,
'E'
):
CHECK_CE
;
/* This tells is if there is a continuation record */
break
;
default:
break
;
...
...
fs/nfs/dir.c
View file @
ed6ac3a1
...
...
@@ -486,7 +486,7 @@ static int nfs_rmdir(struct inode *dir, const char *name, int len)
static
int
nfs_sillyrename
(
struct
inode
*
dir
,
const
char
*
name
,
int
len
)
{
struct
inode
*
inode
;
char
silly
[
1
4
];
char
silly
[
1
6
];
int
slen
,
ret
;
dir
->
i_count
++
;
...
...
include/linux/iso_fs.h
View file @
ed6ac3a1
...
...
@@ -122,6 +122,7 @@ struct iso_directory_record {
#define ISOFS_BUFFER_SIZE(INODE) ((INODE)->i_sb->s_blocksize)
#define ISOFS_BUFFER_BITS(INODE) ((INODE)->i_sb->s_blocksize_bits)
#define ISOFS_ZONE_BITS(INODE) ((INODE)->i_sb->u.isofs_sb.s_log_zone_size)
#if 0
#ifdef ISOFS_FIXED_BLOCKSIZE
...
...
include/net/tcp.h
View file @
ed6ac3a1
...
...
@@ -201,7 +201,7 @@ static __inline__ int tcp_new_window(struct sock * sk)
/*
* RFC 1122 says:
*
* "the suggested [SWS] avoidance algoritm for the receiver is to keep
* "the suggested [SWS] avoidance algorit
h
m for the receiver is to keep
* RECV.NEXT + RCV.WIN fixed until:
* RCV.BUFF - RCV.USER - RCV.WINDOW >= min(1/2 RCV.BUFF, MSS)"
*
...
...
@@ -213,7 +213,7 @@ static __inline__ int tcp_new_window(struct sock * sk)
* the size of the current free space, truncated to a multiple
* of 1024 bytes. If the window is smaller than
* min(sk->mss, MAX_WINDOW/2)
* then we adver
siz
e the window as having size 0, unless this
* then we adver
tis
e the window as having size 0, unless this
* would shrink the window we offered last time.
* This results in as much as double the throughput as the original
* implementation.
...
...
mm/filemap.c
View file @
ed6ac3a1
...
...
@@ -329,7 +329,7 @@ static inline unsigned long generic_file_readahead(struct file * filp, struct in
if
(
PageLocked
(
page
))
{
max_ahead
=
filp
->
f_ramax
;
rapos
=
ppos
;
/* try_async = 1 */
/* Seems question
n
able */
/* try_async = 1 */
/* Seems questionable */
}
/*
* The current page is not locked
...
...
@@ -435,10 +435,10 @@ int generic_file_read(struct inode * inode, struct file * filp, char * buf, int
pos
=
filp
->
f_pos
;
/*
* Dont bel
ei
ve f_reada
* Dont bel
ie
ve f_reada
* --------------------
* f_reada is set to 0 by seek operations.
* If we bel
ei
ve f_reada, small seek ops break asynchronous read-ahead.
* If we bel
ie
ve f_reada, small seek ops break asynchronous read-ahead.
* That may be quite bad for small seeks or rewrites operations.
* I prefer to check if the current position is inside the previous read-ahead
* window.
...
...
@@ -461,10 +461,10 @@ int generic_file_read(struct inode * inode, struct file * filp, char * buf, int
/*
* Now f_reada = 1 means that asynchronous read-ahead is the good tactics.
* Will try asynchrous read-ahead as soon as possible.
* Will try asynchro
no
us read-ahead as soon as possible.
* Double the max read ahead size each time.
* That euristic avoid to do some large IO for files that are not really
* accessed sequentialy.
* That
h
euristic avoid to do some large IO for files that are not really
* accessed sequential
l
y.
*/
if
(
filp
->
f_reada
)
{
try_async
=
1
;
...
...
net/ipv4/tcp_input.c
View file @
ed6ac3a1
...
...
@@ -172,26 +172,15 @@ static void bad_tcp_sequence(struct sock *sk, struct tcphdr *th, u32 end_seq,
tcp_send_reset
(
sk
->
saddr
,
sk
->
daddr
,
th
,
sk
->
prot
,
NULL
,
dev
,
sk
->
ip_tos
,
sk
->
ip_ttl
);
return
;
}
/*
* We got out of sequence data.
* This turns out to be tricky. If the packet ends at the
* edge of the window, then we MUST ack the packet,
* otherwise a lost ACK packet can stall the TCP.
* We deal with this case in tcp_queue().
* On the other hand, if the packet is further to the
* left of the window, then we are looking a retransmitted
* packet. If we ACK it we can get into a situation that
* will later induce a fast retransmit of another packet.
* This can end up eating up half our bandwidth.
*/
/* This case is NOT supposed to be able
* to happen. Test for it?
/*
* 4.3reno machines look for these kind of acks so they can do fast
* recovery. Three identical 'old' acks lets it know that one frame has
* been lost and should be resent. Because this is before the whole window
* of data has timed out it can take one lost frame per window without
* stalling. [See Jacobson RFC1323, Stevens TCP/IP illus vol2]
*/
if
(
sk
->
acked_seq
==
end_seq
)
printk
(
"Impossible out of sequence data case.
\n
"
);
return
;
tcp_send_ack
(
sk
);
}
/*
...
...
@@ -915,9 +904,17 @@ static int tcp_ack(struct sock *sk, struct tcphdr *th, u32 ack, int len)
break
;
default:
/*
* Reset the xmit timer - state has changed.
* Must check send_head and write_queue
* to determine which timeout to use.
*/
tcp_reset_xmit_timer
(
sk
,
0
,
0
);
if
(
sk
->
send_head
||
!
skb_queue_empty
(
&
sk
->
write_queue
))
{
tcp_reset_xmit_timer
(
sk
,
TIME_WRITE
,
sk
->
rto
);
}
else
if
(
sk
->
keepopen
)
{
tcp_reset_xmit_timer
(
sk
,
TIME_KEEPOPEN
,
TCP_TIMEOUT_LEN
);
}
else
{
del_timer
(
&
sk
->
retransmit_timer
);
sk
->
ip_xmit_timeout
=
0
;
}
break
;
}
}
...
...
@@ -1237,7 +1234,7 @@ static void tcp_queue(struct sk_buff * skb, struct sock * sk, struct tcphdr *th)
if
(
!
after
(
skb
->
seq
,
ack_seq
))
{
if
(
after
(
skb
->
end_seq
,
ack_seq
))
{
/* the packet stradles our window end */
/* the packet strad
d
les our window end */
struct
sk_buff_head
*
list
=
&
sk
->
receive_queue
;
struct
sk_buff
*
next
;
ack_seq
=
tcp_queue_ack
(
skb
,
sk
);
...
...
@@ -1285,7 +1282,7 @@ static void tcp_queue(struct sk_buff * skb, struct sock * sk, struct tcphdr *th)
*/
int
delay
=
HZ
/
2
;
if
(
th
->
psh
)
delay
=
HZ
/
1
0
;
delay
=
HZ
/
5
0
;
tcp_send_delayed_ack
(
sk
,
delay
);
}
...
...
@@ -1335,7 +1332,7 @@ static void tcp_queue(struct sk_buff * skb, struct sock * sk, struct tcphdr *th)
*/
static
int
tcp_data
(
struct
sk_buff
*
skb
,
struct
sock
*
sk
,
unsigned
long
saddr
,
unsigned
shor
t
len
)
unsigned
long
saddr
,
unsigned
in
t
len
)
{
struct
tcphdr
*
th
;
u32
new_seq
,
shut_seq
;
...
...
@@ -1738,9 +1735,9 @@ int tcp_rcv(struct sk_buff *skb, struct device *dev, struct options *opt,
{
/* A valid ack from a different connection
start. Shouldn't happen but cover it */
tcp_statistics
.
TcpAttemptFails
++
;
tcp_send_reset
(
daddr
,
saddr
,
th
,
sk
->
prot
,
opt
,
dev
,
sk
->
ip_tos
,
sk
->
ip_ttl
);
tcp_statistics
.
TcpAttemptFails
++
;
tcp_send_reset
(
daddr
,
saddr
,
th
,
sk
->
prot
,
opt
,
dev
,
sk
->
ip_tos
,
sk
->
ip_ttl
);
kfree_skb
(
skb
,
FREE_READ
);
return
0
;
}
...
...
net/ipv4/tcp_timer.c
View file @
ed6ac3a1
...
...
@@ -29,66 +29,19 @@ void tcp_delack_timer(unsigned long data)
/*
* Reset the retransmission timer
*
* We currently ignore the why/when parameters, and decide on
* our own how long we should wait on our own..
*/
void
tcp_reset_xmit_timer
(
struct
sock
*
sk
,
int
why
,
unsigned
long
when
)
{
unsigned
long
now
=
jiffies
;
when
=
~
0UL
;
why
=
-
1
;
/*
* Was an old timer event active?
*/
if
(
del_timer
(
&
sk
->
retransmit_timer
))
{
why
=
sk
->
ip_xmit_timeout
;
when
=
sk
->
retransmit_timer
.
expires
;
}
/*
* Keepopen processing?
*/
if
(
sk
->
keepopen
)
{
unsigned
long
new_when
=
now
+
TCP_TIMEOUT_LEN
;
if
(
new_when
<
when
)
{
when
=
new_when
;
why
=
TIME_KEEPOPEN
;
}
}
/*
* Retransmission?
*/
if
(
sk
->
send_head
)
{
struct
sk_buff
*
skb
=
sk
->
send_head
;
unsigned
long
new_when
=
skb
->
when
+
sk
->
rto
;
if
(
new_when
<
when
)
{
when
=
new_when
;
why
=
TIME_WRITE
;
}
}
else
if
(
!
skb_queue_empty
(
&
sk
->
write_queue
))
{
/*
* Zero window probe?
*/
struct
sk_buff
*
skb
=
sk
->
write_queue
.
next
;
if
(
before
(
sk
->
window_seq
,
skb
->
end_seq
))
{
unsigned
long
new_when
=
now
+
TIME_PROBE0
;
if
(
new_when
<
when
)
{
when
=
new_when
;
why
=
TIME_PROBE0
;
}
}
}
if
(
why
>=
0
)
{
sk
->
ip_xmit_timeout
=
why
;
sk
->
retransmit_timer
.
expires
=
when
;
add_timer
(
&
sk
->
retransmit_timer
);
del_timer
(
&
sk
->
retransmit_timer
);
sk
->
ip_xmit_timeout
=
why
;
if
((
long
)
when
<
0
)
{
when
=
3
;
printk
(
"Error: Negative timer in xmit_timer
\n
"
);
}
sk
->
retransmit_timer
.
expires
=
jiffies
+
when
;
add_timer
(
&
sk
->
retransmit_timer
);
}
/*
...
...
@@ -222,6 +175,19 @@ static int tcp_write_timeout(struct sock *sk)
return
1
;
}
/*
* It could be we got here because we needed to send an ack,
* so we need to check for that and not just normal retransmit.
*/
static
void
tcp_time_write_timeout
(
struct
sock
*
sk
)
{
/*
* Retransmission
*/
sk
->
prot
->
retransmit
(
sk
,
0
);
tcp_write_timeout
(
sk
);
}
/*
* The TCP retransmit timer. This lacks a few small details.
...
...
@@ -267,25 +233,27 @@ void tcp_retransmit_timer(unsigned long data)
/* Window probing */
case
TIME_PROBE0
:
tcp_send_probe0
(
sk
);
tcp_
reset_xmit_timer
(
sk
,
0
,
0
);
/* get us going again */
tcp_
write_timeout
(
sk
);
break
;
/* Retransmitting */
case
TIME_WRITE
:
sk
->
prot
->
retransmit
(
sk
,
0
);
tcp_write_timeout
(
sk
);
tcp_reset_xmit_timer
(
sk
,
0
,
0
);
/* get us going again */
tcp_time_write_timeout
(
sk
);
break
;
/* Sending Keepalives */
case
TIME_KEEPOPEN
:
/*
* this reset_timer() call is a hack, this is not
* how KEEPOPEN is supposed to work.
*/
tcp_reset_xmit_timer
(
sk
,
TIME_KEEPOPEN
,
TCP_TIMEOUT_LEN
);
/* Send something to keep the connection open. */
if
(
sk
->
prot
->
write_wakeup
)
sk
->
prot
->
write_wakeup
(
sk
);
sk
->
retransmits
++
;
sk
->
prot
->
retransmits
++
;
tcp_write_timeout
(
sk
);
tcp_reset_xmit_timer
(
sk
,
0
,
0
);
break
;
default:
...
...
scripts/header.tk
View file @
ed6ac3a1
#
# Create a "reference" object to steal colors from.
#
button .ref
#
# This is a handy replacement for ".widget cget" that requires neither tk4
# nor additional source code uglification.
#
proc cget { w option } {
return
[lindex [$w configure $option] 4]
return
"[lindex [$w configure $option] 4]"
}
#
...
...
@@ -18,12 +13,25 @@ proc cget { w option } {
#
proc vfix { var } {
global $var
if [
catch {set $var [subst $$var]}
] {
if [
catch {eval concat $$var}
] {
puts stdout "WARNING - broken Config.in! $var was not declared!"
set $var 0
}
}
#
# Create a "reference" object to steal colors from.
#
button .ref
#
# On monochrome displays, -disabledforeground is blank by default; that's
# bad. Fill it with -foreground instead.
#
if { [cget .ref -disabledforeground] == "" } {
.ref configure -disabledforeground [cget .ref -foreground]
}
#
# Define some macros we will need to parse the config.in file.
#
...
...
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