Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
324bb261
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
324bb261
编写于
12月 18, 2013
作者:
B
Ben Myers
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'xfs-for-linus-v3.13-rc5' into for-next
上级
46f23adf
ac8809f9
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
92 addition
and
40 deletion
+92
-40
fs/xfs/xfs_bmap.c
fs/xfs/xfs_bmap.c
+17
-6
fs/xfs/xfs_bmap_util.c
fs/xfs/xfs_bmap_util.c
+12
-2
fs/xfs/xfs_buf.c
fs/xfs/xfs_buf.c
+14
-23
fs/xfs/xfs_buf.h
fs/xfs/xfs_buf.h
+7
-4
fs/xfs/xfs_buf_item.c
fs/xfs/xfs_buf_item.c
+19
-2
fs/xfs/xfs_log_recover.c
fs/xfs/xfs_log_recover.c
+11
-2
fs/xfs/xfs_trans_buf.c
fs/xfs/xfs_trans_buf.c
+12
-1
未找到文件。
fs/xfs/xfs_bmap.c
浏览文件 @
324bb261
...
...
@@ -3648,10 +3648,19 @@ xfs_bmap_btalloc(
int
isaligned
;
int
tryagain
;
int
error
;
int
stripe_align
;
ASSERT
(
ap
->
length
);
mp
=
ap
->
ip
->
i_mount
;
/* stripe alignment for allocation is determined by mount parameters */
stripe_align
=
0
;
if
(
mp
->
m_swidth
&&
(
mp
->
m_flags
&
XFS_MOUNT_SWALLOC
))
stripe_align
=
mp
->
m_swidth
;
else
if
(
mp
->
m_dalign
)
stripe_align
=
mp
->
m_dalign
;
align
=
ap
->
userdata
?
xfs_get_extsz_hint
(
ap
->
ip
)
:
0
;
if
(
unlikely
(
align
))
{
error
=
xfs_bmap_extsize_align
(
mp
,
&
ap
->
got
,
&
ap
->
prev
,
...
...
@@ -3660,6 +3669,8 @@ xfs_bmap_btalloc(
ASSERT
(
!
error
);
ASSERT
(
ap
->
length
);
}
nullfb
=
*
ap
->
firstblock
==
NULLFSBLOCK
;
fb_agno
=
nullfb
?
NULLAGNUMBER
:
XFS_FSB_TO_AGNO
(
mp
,
*
ap
->
firstblock
);
if
(
nullfb
)
{
...
...
@@ -3735,7 +3746,7 @@ xfs_bmap_btalloc(
*/
if
(
!
ap
->
flist
->
xbf_low
&&
ap
->
aeof
)
{
if
(
!
ap
->
offset
)
{
args
.
alignment
=
mp
->
m_d
align
;
args
.
alignment
=
stripe_
align
;
atype
=
args
.
type
;
isaligned
=
1
;
/*
...
...
@@ -3760,13 +3771,13 @@ xfs_bmap_btalloc(
* of minlen+alignment+slop doesn't go up
* between the calls.
*/
if
(
blen
>
mp
->
m_d
align
&&
blen
<=
args
.
maxlen
)
nextminlen
=
blen
-
mp
->
m_d
align
;
if
(
blen
>
stripe_
align
&&
blen
<=
args
.
maxlen
)
nextminlen
=
blen
-
stripe_
align
;
else
nextminlen
=
args
.
minlen
;
if
(
nextminlen
+
mp
->
m_d
align
>
args
.
minlen
+
1
)
if
(
nextminlen
+
stripe_
align
>
args
.
minlen
+
1
)
args
.
minalignslop
=
nextminlen
+
mp
->
m_d
align
-
nextminlen
+
stripe_
align
-
args
.
minlen
-
1
;
else
args
.
minalignslop
=
0
;
...
...
@@ -3788,7 +3799,7 @@ xfs_bmap_btalloc(
*/
args
.
type
=
atype
;
args
.
fsbno
=
ap
->
blkno
;
args
.
alignment
=
mp
->
m_d
align
;
args
.
alignment
=
stripe_
align
;
args
.
minlen
=
nextminlen
;
args
.
minalignslop
=
0
;
isaligned
=
1
;
...
...
fs/xfs/xfs_bmap_util.c
浏览文件 @
324bb261
...
...
@@ -1187,7 +1187,12 @@ xfs_zero_remaining_bytes(
XFS_BUF_UNWRITE
(
bp
);
XFS_BUF_READ
(
bp
);
XFS_BUF_SET_ADDR
(
bp
,
xfs_fsb_to_db
(
ip
,
imap
.
br_startblock
));
xfsbdstrat
(
mp
,
bp
);
if
(
XFS_FORCED_SHUTDOWN
(
mp
))
{
error
=
XFS_ERROR
(
EIO
);
break
;
}
xfs_buf_iorequest
(
bp
);
error
=
xfs_buf_iowait
(
bp
);
if
(
error
)
{
xfs_buf_ioerror_alert
(
bp
,
...
...
@@ -1200,7 +1205,12 @@ xfs_zero_remaining_bytes(
XFS_BUF_UNDONE
(
bp
);
XFS_BUF_UNREAD
(
bp
);
XFS_BUF_WRITE
(
bp
);
xfsbdstrat
(
mp
,
bp
);
if
(
XFS_FORCED_SHUTDOWN
(
mp
))
{
error
=
XFS_ERROR
(
EIO
);
break
;
}
xfs_buf_iorequest
(
bp
);
error
=
xfs_buf_iowait
(
bp
);
if
(
error
)
{
xfs_buf_ioerror_alert
(
bp
,
...
...
fs/xfs/xfs_buf.c
浏览文件 @
324bb261
...
...
@@ -698,7 +698,11 @@ xfs_buf_read_uncached(
bp
->
b_flags
|=
XBF_READ
;
bp
->
b_ops
=
ops
;
xfsbdstrat
(
target
->
bt_mount
,
bp
);
if
(
XFS_FORCED_SHUTDOWN
(
target
->
bt_mount
))
{
xfs_buf_relse
(
bp
);
return
NULL
;
}
xfs_buf_iorequest
(
bp
);
xfs_buf_iowait
(
bp
);
return
bp
;
}
...
...
@@ -1089,7 +1093,7 @@ xfs_bioerror(
* This is meant for userdata errors; metadata bufs come with
* iodone functions attached, so that we can track down errors.
*/
STATIC
int
int
xfs_bioerror_relse
(
struct
xfs_buf
*
bp
)
{
...
...
@@ -1152,7 +1156,7 @@ xfs_bwrite(
ASSERT
(
xfs_buf_islocked
(
bp
));
bp
->
b_flags
|=
XBF_WRITE
;
bp
->
b_flags
&=
~
(
XBF_ASYNC
|
XBF_READ
|
_XBF_DELWRI_Q
);
bp
->
b_flags
&=
~
(
XBF_ASYNC
|
XBF_READ
|
_XBF_DELWRI_Q
|
XBF_WRITE_FAIL
);
xfs_bdstrat_cb
(
bp
);
...
...
@@ -1164,25 +1168,6 @@ xfs_bwrite(
return
error
;
}
/*
* Wrapper around bdstrat so that we can stop data from going to disk in case
* we are shutting down the filesystem. Typically user data goes thru this
* path; one of the exceptions is the superblock.
*/
void
xfsbdstrat
(
struct
xfs_mount
*
mp
,
struct
xfs_buf
*
bp
)
{
if
(
XFS_FORCED_SHUTDOWN
(
mp
))
{
trace_xfs_bdstrat_shut
(
bp
,
_RET_IP_
);
xfs_bioerror_relse
(
bp
);
return
;
}
xfs_buf_iorequest
(
bp
);
}
STATIC
void
_xfs_buf_ioend
(
xfs_buf_t
*
bp
,
...
...
@@ -1516,6 +1501,12 @@ xfs_wait_buftarg(
struct
xfs_buf
*
bp
;
bp
=
list_first_entry
(
&
dispose
,
struct
xfs_buf
,
b_lru
);
list_del_init
(
&
bp
->
b_lru
);
if
(
bp
->
b_flags
&
XBF_WRITE_FAIL
)
{
xfs_alert
(
btp
->
bt_mount
,
"Corruption Alert: Buffer at block 0x%llx had permanent write failures!
\n
"
"Please run xfs_repair to determine the extent of the problem."
,
(
long
long
)
bp
->
b_bn
);
}
xfs_buf_rele
(
bp
);
}
if
(
loop
++
!=
0
)
...
...
@@ -1789,7 +1780,7 @@ __xfs_buf_delwri_submit(
blk_start_plug
(
&
plug
);
list_for_each_entry_safe
(
bp
,
n
,
io_list
,
b_list
)
{
bp
->
b_flags
&=
~
(
_XBF_DELWRI_Q
|
XBF_ASYNC
);
bp
->
b_flags
&=
~
(
_XBF_DELWRI_Q
|
XBF_ASYNC
|
XBF_WRITE_FAIL
);
bp
->
b_flags
|=
XBF_WRITE
;
if
(
!
wait
)
{
...
...
fs/xfs/xfs_buf.h
浏览文件 @
324bb261
...
...
@@ -45,6 +45,7 @@ typedef enum {
#define XBF_ASYNC (1 << 4)
/* initiator will not wait for completion */
#define XBF_DONE (1 << 5)
/* all pages in the buffer uptodate */
#define XBF_STALE (1 << 6)
/* buffer has been staled, do not find it */
#define XBF_WRITE_FAIL (1 << 24)
/* async writes have failed on this buffer */
/* I/O hints for the BIO layer */
#define XBF_SYNCIO (1 << 10)
/* treat this buffer as synchronous I/O */
...
...
@@ -70,6 +71,7 @@ typedef unsigned int xfs_buf_flags_t;
{ XBF_ASYNC, "ASYNC" }, \
{ XBF_DONE, "DONE" }, \
{ XBF_STALE, "STALE" }, \
{ XBF_WRITE_FAIL, "WRITE_FAIL" }, \
{ XBF_SYNCIO, "SYNCIO" }, \
{ XBF_FUA, "FUA" }, \
{ XBF_FLUSH, "FLUSH" }, \
...
...
@@ -80,6 +82,7 @@ typedef unsigned int xfs_buf_flags_t;
{ _XBF_DELWRI_Q, "DELWRI_Q" }, \
{ _XBF_COMPOUND, "COMPOUND" }
/*
* Internal state flags.
*/
...
...
@@ -269,9 +272,6 @@ extern void xfs_buf_unlock(xfs_buf_t *);
/* Buffer Read and Write Routines */
extern
int
xfs_bwrite
(
struct
xfs_buf
*
bp
);
extern
void
xfsbdstrat
(
struct
xfs_mount
*
,
struct
xfs_buf
*
);
extern
void
xfs_buf_ioend
(
xfs_buf_t
*
,
int
);
extern
void
xfs_buf_ioerror
(
xfs_buf_t
*
,
int
);
extern
void
xfs_buf_ioerror_alert
(
struct
xfs_buf
*
,
const
char
*
func
);
...
...
@@ -282,6 +282,8 @@ extern void xfs_buf_iomove(xfs_buf_t *, size_t, size_t, void *,
#define xfs_buf_zero(bp, off, len) \
xfs_buf_iomove((bp), (off), (len), NULL, XBRW_ZERO)
extern
int
xfs_bioerror_relse
(
struct
xfs_buf
*
);
static
inline
int
xfs_buf_geterror
(
xfs_buf_t
*
bp
)
{
return
bp
?
bp
->
b_error
:
ENOMEM
;
...
...
@@ -301,7 +303,8 @@ extern void xfs_buf_terminate(void);
#define XFS_BUF_ZEROFLAGS(bp) \
((bp)->b_flags &= ~(XBF_READ|XBF_WRITE|XBF_ASYNC| \
XBF_SYNCIO|XBF_FUA|XBF_FLUSH))
XBF_SYNCIO|XBF_FUA|XBF_FLUSH| \
XBF_WRITE_FAIL))
void
xfs_buf_stale
(
struct
xfs_buf
*
bp
);
#define XFS_BUF_UNSTALE(bp) ((bp)->b_flags &= ~XBF_STALE)
...
...
fs/xfs/xfs_buf_item.c
浏览文件 @
324bb261
...
...
@@ -495,6 +495,14 @@ xfs_buf_item_unpin(
}
}
/*
* Buffer IO error rate limiting. Limit it to no more than 10 messages per 30
* seconds so as to not spam logs too much on repeated detection of the same
* buffer being bad..
*/
DEFINE_RATELIMIT_STATE
(
xfs_buf_write_fail_rl_state
,
30
*
HZ
,
10
);
STATIC
uint
xfs_buf_item_push
(
struct
xfs_log_item
*
lip
,
...
...
@@ -523,6 +531,14 @@ xfs_buf_item_push(
trace_xfs_buf_item_push
(
bip
);
/* has a previous flush failed due to IO errors? */
if
((
bp
->
b_flags
&
XBF_WRITE_FAIL
)
&&
___ratelimit
(
&
xfs_buf_write_fail_rl_state
,
"XFS:"
))
{
xfs_warn
(
bp
->
b_target
->
bt_mount
,
"Detected failing async write on buffer block 0x%llx. Retrying async write.
\n
"
,
(
long
long
)
bp
->
b_bn
);
}
if
(
!
xfs_buf_delwri_queue
(
bp
,
buffer_list
))
rval
=
XFS_ITEM_FLUSHING
;
xfs_buf_unlock
(
bp
);
...
...
@@ -1095,8 +1111,9 @@ xfs_buf_iodone_callbacks(
xfs_buf_ioerror
(
bp
,
0
);
/* errno of 0 unsets the flag */
if
(
!
XFS_BUF_ISSTALE
(
bp
))
{
bp
->
b_flags
|=
XBF_WRITE
|
XBF_ASYNC
|
XBF_DONE
;
if
(
!
(
bp
->
b_flags
&
(
XBF_STALE
|
XBF_WRITE_FAIL
)))
{
bp
->
b_flags
|=
XBF_WRITE
|
XBF_ASYNC
|
XBF_DONE
|
XBF_WRITE_FAIL
;
xfs_buf_iorequest
(
bp
);
}
else
{
xfs_buf_relse
(
bp
);
...
...
fs/xfs/xfs_log_recover.c
浏览文件 @
324bb261
...
...
@@ -193,7 +193,10 @@ xlog_bread_noalign(
bp
->
b_io_length
=
nbblks
;
bp
->
b_error
=
0
;
xfsbdstrat
(
log
->
l_mp
,
bp
);
if
(
XFS_FORCED_SHUTDOWN
(
log
->
l_mp
))
return
XFS_ERROR
(
EIO
);
xfs_buf_iorequest
(
bp
);
error
=
xfs_buf_iowait
(
bp
);
if
(
error
)
xfs_buf_ioerror_alert
(
bp
,
__func__
);
...
...
@@ -4408,7 +4411,13 @@ xlog_do_recover(
XFS_BUF_READ
(
bp
);
XFS_BUF_UNASYNC
(
bp
);
bp
->
b_ops
=
&
xfs_sb_buf_ops
;
xfsbdstrat
(
log
->
l_mp
,
bp
);
if
(
XFS_FORCED_SHUTDOWN
(
log
->
l_mp
))
{
xfs_buf_relse
(
bp
);
return
XFS_ERROR
(
EIO
);
}
xfs_buf_iorequest
(
bp
);
error
=
xfs_buf_iowait
(
bp
);
if
(
error
)
{
xfs_buf_ioerror_alert
(
bp
,
__func__
);
...
...
fs/xfs/xfs_trans_buf.c
浏览文件 @
324bb261
...
...
@@ -314,7 +314,18 @@ xfs_trans_read_buf_map(
ASSERT
(
bp
->
b_iodone
==
NULL
);
XFS_BUF_READ
(
bp
);
bp
->
b_ops
=
ops
;
xfsbdstrat
(
tp
->
t_mountp
,
bp
);
/*
* XXX(hch): clean up the error handling here to be less
* of a mess..
*/
if
(
XFS_FORCED_SHUTDOWN
(
mp
))
{
trace_xfs_bdstrat_shut
(
bp
,
_RET_IP_
);
xfs_bioerror_relse
(
bp
);
}
else
{
xfs_buf_iorequest
(
bp
);
}
error
=
xfs_buf_iowait
(
bp
);
if
(
error
)
{
xfs_buf_ioerror_alert
(
bp
,
__func__
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录