Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
4ef51e8b
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
160
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
4ef51e8b
编写于
6月 17, 2015
作者:
A
Al Viro
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'for-linus' into for-next
上级
b853a161
e4f95517
变更
9
显示空白变更内容
内联
并排
Showing
9 changed file
with
85 addition
and
79 deletion
+85
-79
fs/dcache.c
fs/dcache.c
+4
-4
fs/ncpfs/dir.c
fs/ncpfs/dir.c
+2
-0
fs/ufs/balloc.c
fs/ufs/balloc.c
+17
-17
fs/ufs/dir.c
fs/ufs/dir.c
+4
-2
fs/ufs/ialloc.c
fs/ufs/ialloc.c
+8
-8
fs/ufs/inode.c
fs/ufs/inode.c
+4
-1
fs/ufs/namei.c
fs/ufs/namei.c
+33
-46
fs/ufs/super.c
fs/ufs/super.c
+11
-0
fs/ufs/ufs.h
fs/ufs/ufs.h
+2
-1
未找到文件。
fs/dcache.c
浏览文件 @
4ef51e8b
...
...
@@ -1239,13 +1239,13 @@ static void d_walk(struct dentry *parent, void *data,
/* might go back up the wrong parent if we have had a rename. */
if
(
need_seqretry
(
&
rename_lock
,
seq
))
goto
rename_retry
;
/* go into the first sibling still alive */
do
{
next
=
child
->
d_child
.
next
;
while
(
unlikely
(
child
->
d_flags
&
DCACHE_DENTRY_KILLED
))
{
if
(
next
==
&
this_parent
->
d_subdirs
)
goto
ascend
;
child
=
list_entry
(
next
,
struct
dentry
,
d_child
);
next
=
next
->
next
;
}
}
while
(
unlikely
(
child
->
d_flags
&
DCACHE_DENTRY_KILLED
));
rcu_read_unlock
();
goto
resume
;
}
...
...
fs/ncpfs/dir.c
浏览文件 @
4ef51e8b
...
...
@@ -1145,6 +1145,8 @@ static int ncp_rename(struct inode *old_dir, struct dentry *old_dentry,
case
0x00
:
ncp_dbg
(
1
,
"renamed %pd -> %pd
\n
"
,
old_dentry
,
new_dentry
);
ncp_d_prune
(
old_dentry
);
ncp_d_prune
(
new_dentry
);
break
;
case
0x9E
:
error
=
-
ENAMETOOLONG
;
...
...
fs/ufs/balloc.c
浏览文件 @
4ef51e8b
...
...
@@ -52,7 +52,7 @@ void ufs_free_fragments(struct inode *inode, u64 fragment, unsigned count)
if
(
ufs_fragnum
(
fragment
)
+
count
>
uspi
->
s_fpg
)
ufs_error
(
sb
,
"ufs_free_fragments"
,
"internal error"
);
lock_ufs
(
sb
);
mutex_lock
(
&
UFS_SB
(
sb
)
->
s_lock
);
cgno
=
ufs_dtog
(
uspi
,
fragment
);
bit
=
ufs_dtogd
(
uspi
,
fragment
);
...
...
@@ -116,12 +116,12 @@ void ufs_free_fragments(struct inode *inode, u64 fragment, unsigned count)
ubh_sync_block
(
UCPI_UBH
(
ucpi
));
ufs_mark_sb_dirty
(
sb
);
unlock_ufs
(
sb
);
mutex_unlock
(
&
UFS_SB
(
sb
)
->
s_lock
);
UFSD
(
"EXIT
\n
"
);
return
;
failed:
unlock_ufs
(
sb
);
mutex_unlock
(
&
UFS_SB
(
sb
)
->
s_lock
);
UFSD
(
"EXIT (FAILED)
\n
"
);
return
;
}
...
...
@@ -151,7 +151,7 @@ void ufs_free_blocks(struct inode *inode, u64 fragment, unsigned count)
goto
failed
;
}
lock_ufs
(
sb
);
mutex_lock
(
&
UFS_SB
(
sb
)
->
s_lock
);
do_more:
overflow
=
0
;
...
...
@@ -211,12 +211,12 @@ void ufs_free_blocks(struct inode *inode, u64 fragment, unsigned count)
}
ufs_mark_sb_dirty
(
sb
);
unlock_ufs
(
sb
);
mutex_unlock
(
&
UFS_SB
(
sb
)
->
s_lock
);
UFSD
(
"EXIT
\n
"
);
return
;
failed_unlock:
unlock_ufs
(
sb
);
mutex_unlock
(
&
UFS_SB
(
sb
)
->
s_lock
);
failed:
UFSD
(
"EXIT (FAILED)
\n
"
);
return
;
...
...
@@ -357,7 +357,7 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment,
usb1
=
ubh_get_usb_first
(
uspi
);
*
err
=
-
ENOSPC
;
lock_ufs
(
sb
);
mutex_lock
(
&
UFS_SB
(
sb
)
->
s_lock
);
tmp
=
ufs_data_ptr_to_cpu
(
sb
,
p
);
if
(
count
+
ufs_fragnum
(
fragment
)
>
uspi
->
s_fpb
)
{
...
...
@@ -378,19 +378,19 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment,
"fragment %llu, tmp %llu
\n
"
,
(
unsigned
long
long
)
fragment
,
(
unsigned
long
long
)
tmp
);
unlock_ufs
(
sb
);
mutex_unlock
(
&
UFS_SB
(
sb
)
->
s_lock
);
return
INVBLOCK
;
}
if
(
fragment
<
UFS_I
(
inode
)
->
i_lastfrag
)
{
UFSD
(
"EXIT (ALREADY ALLOCATED)
\n
"
);
unlock_ufs
(
sb
);
mutex_unlock
(
&
UFS_SB
(
sb
)
->
s_lock
);
return
0
;
}
}
else
{
if
(
tmp
)
{
UFSD
(
"EXIT (ALREADY ALLOCATED)
\n
"
);
unlock_ufs
(
sb
);
mutex_unlock
(
&
UFS_SB
(
sb
)
->
s_lock
);
return
0
;
}
}
...
...
@@ -399,7 +399,7 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment,
* There is not enough space for user on the device
*/
if
(
!
capable
(
CAP_SYS_RESOURCE
)
&&
ufs_freespace
(
uspi
,
UFS_MINFREE
)
<=
0
)
{
unlock_ufs
(
sb
);
mutex_unlock
(
&
UFS_SB
(
sb
)
->
s_lock
);
UFSD
(
"EXIT (FAILED)
\n
"
);
return
0
;
}
...
...
@@ -424,7 +424,7 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment,
ufs_clear_frags
(
inode
,
result
+
oldcount
,
newcount
-
oldcount
,
locked_page
!=
NULL
);
}
unlock_ufs
(
sb
);
mutex_unlock
(
&
UFS_SB
(
sb
)
->
s_lock
);
UFSD
(
"EXIT, result %llu
\n
"
,
(
unsigned
long
long
)
result
);
return
result
;
}
...
...
@@ -439,7 +439,7 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment,
fragment
+
count
);
ufs_clear_frags
(
inode
,
result
+
oldcount
,
newcount
-
oldcount
,
locked_page
!=
NULL
);
unlock_ufs
(
sb
);
mutex_unlock
(
&
UFS_SB
(
sb
)
->
s_lock
);
UFSD
(
"EXIT, result %llu
\n
"
,
(
unsigned
long
long
)
result
);
return
result
;
}
...
...
@@ -477,7 +477,7 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment,
*
err
=
0
;
UFS_I
(
inode
)
->
i_lastfrag
=
max
(
UFS_I
(
inode
)
->
i_lastfrag
,
fragment
+
count
);
unlock_ufs
(
sb
);
mutex_unlock
(
&
UFS_SB
(
sb
)
->
s_lock
);
if
(
newcount
<
request
)
ufs_free_fragments
(
inode
,
result
+
newcount
,
request
-
newcount
);
ufs_free_fragments
(
inode
,
tmp
,
oldcount
);
...
...
@@ -485,7 +485,7 @@ u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment,
return
result
;
}
unlock_ufs
(
sb
);
mutex_unlock
(
&
UFS_SB
(
sb
)
->
s_lock
);
UFSD
(
"EXIT (FAILED)
\n
"
);
return
0
;
}
...
...
fs/ufs/dir.c
浏览文件 @
4ef51e8b
...
...
@@ -87,7 +87,8 @@ ino_t ufs_inode_by_name(struct inode *dir, const struct qstr *qstr)
/* Releases the page */
void
ufs_set_link
(
struct
inode
*
dir
,
struct
ufs_dir_entry
*
de
,
struct
page
*
page
,
struct
inode
*
inode
)
struct
page
*
page
,
struct
inode
*
inode
,
bool
update_times
)
{
loff_t
pos
=
page_offset
(
page
)
+
(
char
*
)
de
-
(
char
*
)
page_address
(
page
);
...
...
@@ -103,6 +104,7 @@ void ufs_set_link(struct inode *dir, struct ufs_dir_entry *de,
err
=
ufs_commit_chunk
(
page
,
pos
,
len
);
ufs_put_page
(
page
);
if
(
update_times
)
dir
->
i_mtime
=
dir
->
i_ctime
=
CURRENT_TIME_SEC
;
mark_inode_dirty
(
dir
);
}
...
...
fs/ufs/ialloc.c
浏览文件 @
4ef51e8b
...
...
@@ -69,11 +69,11 @@ void ufs_free_inode (struct inode * inode)
ino
=
inode
->
i_ino
;
lock_ufs
(
sb
);
mutex_lock
(
&
UFS_SB
(
sb
)
->
s_lock
);
if
(
!
((
ino
>
1
)
&&
(
ino
<
(
uspi
->
s_ncg
*
uspi
->
s_ipg
))))
{
ufs_warning
(
sb
,
"ufs_free_inode"
,
"reserved inode or nonexistent inode %u
\n
"
,
ino
);
unlock_ufs
(
sb
);
mutex_unlock
(
&
UFS_SB
(
sb
)
->
s_lock
);
return
;
}
...
...
@@ -81,7 +81,7 @@ void ufs_free_inode (struct inode * inode)
bit
=
ufs_inotocgoff
(
ino
);
ucpi
=
ufs_load_cylinder
(
sb
,
cg
);
if
(
!
ucpi
)
{
unlock_ufs
(
sb
);
mutex_unlock
(
&
UFS_SB
(
sb
)
->
s_lock
);
return
;
}
ucg
=
ubh_get_ucg
(
UCPI_UBH
(
ucpi
));
...
...
@@ -115,7 +115,7 @@ void ufs_free_inode (struct inode * inode)
ubh_sync_block
(
UCPI_UBH
(
ucpi
));
ufs_mark_sb_dirty
(
sb
);
unlock_ufs
(
sb
);
mutex_unlock
(
&
UFS_SB
(
sb
)
->
s_lock
);
UFSD
(
"EXIT
\n
"
);
}
...
...
@@ -193,7 +193,7 @@ struct inode *ufs_new_inode(struct inode *dir, umode_t mode)
sbi
=
UFS_SB
(
sb
);
uspi
=
sbi
->
s_uspi
;
lock_ufs
(
sb
);
mutex_lock
(
&
sbi
->
s_lock
);
/*
* Try to place the inode in its parent directory
...
...
@@ -331,21 +331,21 @@ struct inode *ufs_new_inode(struct inode *dir, umode_t mode)
sync_dirty_buffer
(
bh
);
brelse
(
bh
);
}
unlock_ufs
(
sb
);
mutex_unlock
(
&
sbi
->
s_lock
);
UFSD
(
"allocating inode %lu
\n
"
,
inode
->
i_ino
);
UFSD
(
"EXIT
\n
"
);
return
inode
;
fail_remove_inode:
unlock_ufs
(
sb
);
mutex_unlock
(
&
sbi
->
s_lock
);
clear_nlink
(
inode
);
unlock_new_inode
(
inode
);
iput
(
inode
);
UFSD
(
"EXIT (FAILED): err %d
\n
"
,
err
);
return
ERR_PTR
(
err
);
failed:
unlock_ufs
(
sb
);
mutex_unlock
(
&
sbi
->
s_lock
);
make_bad_inode
(
inode
);
iput
(
inode
);
UFSD
(
"EXIT (FAILED): err %d
\n
"
,
err
);
...
...
fs/ufs/inode.c
浏览文件 @
4ef51e8b
...
...
@@ -903,6 +903,9 @@ void ufs_evict_inode(struct inode * inode)
invalidate_inode_buffers
(
inode
);
clear_inode
(
inode
);
if
(
want_delete
)
if
(
want_delete
)
{
lock_ufs
(
inode
->
i_sb
);
ufs_free_inode
(
inode
);
unlock_ufs
(
inode
->
i_sb
);
}
}
fs/ufs/namei.c
浏览文件 @
4ef51e8b
...
...
@@ -56,11 +56,9 @@ static struct dentry *ufs_lookup(struct inode * dir, struct dentry *dentry, unsi
if
(
dentry
->
d_name
.
len
>
UFS_MAXNAMLEN
)
return
ERR_PTR
(
-
ENAMETOOLONG
);
lock_ufs
(
dir
->
i_sb
);
ino
=
ufs_inode_by_name
(
dir
,
&
dentry
->
d_name
);
if
(
ino
)
inode
=
ufs_iget
(
dir
->
i_sb
,
ino
);
unlock_ufs
(
dir
->
i_sb
);
return
d_splice_alias
(
inode
,
dentry
);
}
...
...
@@ -76,24 +74,16 @@ static int ufs_create (struct inode * dir, struct dentry * dentry, umode_t mode,
bool
excl
)
{
struct
inode
*
inode
;
int
err
;
UFSD
(
"BEGIN
\n
"
);
inode
=
ufs_new_inode
(
dir
,
mode
);
err
=
PTR_ERR
(
inode
);
if
(
IS_ERR
(
inode
))
return
PTR_ERR
(
inode
);
if
(
!
IS_ERR
(
inode
))
{
inode
->
i_op
=
&
ufs_file_inode_operations
;
inode
->
i_fop
=
&
ufs_file_operations
;
inode
->
i_mapping
->
a_ops
=
&
ufs_aops
;
mark_inode_dirty
(
inode
);
lock_ufs
(
dir
->
i_sb
);
err
=
ufs_add_nondir
(
dentry
,
inode
);
unlock_ufs
(
dir
->
i_sb
);
}
UFSD
(
"END: err=%d
\n
"
,
err
);
return
err
;
return
ufs_add_nondir
(
dentry
,
inode
);
}
static
int
ufs_mknod
(
struct
inode
*
dir
,
struct
dentry
*
dentry
,
umode_t
mode
,
dev_t
rdev
)
...
...
@@ -110,9 +100,7 @@ static int ufs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev
init_special_inode
(
inode
,
mode
,
rdev
);
ufs_set_inode_dev
(
inode
->
i_sb
,
UFS_I
(
inode
),
rdev
);
mark_inode_dirty
(
inode
);
lock_ufs
(
dir
->
i_sb
);
err
=
ufs_add_nondir
(
dentry
,
inode
);
unlock_ufs
(
dir
->
i_sb
);
}
return
err
;
}
...
...
@@ -121,19 +109,18 @@ static int ufs_symlink (struct inode * dir, struct dentry * dentry,
const
char
*
symname
)
{
struct
super_block
*
sb
=
dir
->
i_sb
;
int
err
=
-
ENAMETOOLONG
;
int
err
;
unsigned
l
=
strlen
(
symname
)
+
1
;
struct
inode
*
inode
;
if
(
l
>
sb
->
s_blocksize
)
goto
out_notlocked
;
return
-
ENAMETOOLONG
;
inode
=
ufs_new_inode
(
dir
,
S_IFLNK
|
S_IRWXUGO
);
err
=
PTR_ERR
(
inode
);
if
(
IS_ERR
(
inode
))
goto
out_notlocked
;
return
err
;
lock_ufs
(
dir
->
i_sb
);
if
(
l
>
UFS_SB
(
sb
)
->
s_uspi
->
s_maxsymlinklen
)
{
/* slow symlink */
inode
->
i_op
=
&
ufs_symlink_inode_operations
;
...
...
@@ -150,17 +137,13 @@ static int ufs_symlink (struct inode * dir, struct dentry * dentry,
}
mark_inode_dirty
(
inode
);
err
=
ufs_add_nondir
(
dentry
,
inode
);
out:
unlock_ufs
(
dir
->
i_sb
);
out_notlocked:
return
err
;
return
ufs_add_nondir
(
dentry
,
inode
);
out_fail:
inode_dec_link_count
(
inode
);
unlock_new_inode
(
inode
);
iput
(
inode
);
goto
out
;
return
err
;
}
static
int
ufs_link
(
struct
dentry
*
old_dentry
,
struct
inode
*
dir
,
...
...
@@ -169,14 +152,16 @@ static int ufs_link (struct dentry * old_dentry, struct inode * dir,
struct
inode
*
inode
=
d_inode
(
old_dentry
);
int
error
;
lock_ufs
(
dir
->
i_sb
);
inode
->
i_ctime
=
CURRENT_TIME_SEC
;
inode_inc_link_count
(
inode
);
ihold
(
inode
);
error
=
ufs_add_nondir
(
dentry
,
inode
);
unlock_ufs
(
dir
->
i_sb
);
error
=
ufs_add_link
(
dentry
,
inode
);
if
(
error
)
{
inode_dec_link_count
(
inode
);
iput
(
inode
);
}
else
d_instantiate
(
dentry
,
inode
);
return
error
;
}
...
...
@@ -185,9 +170,12 @@ static int ufs_mkdir(struct inode * dir, struct dentry * dentry, umode_t mode)
struct
inode
*
inode
;
int
err
;
inode_inc_link_count
(
dir
);
inode
=
ufs_new_inode
(
dir
,
S_IFDIR
|
mode
);
err
=
PTR_ERR
(
inode
);
if
(
IS_ERR
(
inode
))
return
PTR_ERR
(
inode
)
;
goto
out_dir
;
inode
->
i_op
=
&
ufs_dir_inode_operations
;
inode
->
i_fop
=
&
ufs_dir_operations
;
...
...
@@ -195,9 +183,6 @@ static int ufs_mkdir(struct inode * dir, struct dentry * dentry, umode_t mode)
inode_inc_link_count
(
inode
);
lock_ufs
(
dir
->
i_sb
);
inode_inc_link_count
(
dir
);
err
=
ufs_make_empty
(
inode
,
dir
);
if
(
err
)
goto
out_fail
;
...
...
@@ -205,20 +190,19 @@ static int ufs_mkdir(struct inode * dir, struct dentry * dentry, umode_t mode)
err
=
ufs_add_link
(
dentry
,
inode
);
if
(
err
)
goto
out_fail
;
unlock_ufs
(
dir
->
i_sb
);
unlock_new_inode
(
inode
);
d_instantiate
(
dentry
,
inode
);
out:
return
err
;
return
0
;
out_fail:
inode_dec_link_count
(
inode
);
inode_dec_link_count
(
inode
);
unlock_new_inode
(
inode
);
iput
(
inode
);
out_dir:
inode_dec_link_count
(
dir
);
unlock_ufs
(
dir
->
i_sb
);
goto
out
;
return
err
;
}
static
int
ufs_unlink
(
struct
inode
*
dir
,
struct
dentry
*
dentry
)
...
...
@@ -248,7 +232,6 @@ static int ufs_rmdir (struct inode * dir, struct dentry *dentry)
struct
inode
*
inode
=
d_inode
(
dentry
);
int
err
=
-
ENOTEMPTY
;
lock_ufs
(
dir
->
i_sb
);
if
(
ufs_empty_dir
(
inode
))
{
err
=
ufs_unlink
(
dir
,
dentry
);
if
(
!
err
)
{
...
...
@@ -257,7 +240,6 @@ static int ufs_rmdir (struct inode * dir, struct dentry *dentry)
inode_dec_link_count
(
dir
);
}
}
unlock_ufs
(
dir
->
i_sb
);
return
err
;
}
...
...
@@ -295,7 +277,7 @@ static int ufs_rename(struct inode *old_dir, struct dentry *old_dentry,
new_de
=
ufs_find_entry
(
new_dir
,
&
new_dentry
->
d_name
,
&
new_page
);
if
(
!
new_de
)
goto
out_dir
;
ufs_set_link
(
new_dir
,
new_de
,
new_page
,
old_inode
);
ufs_set_link
(
new_dir
,
new_de
,
new_page
,
old_inode
,
1
);
new_inode
->
i_ctime
=
CURRENT_TIME_SEC
;
if
(
dir_de
)
drop_nlink
(
new_inode
);
...
...
@@ -318,7 +300,12 @@ static int ufs_rename(struct inode *old_dir, struct dentry *old_dentry,
mark_inode_dirty
(
old_inode
);
if
(
dir_de
)
{
ufs_set_link
(
old_inode
,
dir_de
,
dir_page
,
new_dir
);
if
(
old_dir
!=
new_dir
)
ufs_set_link
(
old_inode
,
dir_de
,
dir_page
,
new_dir
,
0
);
else
{
kunmap
(
dir_page
);
page_cache_release
(
dir_page
);
}
inode_dec_link_count
(
old_dir
);
}
return
0
;
...
...
fs/ufs/super.c
浏览文件 @
4ef51e8b
...
...
@@ -694,6 +694,7 @@ static int ufs_sync_fs(struct super_block *sb, int wait)
unsigned
flags
;
lock_ufs
(
sb
);
mutex_lock
(
&
UFS_SB
(
sb
)
->
s_lock
);
UFSD
(
"ENTER
\n
"
);
...
...
@@ -711,6 +712,7 @@ static int ufs_sync_fs(struct super_block *sb, int wait)
ufs_put_cstotal
(
sb
);
UFSD
(
"EXIT
\n
"
);
mutex_unlock
(
&
UFS_SB
(
sb
)
->
s_lock
);
unlock_ufs
(
sb
);
return
0
;
...
...
@@ -799,6 +801,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
UFSD
(
"flag %u
\n
"
,
(
int
)(
sb
->
s_flags
&
MS_RDONLY
));
mutex_init
(
&
sbi
->
mutex
);
mutex_init
(
&
sbi
->
s_lock
);
spin_lock_init
(
&
sbi
->
work_lock
);
INIT_DELAYED_WORK
(
&
sbi
->
sync_work
,
delayed_sync_fs
);
/*
...
...
@@ -1277,6 +1280,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data)
sync_filesystem
(
sb
);
lock_ufs
(
sb
);
mutex_lock
(
&
UFS_SB
(
sb
)
->
s_lock
);
uspi
=
UFS_SB
(
sb
)
->
s_uspi
;
flags
=
UFS_SB
(
sb
)
->
s_flags
;
usb1
=
ubh_get_usb_first
(
uspi
);
...
...
@@ -1290,6 +1294,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data)
new_mount_opt
=
0
;
ufs_set_opt
(
new_mount_opt
,
ONERROR_LOCK
);
if
(
!
ufs_parse_options
(
data
,
&
new_mount_opt
))
{
mutex_unlock
(
&
UFS_SB
(
sb
)
->
s_lock
);
unlock_ufs
(
sb
);
return
-
EINVAL
;
}
...
...
@@ -1297,12 +1302,14 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data)
new_mount_opt
|=
ufstype
;
}
else
if
((
new_mount_opt
&
UFS_MOUNT_UFSTYPE
)
!=
ufstype
)
{
pr_err
(
"ufstype can't be changed during remount
\n
"
);
mutex_unlock
(
&
UFS_SB
(
sb
)
->
s_lock
);
unlock_ufs
(
sb
);
return
-
EINVAL
;
}
if
((
*
mount_flags
&
MS_RDONLY
)
==
(
sb
->
s_flags
&
MS_RDONLY
))
{
UFS_SB
(
sb
)
->
s_mount_opt
=
new_mount_opt
;
mutex_unlock
(
&
UFS_SB
(
sb
)
->
s_lock
);
unlock_ufs
(
sb
);
return
0
;
}
...
...
@@ -1326,6 +1333,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data)
*/
#ifndef CONFIG_UFS_FS_WRITE
pr_err
(
"ufs was compiled with read-only support, can't be mounted as read-write
\n
"
);
mutex_unlock
(
&
UFS_SB
(
sb
)
->
s_lock
);
unlock_ufs
(
sb
);
return
-
EINVAL
;
#else
...
...
@@ -1335,11 +1343,13 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data)
ufstype
!=
UFS_MOUNT_UFSTYPE_SUNx86
&&
ufstype
!=
UFS_MOUNT_UFSTYPE_UFS2
)
{
pr_err
(
"this ufstype is read-only supported
\n
"
);
mutex_unlock
(
&
UFS_SB
(
sb
)
->
s_lock
);
unlock_ufs
(
sb
);
return
-
EINVAL
;
}
if
(
!
ufs_read_cylinder_structures
(
sb
))
{
pr_err
(
"failed during remounting
\n
"
);
mutex_unlock
(
&
UFS_SB
(
sb
)
->
s_lock
);
unlock_ufs
(
sb
);
return
-
EPERM
;
}
...
...
@@ -1347,6 +1357,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data)
#endif
}
UFS_SB
(
sb
)
->
s_mount_opt
=
new_mount_opt
;
mutex_unlock
(
&
UFS_SB
(
sb
)
->
s_lock
);
unlock_ufs
(
sb
);
return
0
;
}
...
...
fs/ufs/ufs.h
浏览文件 @
4ef51e8b
...
...
@@ -30,6 +30,7 @@ struct ufs_sb_info {
int
work_queued
;
/* non-zero if the delayed work is queued */
struct
delayed_work
sync_work
;
/* FS sync delayed work */
spinlock_t
work_lock
;
/* protects sync_work and work_queued */
struct
mutex
s_lock
;
};
struct
ufs_inode_info
{
...
...
@@ -105,7 +106,7 @@ extern int ufs_delete_entry(struct inode *, struct ufs_dir_entry *, struct page
extern
int
ufs_empty_dir
(
struct
inode
*
);
extern
struct
ufs_dir_entry
*
ufs_dotdot
(
struct
inode
*
,
struct
page
**
);
extern
void
ufs_set_link
(
struct
inode
*
dir
,
struct
ufs_dir_entry
*
de
,
struct
page
*
page
,
struct
inode
*
inode
);
struct
page
*
page
,
struct
inode
*
inode
,
bool
update_times
);
/* file.c */
extern
const
struct
inode_operations
ufs_file_inode_operations
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录