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
4ef51e8b
Commit
4ef51e8b
authored
Jun 17, 2015
by
Al Viro
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for-linus' into for-next
parents
b853a161
e4f95517
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
85 additions
and
79 deletions
+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
No files found.
fs/dcache.c
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
;
...
...
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