Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
c3c66193
Commit
c3c66193
authored
Apr 19, 2005
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge with kernel.org:/pub/scm/linux/kernel/git/gregkh/aoe-2.6.git/
for 11 aoe bugfix patches.
parents
c79bea07
a4b38364
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
110 additions
and
64 deletions
+110
-64
Documentation/aoe/mkdevs.sh
Documentation/aoe/mkdevs.sh
+1
-0
Documentation/aoe/mkshelf.sh
Documentation/aoe/mkshelf.sh
+1
-0
Documentation/aoe/todo.txt
Documentation/aoe/todo.txt
+14
-0
Documentation/aoe/udev-install.sh
Documentation/aoe/udev-install.sh
+5
-1
drivers/block/aoe/aoe.h
drivers/block/aoe/aoe.h
+15
-8
drivers/block/aoe/aoeblk.c
drivers/block/aoe/aoeblk.c
+3
-2
drivers/block/aoe/aoecmd.c
drivers/block/aoe/aoecmd.c
+63
-45
drivers/block/aoe/aoedev.c
drivers/block/aoe/aoedev.c
+4
-4
drivers/block/aoe/aoenet.c
drivers/block/aoe/aoenet.c
+4
-4
No files found.
Documentation/aoe/mkdevs.sh
View file @
c3c66193
...
@@ -5,6 +5,7 @@ n_partitions=${n_partitions:-16}
...
@@ -5,6 +5,7 @@ n_partitions=${n_partitions:-16}
if
test
"$#"
!=
"1"
;
then
if
test
"$#"
!=
"1"
;
then
echo
"Usage: sh
`
basename
$0
`
{dir}"
1>&2
echo
"Usage: sh
`
basename
$0
`
{dir}"
1>&2
echo
" n_partitions=16 sh
`
basename
$0
`
{dir}"
1>&2
exit
1
exit
1
fi
fi
dir
=
$1
dir
=
$1
...
...
Documentation/aoe/mkshelf.sh
View file @
c3c66193
...
@@ -2,6 +2,7 @@
...
@@ -2,6 +2,7 @@
if
test
"$#"
!=
"2"
;
then
if
test
"$#"
!=
"2"
;
then
echo
"Usage: sh
`
basename
$0
`
{dir} {shelfaddress}"
1>&2
echo
"Usage: sh
`
basename
$0
`
{dir} {shelfaddress}"
1>&2
echo
" n_partitions=16 sh
`
basename
$0
`
{dir} {shelfaddress}"
1>&2
exit
1
exit
1
fi
fi
n_partitions
=
${
n_partitions
:-
16
}
n_partitions
=
${
n_partitions
:-
16
}
...
...
Documentation/aoe/todo.txt
0 → 100644
View file @
c3c66193
There is a potential for deadlock when allocating a struct sk_buff for
data that needs to be written out to aoe storage. If the data is
being written from a dirty page in order to free that page, and if
there are no other pages available, then deadlock may occur when a
free page is needed for the sk_buff allocation. This situation has
not been observed, but it would be nice to eliminate any potential for
deadlock under memory pressure.
Because ATA over Ethernet is not fragmented by the kernel's IP code,
the destructore member of the struct sk_buff is available to the aoe
driver. By using a mempool for allocating all but the first few
sk_buffs, and by registering a destructor, we should be able to
efficiently allocate sk_buffs without introducing any potential for
deadlock.
Documentation/aoe/udev-install.sh
View file @
c3c66193
...
@@ -23,4 +23,8 @@ fi
...
@@ -23,4 +23,8 @@ fi
# /etc/udev/rules.d
# /etc/udev/rules.d
#
#
rules_d
=
"
`
sed
-n
'/^udev_rules=/{ s!udev_rules=!!; s!\"!!g; p; }'
$conf
`
"
rules_d
=
"
`
sed
-n
'/^udev_rules=/{ s!udev_rules=!!; s!\"!!g; p; }'
$conf
`
"
test
"
$rules_d
"
&&
sh
-xc
"cp
`
dirname
$0
`
/udev.txt
$rules_d
/60-aoe.rules"
if
test
-z
"
$rules_d
"
||
test
!
-d
"
$rules_d
"
;
then
echo
"
$me
Error: cannot find udev rules directory"
1>&2
exit
1
fi
sh
-xc
"cp
`
dirname
$0
`
/udev.txt
$rules_d
/60-aoe.rules"
drivers/block/aoe/aoe.h
View file @
c3c66193
/* Copyright (c) 2004 Coraid, Inc. See COPYING for GPL terms. */
/* Copyright (c) 2004 Coraid, Inc. See COPYING for GPL terms. */
#define VERSION "
5
"
#define VERSION "
6
"
#define AOE_MAJOR 152
#define AOE_MAJOR 152
#define DEVICE_NAME "aoe"
#define DEVICE_NAME "aoe"
/* set AOE_PARTITIONS to 1 to use whole-disks only
* default is 16, which is 15 partitions plus the whole disk
*/
#ifndef AOE_PARTITIONS
#ifndef AOE_PARTITIONS
#define AOE_PARTITIONS 16
#define AOE_PARTITIONS 16
#endif
#endif
#define SYSMINOR(aoemajor, aoeminor) ((aoemajor) * 10 + (aoeminor))
#define SYSMINOR(aoemajor, aoeminor) ((aoemajor) * 10 + (aoeminor))
#define AOEMAJOR(sysminor) ((sysminor) / 10)
#define AOEMAJOR(sysminor) ((sysminor) / 10)
#define AOEMINOR(sysminor) ((sysminor) % 10)
#define AOEMINOR(sysminor) ((sysminor) % 10)
...
@@ -34,13 +39,13 @@ enum {
...
@@ -34,13 +39,13 @@ enum {
struct
aoe_hdr
{
struct
aoe_hdr
{
unsigned
char
dst
[
6
];
unsigned
char
dst
[
6
];
unsigned
char
src
[
6
];
unsigned
char
src
[
6
];
unsigned
char
type
[
2
]
;
__be16
type
;
unsigned
char
verfl
;
unsigned
char
verfl
;
unsigned
char
err
;
unsigned
char
err
;
unsigned
char
major
[
2
]
;
__be16
major
;
unsigned
char
minor
;
unsigned
char
minor
;
unsigned
char
cmd
;
unsigned
char
cmd
;
unsigned
char
tag
[
4
]
;
__be32
tag
;
};
};
struct
aoe_atahdr
{
struct
aoe_atahdr
{
...
@@ -58,8 +63,8 @@ struct aoe_atahdr {
...
@@ -58,8 +63,8 @@ struct aoe_atahdr {
};
};
struct
aoe_cfghdr
{
struct
aoe_cfghdr
{
unsigned
char
bufcnt
[
2
]
;
__be16
bufcnt
;
unsigned
char
fwver
[
2
]
;
__be16
fwver
;
unsigned
char
res
;
unsigned
char
res
;
unsigned
char
aoeccmd
;
unsigned
char
aoeccmd
;
unsigned
char
cslen
[
2
];
unsigned
char
cslen
[
2
];
...
@@ -85,6 +90,7 @@ enum {
...
@@ -85,6 +90,7 @@ enum {
struct
buf
{
struct
buf
{
struct
list_head
bufs
;
struct
list_head
bufs
;
ulong
start_time
;
/* for disk stats */
ulong
flags
;
ulong
flags
;
ulong
nframesout
;
ulong
nframesout
;
char
*
bufaddr
;
char
*
bufaddr
;
...
@@ -125,7 +131,8 @@ struct aoedev {
...
@@ -125,7 +131,8 @@ struct aoedev {
struct
timer_list
timer
;
struct
timer_list
timer
;
spinlock_t
lock
;
spinlock_t
lock
;
struct
net_device
*
ifp
;
/* interface ed is attached to */
struct
net_device
*
ifp
;
/* interface ed is attached to */
struct
sk_buff
*
skblist
;
/* packets needing to be sent */
struct
sk_buff
*
sendq_hd
;
/* packets needing to be sent, list head */
struct
sk_buff
*
sendq_tl
;
mempool_t
*
bufpool
;
/* for deadlock-free Buf allocation */
mempool_t
*
bufpool
;
/* for deadlock-free Buf allocation */
struct
list_head
bufq
;
/* queue of bios to work on */
struct
list_head
bufq
;
/* queue of bios to work on */
struct
buf
*
inprocess
;
/* the one we're currently working on */
struct
buf
*
inprocess
;
/* the one we're currently working on */
...
@@ -151,7 +158,7 @@ void aoecmd_cfg_rsp(struct sk_buff *);
...
@@ -151,7 +158,7 @@ void aoecmd_cfg_rsp(struct sk_buff *);
int
aoedev_init
(
void
);
int
aoedev_init
(
void
);
void
aoedev_exit
(
void
);
void
aoedev_exit
(
void
);
struct
aoedev
*
aoedev_by
mac
(
unsigned
char
*
);
struct
aoedev
*
aoedev_by
_aoeaddr
(
int
maj
,
int
min
);
void
aoedev_downdev
(
struct
aoedev
*
d
);
void
aoedev_downdev
(
struct
aoedev
*
d
);
struct
aoedev
*
aoedev_set
(
ulong
,
unsigned
char
*
,
struct
net_device
*
,
ulong
);
struct
aoedev
*
aoedev_set
(
ulong
,
unsigned
char
*
,
struct
net_device
*
,
ulong
);
int
aoedev_busy
(
void
);
int
aoedev_busy
(
void
);
...
...
drivers/block/aoe/aoeblk.c
View file @
c3c66193
...
@@ -125,6 +125,7 @@ aoeblk_make_request(request_queue_t *q, struct bio *bio)
...
@@ -125,6 +125,7 @@ aoeblk_make_request(request_queue_t *q, struct bio *bio)
}
}
memset
(
buf
,
0
,
sizeof
(
*
buf
));
memset
(
buf
,
0
,
sizeof
(
*
buf
));
INIT_LIST_HEAD
(
&
buf
->
bufs
);
INIT_LIST_HEAD
(
&
buf
->
bufs
);
buf
->
start_time
=
jiffies
;
buf
->
bio
=
bio
;
buf
->
bio
=
bio
;
buf
->
resid
=
bio
->
bi_size
;
buf
->
resid
=
bio
->
bi_size
;
buf
->
sector
=
bio
->
bi_sector
;
buf
->
sector
=
bio
->
bi_sector
;
...
@@ -146,8 +147,8 @@ aoeblk_make_request(request_queue_t *q, struct bio *bio)
...
@@ -146,8 +147,8 @@ aoeblk_make_request(request_queue_t *q, struct bio *bio)
list_add_tail
(
&
buf
->
bufs
,
&
d
->
bufq
);
list_add_tail
(
&
buf
->
bufs
,
&
d
->
bufq
);
aoecmd_work
(
d
);
aoecmd_work
(
d
);
sl
=
d
->
s
kblist
;
sl
=
d
->
s
endq_hd
;
d
->
s
kblist
=
NULL
;
d
->
s
endq_hd
=
d
->
sendq_tl
=
NULL
;
spin_unlock_irqrestore
(
&
d
->
lock
,
flags
);
spin_unlock_irqrestore
(
&
d
->
lock
,
flags
);
...
...
drivers/block/aoe/aoecmd.c
View file @
c3c66193
...
@@ -90,19 +90,16 @@ newtag(struct aoedev *d)
...
@@ -90,19 +90,16 @@ newtag(struct aoedev *d)
static
int
static
int
aoehdr_atainit
(
struct
aoedev
*
d
,
struct
aoe_hdr
*
h
)
aoehdr_atainit
(
struct
aoedev
*
d
,
struct
aoe_hdr
*
h
)
{
{
u16
type
=
__constant_cpu_to_be16
(
ETH_P_AOE
);
u16
aoemajor
=
__cpu_to_be16
(
d
->
aoemajor
);
u32
host_tag
=
newtag
(
d
);
u32
host_tag
=
newtag
(
d
);
u32
tag
=
__cpu_to_be32
(
host_tag
);
memcpy
(
h
->
src
,
d
->
ifp
->
dev_addr
,
sizeof
h
->
src
);
memcpy
(
h
->
src
,
d
->
ifp
->
dev_addr
,
sizeof
h
->
src
);
memcpy
(
h
->
dst
,
d
->
addr
,
sizeof
h
->
dst
);
memcpy
(
h
->
dst
,
d
->
addr
,
sizeof
h
->
dst
);
memcpy
(
h
->
type
,
&
type
,
sizeof
type
);
h
->
type
=
__constant_cpu_to_be16
(
ETH_P_AOE
);
h
->
verfl
=
AOE_HVER
;
h
->
verfl
=
AOE_HVER
;
memcpy
(
h
->
major
,
&
aoemajor
,
sizeof
aoemajor
);
h
->
major
=
cpu_to_be16
(
d
->
aoemajor
);
h
->
minor
=
d
->
aoeminor
;
h
->
minor
=
d
->
aoeminor
;
h
->
cmd
=
AOECMD_ATA
;
h
->
cmd
=
AOECMD_ATA
;
memcpy
(
h
->
tag
,
&
tag
,
sizeof
tag
);
h
->
tag
=
cpu_to_be32
(
host_
tag
);
return
host_tag
;
return
host_tag
;
}
}
...
@@ -181,8 +178,12 @@ aoecmd_ata_rw(struct aoedev *d, struct frame *f)
...
@@ -181,8 +178,12 @@ aoecmd_ata_rw(struct aoedev *d, struct frame *f)
skb
=
skb_prepare
(
d
,
f
);
skb
=
skb_prepare
(
d
,
f
);
if
(
skb
)
{
if
(
skb
)
{
skb
->
next
=
d
->
skblist
;
skb
->
next
=
NULL
;
d
->
skblist
=
skb
;
if
(
d
->
sendq_hd
)
d
->
sendq_tl
->
next
=
skb
;
else
d
->
sendq_hd
=
skb
;
d
->
sendq_tl
=
skb
;
}
}
}
}
...
@@ -215,7 +216,6 @@ rexmit(struct aoedev *d, struct frame *f)
...
@@ -215,7 +216,6 @@ rexmit(struct aoedev *d, struct frame *f)
struct
aoe_hdr
*
h
;
struct
aoe_hdr
*
h
;
char
buf
[
128
];
char
buf
[
128
];
u32
n
;
u32
n
;
u32
net_tag
;
n
=
newtag
(
d
);
n
=
newtag
(
d
);
...
@@ -227,13 +227,16 @@ rexmit(struct aoedev *d, struct frame *f)
...
@@ -227,13 +227,16 @@ rexmit(struct aoedev *d, struct frame *f)
h
=
(
struct
aoe_hdr
*
)
f
->
data
;
h
=
(
struct
aoe_hdr
*
)
f
->
data
;
f
->
tag
=
n
;
f
->
tag
=
n
;
net_tag
=
__cpu_to_be32
(
n
);
h
->
tag
=
cpu_to_be32
(
n
);
memcpy
(
h
->
tag
,
&
net_tag
,
sizeof
net_tag
);
skb
=
skb_prepare
(
d
,
f
);
skb
=
skb_prepare
(
d
,
f
);
if
(
skb
)
{
if
(
skb
)
{
skb
->
next
=
d
->
skblist
;
skb
->
next
=
NULL
;
d
->
skblist
=
skb
;
if
(
d
->
sendq_hd
)
d
->
sendq_tl
->
next
=
skb
;
else
d
->
sendq_hd
=
skb
;
d
->
sendq_tl
=
skb
;
}
}
}
}
...
@@ -285,8 +288,8 @@ tdie: spin_unlock_irqrestore(&d->lock, flags);
...
@@ -285,8 +288,8 @@ tdie: spin_unlock_irqrestore(&d->lock, flags);
}
}
}
}
sl
=
d
->
s
kblist
;
sl
=
d
->
s
endq_hd
;
d
->
s
kblist
=
NULL
;
d
->
s
endq_hd
=
d
->
sendq_tl
=
NULL
;
if
(
sl
)
{
if
(
sl
)
{
n
=
d
->
rttavg
<<=
1
;
n
=
d
->
rttavg
<<=
1
;
if
(
n
>
MAXTIMER
)
if
(
n
>
MAXTIMER
)
...
@@ -308,16 +311,16 @@ ataid_complete(struct aoedev *d, unsigned char *id)
...
@@ -308,16 +311,16 @@ ataid_complete(struct aoedev *d, unsigned char *id)
u16
n
;
u16
n
;
/* word 83: command set supported */
/* word 83: command set supported */
n
=
__le16_to_cpu
(
*
((
u16
*
)
&
id
[
83
<<
1
])
);
n
=
le16_to_cpup
((
__le16
*
)
&
id
[
83
<<
1
]
);
/* word 86: command set/feature enabled */
/* word 86: command set/feature enabled */
n
|=
__le16_to_cpu
(
*
((
u16
*
)
&
id
[
86
<<
1
])
);
n
|=
le16_to_cpup
((
__le16
*
)
&
id
[
86
<<
1
]
);
if
(
n
&
(
1
<<
10
))
{
/* bit 10: LBA 48 */
if
(
n
&
(
1
<<
10
))
{
/* bit 10: LBA 48 */
d
->
flags
|=
DEVFL_EXT
;
d
->
flags
|=
DEVFL_EXT
;
/* word 100: number lba48 sectors */
/* word 100: number lba48 sectors */
ssize
=
__le64_to_cpu
(
*
((
u64
*
)
&
id
[
100
<<
1
])
);
ssize
=
le64_to_cpup
((
__le64
*
)
&
id
[
100
<<
1
]
);
/* set as in ide-disk.c:init_idedisk_capacity */
/* set as in ide-disk.c:init_idedisk_capacity */
d
->
geo
.
cylinders
=
ssize
;
d
->
geo
.
cylinders
=
ssize
;
...
@@ -328,12 +331,12 @@ ataid_complete(struct aoedev *d, unsigned char *id)
...
@@ -328,12 +331,12 @@ ataid_complete(struct aoedev *d, unsigned char *id)
d
->
flags
&=
~
DEVFL_EXT
;
d
->
flags
&=
~
DEVFL_EXT
;
/* number lba28 sectors */
/* number lba28 sectors */
ssize
=
__le32_to_cpu
(
*
((
u32
*
)
&
id
[
60
<<
1
])
);
ssize
=
le32_to_cpup
((
__le32
*
)
&
id
[
60
<<
1
]
);
/* NOTE: obsolete in ATA 6 */
/* NOTE: obsolete in ATA 6 */
d
->
geo
.
cylinders
=
__le16_to_cpu
(
*
((
u16
*
)
&
id
[
54
<<
1
])
);
d
->
geo
.
cylinders
=
le16_to_cpup
((
__le16
*
)
&
id
[
54
<<
1
]
);
d
->
geo
.
heads
=
__le16_to_cpu
(
*
((
u16
*
)
&
id
[
55
<<
1
])
);
d
->
geo
.
heads
=
le16_to_cpup
((
__le16
*
)
&
id
[
55
<<
1
]
);
d
->
geo
.
sectors
=
__le16_to_cpu
(
*
((
u16
*
)
&
id
[
56
<<
1
])
);
d
->
geo
.
sectors
=
le16_to_cpup
((
__le16
*
)
&
id
[
56
<<
1
]
);
}
}
d
->
ssize
=
ssize
;
d
->
ssize
=
ssize
;
d
->
geo
.
start
=
0
;
d
->
geo
.
start
=
0
;
...
@@ -380,29 +383,30 @@ aoecmd_ata_rsp(struct sk_buff *skb)
...
@@ -380,29 +383,30 @@ aoecmd_ata_rsp(struct sk_buff *skb)
register
long
n
;
register
long
n
;
ulong
flags
;
ulong
flags
;
char
ebuf
[
128
];
char
ebuf
[
128
];
u16
aoemajor
;
hin
=
(
struct
aoe_hdr
*
)
skb
->
mac
.
raw
;
hin
=
(
struct
aoe_hdr
*
)
skb
->
mac
.
raw
;
d
=
aoedev_bymac
(
hin
->
src
);
aoemajor
=
be16_to_cpu
(
hin
->
major
);
d
=
aoedev_by_aoeaddr
(
aoemajor
,
hin
->
minor
);
if
(
d
==
NULL
)
{
if
(
d
==
NULL
)
{
snprintf
(
ebuf
,
sizeof
ebuf
,
"aoecmd_ata_rsp: ata response "
snprintf
(
ebuf
,
sizeof
ebuf
,
"aoecmd_ata_rsp: ata response "
"for unknown device %d.%d
\n
"
,
"for unknown device %d.%d
\n
"
,
__be16_to_cpu
(
*
((
u16
*
)
hin
->
major
)),
aoemajor
,
hin
->
minor
);
hin
->
minor
);
aoechr_error
(
ebuf
);
aoechr_error
(
ebuf
);
return
;
return
;
}
}
spin_lock_irqsave
(
&
d
->
lock
,
flags
);
spin_lock_irqsave
(
&
d
->
lock
,
flags
);
f
=
getframe
(
d
,
__be32_to_cpu
(
*
((
u32
*
)
hin
->
tag
)
));
f
=
getframe
(
d
,
be32_to_cpu
(
hin
->
tag
));
if
(
f
==
NULL
)
{
if
(
f
==
NULL
)
{
spin_unlock_irqrestore
(
&
d
->
lock
,
flags
);
spin_unlock_irqrestore
(
&
d
->
lock
,
flags
);
snprintf
(
ebuf
,
sizeof
ebuf
,
snprintf
(
ebuf
,
sizeof
ebuf
,
"%15s e%d.%d tag=%08x@%08lx
\n
"
,
"%15s e%d.%d tag=%08x@%08lx
\n
"
,
"unexpected rsp"
,
"unexpected rsp"
,
__be16_to_cpu
(
*
((
u16
*
)
hin
->
major
)
),
be16_to_cpu
(
hin
->
major
),
hin
->
minor
,
hin
->
minor
,
__be32_to_cpu
(
*
((
u32
*
)
hin
->
tag
)
),
be32_to_cpu
(
hin
->
tag
),
jiffies
);
jiffies
);
aoechr_error
(
ebuf
);
aoechr_error
(
ebuf
);
return
;
return
;
...
@@ -452,7 +456,7 @@ aoecmd_ata_rsp(struct sk_buff *skb)
...
@@ -452,7 +456,7 @@ aoecmd_ata_rsp(struct sk_buff *skb)
printk
(
KERN_INFO
"aoe: aoecmd_ata_rsp: unrecognized "
printk
(
KERN_INFO
"aoe: aoecmd_ata_rsp: unrecognized "
"outbound ata command %2.2Xh for %d.%d
\n
"
,
"outbound ata command %2.2Xh for %d.%d
\n
"
,
ahout
->
cmdstat
,
ahout
->
cmdstat
,
__be16_to_cpu
(
*
((
u16
*
)
hin
->
major
)
),
be16_to_cpu
(
hin
->
major
),
hin
->
minor
);
hin
->
minor
);
}
}
}
}
...
@@ -460,6 +464,20 @@ aoecmd_ata_rsp(struct sk_buff *skb)
...
@@ -460,6 +464,20 @@ aoecmd_ata_rsp(struct sk_buff *skb)
if
(
buf
)
{
if
(
buf
)
{
buf
->
nframesout
-=
1
;
buf
->
nframesout
-=
1
;
if
(
buf
->
nframesout
==
0
&&
buf
->
resid
==
0
)
{
if
(
buf
->
nframesout
==
0
&&
buf
->
resid
==
0
)
{
unsigned
long
duration
=
jiffies
-
buf
->
start_time
;
unsigned
long
n_sect
=
buf
->
bio
->
bi_size
>>
9
;
struct
gendisk
*
disk
=
d
->
gd
;
if
(
bio_data_dir
(
buf
->
bio
)
==
WRITE
)
{
disk_stat_inc
(
disk
,
writes
);
disk_stat_add
(
disk
,
write_ticks
,
duration
);
disk_stat_add
(
disk
,
write_sectors
,
n_sect
);
}
else
{
disk_stat_inc
(
disk
,
reads
);
disk_stat_add
(
disk
,
read_ticks
,
duration
);
disk_stat_add
(
disk
,
read_sectors
,
n_sect
);
}
disk_stat_add
(
disk
,
io_ticks
,
duration
);
n
=
(
buf
->
flags
&
BUFFL_FAIL
)
?
-
EIO
:
0
;
n
=
(
buf
->
flags
&
BUFFL_FAIL
)
?
-
EIO
:
0
;
bio_endio
(
buf
->
bio
,
buf
->
bio
->
bi_size
,
n
);
bio_endio
(
buf
->
bio
,
buf
->
bio
->
bi_size
,
n
);
mempool_free
(
buf
,
d
->
bufpool
);
mempool_free
(
buf
,
d
->
bufpool
);
...
@@ -471,8 +489,8 @@ aoecmd_ata_rsp(struct sk_buff *skb)
...
@@ -471,8 +489,8 @@ aoecmd_ata_rsp(struct sk_buff *skb)
aoecmd_work
(
d
);
aoecmd_work
(
d
);
sl
=
d
->
s
kblist
;
sl
=
d
->
s
endq_hd
;
d
->
s
kblist
=
NULL
;
d
->
s
endq_hd
=
d
->
sendq_tl
=
NULL
;
spin_unlock_irqrestore
(
&
d
->
lock
,
flags
);
spin_unlock_irqrestore
(
&
d
->
lock
,
flags
);
...
@@ -486,8 +504,6 @@ aoecmd_cfg(ushort aoemajor, unsigned char aoeminor)
...
@@ -486,8 +504,6 @@ aoecmd_cfg(ushort aoemajor, unsigned char aoeminor)
struct
aoe_cfghdr
*
ch
;
struct
aoe_cfghdr
*
ch
;
struct
sk_buff
*
skb
,
*
sl
;
struct
sk_buff
*
skb
,
*
sl
;
struct
net_device
*
ifp
;
struct
net_device
*
ifp
;
u16
aoe_type
=
__constant_cpu_to_be16
(
ETH_P_AOE
);
u16
net_aoemajor
=
__cpu_to_be16
(
aoemajor
);
sl
=
NULL
;
sl
=
NULL
;
...
@@ -507,9 +523,9 @@ aoecmd_cfg(ushort aoemajor, unsigned char aoeminor)
...
@@ -507,9 +523,9 @@ aoecmd_cfg(ushort aoemajor, unsigned char aoeminor)
memset
(
h
->
dst
,
0xff
,
sizeof
h
->
dst
);
memset
(
h
->
dst
,
0xff
,
sizeof
h
->
dst
);
memcpy
(
h
->
src
,
ifp
->
dev_addr
,
sizeof
h
->
src
);
memcpy
(
h
->
src
,
ifp
->
dev_addr
,
sizeof
h
->
src
);
memcpy
(
h
->
type
,
&
aoe_type
,
sizeof
aoe_type
);
h
->
type
=
__constant_cpu_to_be16
(
ETH_P_AOE
);
h
->
verfl
=
AOE_HVER
;
h
->
verfl
=
AOE_HVER
;
memcpy
(
h
->
major
,
&
net_aoemajor
,
sizeof
net_
aoemajor
);
h
->
major
=
cpu_to_be16
(
aoemajor
);
h
->
minor
=
aoeminor
;
h
->
minor
=
aoeminor
;
h
->
cmd
=
AOECMD_CFG
;
h
->
cmd
=
AOECMD_CFG
;
...
@@ -523,7 +539,7 @@ aoecmd_cfg(ushort aoemajor, unsigned char aoeminor)
...
@@ -523,7 +539,7 @@ aoecmd_cfg(ushort aoemajor, unsigned char aoeminor)
/*
/*
* Since we only call this in one place (and it only prepares one frame)
* Since we only call this in one place (and it only prepares one frame)
* we just return the skb. Usually we'd chain it up to the
d->skblist
.
* we just return the skb. Usually we'd chain it up to the
aoedev sendq
.
*/
*/
static
struct
sk_buff
*
static
struct
sk_buff
*
aoecmd_ata_id
(
struct
aoedev
*
d
)
aoecmd_ata_id
(
struct
aoedev
*
d
)
...
@@ -575,9 +591,10 @@ aoecmd_cfg_rsp(struct sk_buff *skb)
...
@@ -575,9 +591,10 @@ aoecmd_cfg_rsp(struct sk_buff *skb)
struct
aoedev
*
d
;
struct
aoedev
*
d
;
struct
aoe_hdr
*
h
;
struct
aoe_hdr
*
h
;
struct
aoe_cfghdr
*
ch
;
struct
aoe_cfghdr
*
ch
;
ulong
flags
,
bufcnt
,
sysminor
,
aoemajor
;
ulong
flags
,
sysminor
,
aoemajor
;
u16
bufcnt
;
struct
sk_buff
*
sl
;
struct
sk_buff
*
sl
;
enum
{
MAXFRAMES
=
8
,
MAXSYSMINOR
=
255
};
enum
{
MAXFRAMES
=
8
};
h
=
(
struct
aoe_hdr
*
)
skb
->
mac
.
raw
;
h
=
(
struct
aoe_hdr
*
)
skb
->
mac
.
raw
;
ch
=
(
struct
aoe_cfghdr
*
)
(
h
+
1
);
ch
=
(
struct
aoe_cfghdr
*
)
(
h
+
1
);
...
@@ -586,7 +603,7 @@ aoecmd_cfg_rsp(struct sk_buff *skb)
...
@@ -586,7 +603,7 @@ aoecmd_cfg_rsp(struct sk_buff *skb)
* Enough people have their dip switches set backwards to
* Enough people have their dip switches set backwards to
* warrant a loud message for this special case.
* warrant a loud message for this special case.
*/
*/
aoemajor
=
__be16_to_cpu
(
*
((
u16
*
)
h
->
major
)
);
aoemajor
=
be16_to_cpu
(
h
->
major
);
if
(
aoemajor
==
0xfff
)
{
if
(
aoemajor
==
0xfff
)
{
printk
(
KERN_CRIT
"aoe: aoecmd_cfg_rsp: Warning: shelf "
printk
(
KERN_CRIT
"aoe: aoecmd_cfg_rsp: Warning: shelf "
"address is all ones. Check shelf dip switches
\n
"
);
"address is all ones. Check shelf dip switches
\n
"
);
...
@@ -594,13 +611,14 @@ aoecmd_cfg_rsp(struct sk_buff *skb)
...
@@ -594,13 +611,14 @@ aoecmd_cfg_rsp(struct sk_buff *skb)
}
}
sysminor
=
SYSMINOR
(
aoemajor
,
h
->
minor
);
sysminor
=
SYSMINOR
(
aoemajor
,
h
->
minor
);
if
(
sysminor
>
MAXSYSMINOR
)
{
if
(
sysminor
*
AOE_PARTITIONS
+
AOE_PARTITIONS
>
MINORMASK
)
{
printk
(
KERN_INFO
"aoe: aoecmd_cfg_rsp: sysminor %ld too "
printk
(
KERN_INFO
"large
\n
"
,
sysminor
);
"aoe: e%ld.%d: minor number too large
\n
"
,
aoemajor
,
(
int
)
h
->
minor
);
return
;
return
;
}
}
bufcnt
=
__be16_to_cpu
(
*
((
u16
*
)
ch
->
bufcnt
)
);
bufcnt
=
be16_to_cpu
(
ch
->
bufcnt
);
if
(
bufcnt
>
MAXFRAMES
)
/* keep it reasonable */
if
(
bufcnt
>
MAXFRAMES
)
/* keep it reasonable */
bufcnt
=
MAXFRAMES
;
bufcnt
=
MAXFRAMES
;
...
@@ -617,7 +635,7 @@ aoecmd_cfg_rsp(struct sk_buff *skb)
...
@@ -617,7 +635,7 @@ aoecmd_cfg_rsp(struct sk_buff *skb)
return
;
return
;
}
}
d
->
fw_ver
=
__be16_to_cpu
(
*
((
u16
*
)
ch
->
fwver
)
);
d
->
fw_ver
=
be16_to_cpu
(
ch
->
fwver
);
/* we get here only if the device is new */
/* we get here only if the device is new */
sl
=
aoecmd_ata_id
(
d
);
sl
=
aoecmd_ata_id
(
d
);
...
...
drivers/block/aoe/aoedev.c
View file @
c3c66193
...
@@ -13,7 +13,7 @@ static struct aoedev *devlist;
...
@@ -13,7 +13,7 @@ static struct aoedev *devlist;
static
spinlock_t
devlist_lock
;
static
spinlock_t
devlist_lock
;
struct
aoedev
*
struct
aoedev
*
aoedev_by
mac
(
unsigned
char
*
macaddr
)
aoedev_by
_aoeaddr
(
int
maj
,
int
min
)
{
{
struct
aoedev
*
d
;
struct
aoedev
*
d
;
ulong
flags
;
ulong
flags
;
...
@@ -21,7 +21,7 @@ aoedev_bymac(unsigned char *macaddr)
...
@@ -21,7 +21,7 @@ aoedev_bymac(unsigned char *macaddr)
spin_lock_irqsave
(
&
devlist_lock
,
flags
);
spin_lock_irqsave
(
&
devlist_lock
,
flags
);
for
(
d
=
devlist
;
d
;
d
=
d
->
next
)
for
(
d
=
devlist
;
d
;
d
=
d
->
next
)
if
(
!
memcmp
(
d
->
addr
,
macaddr
,
6
)
)
if
(
d
->
aoemajor
==
maj
&&
d
->
aoeminor
==
min
)
break
;
break
;
spin_unlock_irqrestore
(
&
devlist_lock
,
flags
);
spin_unlock_irqrestore
(
&
devlist_lock
,
flags
);
...
@@ -125,7 +125,6 @@ aoedev_set(ulong sysminor, unsigned char *addr, struct net_device *ifp, ulong bu
...
@@ -125,7 +125,6 @@ aoedev_set(ulong sysminor, unsigned char *addr, struct net_device *ifp, ulong bu
d
->
ifp
=
ifp
;
d
->
ifp
=
ifp
;
if
(
d
->
sysminor
!=
sysminor
if
(
d
->
sysminor
!=
sysminor
||
memcmp
(
d
->
addr
,
addr
,
sizeof
d
->
addr
)
||
(
d
->
flags
&
DEVFL_UP
)
==
0
)
{
||
(
d
->
flags
&
DEVFL_UP
)
==
0
)
{
aoedev_downdev
(
d
);
/* flushes outstanding frames */
aoedev_downdev
(
d
);
/* flushes outstanding frames */
memcpy
(
d
->
addr
,
addr
,
sizeof
d
->
addr
);
memcpy
(
d
->
addr
,
addr
,
sizeof
d
->
addr
);
...
@@ -147,7 +146,8 @@ aoedev_freedev(struct aoedev *d)
...
@@ -147,7 +146,8 @@ aoedev_freedev(struct aoedev *d)
put_disk
(
d
->
gd
);
put_disk
(
d
->
gd
);
}
}
kfree
(
d
->
frames
);
kfree
(
d
->
frames
);
mempool_destroy
(
d
->
bufpool
);
if
(
d
->
bufpool
)
mempool_destroy
(
d
->
bufpool
);
kfree
(
d
);
kfree
(
d
);
}
}
...
...
drivers/block/aoe/aoenet.c
View file @
c3c66193
...
@@ -69,7 +69,7 @@ set_aoe_iflist(const char __user *user_str, size_t size)
...
@@ -69,7 +69,7 @@ set_aoe_iflist(const char __user *user_str, size_t size)
u64
u64
mac_addr
(
char
addr
[
6
])
mac_addr
(
char
addr
[
6
])
{
{
u
64
n
=
0
;
__be
64
n
=
0
;
char
*
p
=
(
char
*
)
&
n
;
char
*
p
=
(
char
*
)
&
n
;
memcpy
(
p
+
2
,
addr
,
6
);
/* (sizeof addr != 6) */
memcpy
(
p
+
2
,
addr
,
6
);
/* (sizeof addr != 6) */
...
@@ -108,7 +108,7 @@ static int
...
@@ -108,7 +108,7 @@ static int
aoenet_rcv
(
struct
sk_buff
*
skb
,
struct
net_device
*
ifp
,
struct
packet_type
*
pt
)
aoenet_rcv
(
struct
sk_buff
*
skb
,
struct
net_device
*
ifp
,
struct
packet_type
*
pt
)
{
{
struct
aoe_hdr
*
h
;
struct
aoe_hdr
*
h
;
u
long
n
;
u
32
n
;
skb
=
skb_check
(
skb
);
skb
=
skb_check
(
skb
);
if
(
!
skb
)
if
(
!
skb
)
...
@@ -121,7 +121,7 @@ aoenet_rcv(struct sk_buff *skb, struct net_device *ifp, struct packet_type *pt)
...
@@ -121,7 +121,7 @@ aoenet_rcv(struct sk_buff *skb, struct net_device *ifp, struct packet_type *pt)
skb_push
(
skb
,
ETH_HLEN
);
/* (1) */
skb_push
(
skb
,
ETH_HLEN
);
/* (1) */
h
=
(
struct
aoe_hdr
*
)
skb
->
mac
.
raw
;
h
=
(
struct
aoe_hdr
*
)
skb
->
mac
.
raw
;
n
=
__be32_to_cpu
(
*
((
u32
*
)
h
->
tag
)
);
n
=
be32_to_cpu
(
h
->
tag
);
if
((
h
->
verfl
&
AOEFL_RSP
)
==
0
||
(
n
&
1
<<
31
))
if
((
h
->
verfl
&
AOEFL_RSP
)
==
0
||
(
n
&
1
<<
31
))
goto
exit
;
goto
exit
;
...
@@ -132,7 +132,7 @@ aoenet_rcv(struct sk_buff *skb, struct net_device *ifp, struct packet_type *pt)
...
@@ -132,7 +132,7 @@ aoenet_rcv(struct sk_buff *skb, struct net_device *ifp, struct packet_type *pt)
if
(
net_ratelimit
())
if
(
net_ratelimit
())
printk
(
KERN_ERR
"aoe: aoenet_rcv: error packet from %d.%d; "
printk
(
KERN_ERR
"aoe: aoenet_rcv: error packet from %d.%d; "
"ecode=%d '%s'
\n
"
,
"ecode=%d '%s'
\n
"
,
__be16_to_cpu
(
*
((
u16
*
)
h
->
major
)
),
h
->
minor
,
be16_to_cpu
(
h
->
major
),
h
->
minor
,
h
->
err
,
aoe_errlist
[
n
]);
h
->
err
,
aoe_errlist
[
n
]);
goto
exit
;
goto
exit
;
}
}
...
...
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