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
09d8b586
Commit
09d8b586
authored
Jul 04, 2017
by
Miklos Szeredi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ovl: move __upperdentry to ovl_inode
Signed-off-by:
Miklos Szeredi
<
mszeredi@redhat.com
>
parent
9020df37
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
79 additions
and
94 deletions
+79
-94
fs/overlayfs/copy_up.c
fs/overlayfs/copy_up.c
+1
-2
fs/overlayfs/dir.c
fs/overlayfs/dir.c
+4
-4
fs/overlayfs/inode.c
fs/overlayfs/inode.c
+17
-9
fs/overlayfs/namei.c
fs/overlayfs/namei.c
+3
-4
fs/overlayfs/overlayfs.h
fs/overlayfs/overlayfs.h
+7
-5
fs/overlayfs/ovl_entry.h
fs/overlayfs/ovl_entry.h
+6
-7
fs/overlayfs/super.c
fs/overlayfs/super.c
+9
-6
fs/overlayfs/util.c
fs/overlayfs/util.c
+32
-57
No files found.
fs/overlayfs/copy_up.c
View file @
09d8b586
...
...
@@ -417,8 +417,7 @@ static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir,
goto
out_cleanup
;
newdentry
=
dget
(
tmpfile
?
upper
:
temp
);
ovl_dentry_update
(
dentry
,
newdentry
);
ovl_inode_update
(
d_inode
(
dentry
),
d_inode
(
newdentry
));
ovl_inode_update
(
d_inode
(
dentry
),
newdentry
);
/* Restore timestamps on parent (best effort) */
ovl_set_timestamps
(
upperdir
,
pstat
);
...
...
fs/overlayfs/dir.c
View file @
09d8b586
...
...
@@ -154,12 +154,12 @@ static void ovl_instantiate(struct dentry *dentry, struct inode *inode,
struct
dentry
*
newdentry
,
bool
hardlink
)
{
ovl_dentry_version_inc
(
dentry
->
d_parent
);
ovl_dentry_update
(
dentry
,
newdentry
);
if
(
!
hardlink
)
{
ovl_inode_update
(
inode
,
d_inode
(
newdentry
)
);
ovl_inode_update
(
inode
,
newdentry
);
ovl_copyattr
(
newdentry
->
d_inode
,
inode
);
}
else
{
WARN_ON
(
ovl_inode_real
(
inode
,
NULL
)
!=
d_inode
(
newdentry
));
WARN_ON
(
ovl_inode_real
(
inode
)
!=
d_inode
(
newdentry
));
dput
(
newdentry
);
inc_nlink
(
inode
);
}
d_instantiate
(
dentry
,
inode
);
...
...
@@ -1003,7 +1003,7 @@ static int ovl_rename(struct inode *olddir, struct dentry *old,
new_opaque
=
ovl_dentry_is_opaque
(
new
);
err
=
-
ESTALE
;
if
(
ovl_dentry_upper
(
new
))
{
if
(
d_inode
(
new
)
&&
ovl_dentry_upper
(
new
))
{
if
(
opaquedir
)
{
if
(
newdentry
!=
opaquedir
)
goto
out_dput
;
...
...
fs/overlayfs/inode.c
View file @
09d8b586
...
...
@@ -134,8 +134,8 @@ int ovl_getattr(const struct path *path, struct kstat *stat,
int
ovl_permission
(
struct
inode
*
inode
,
int
mask
)
{
bool
is_upper
;
struct
inode
*
realinode
=
ovl_inode_real
(
inode
,
&
is_upper
);
struct
inode
*
upperinode
=
ovl_inode_upper
(
inode
)
;
struct
inode
*
realinode
=
upperinode
?:
ovl_inode_lower
(
inode
);
const
struct
cred
*
old_cred
;
int
err
;
...
...
@@ -154,7 +154,8 @@ int ovl_permission(struct inode *inode, int mask)
return
err
;
old_cred
=
ovl_override_creds
(
inode
->
i_sb
);
if
(
!
is_upper
&&
!
special_file
(
realinode
->
i_mode
)
&&
mask
&
MAY_WRITE
)
{
if
(
!
upperinode
&&
!
special_file
(
realinode
->
i_mode
)
&&
mask
&
MAY_WRITE
)
{
mask
&=
~
(
MAY_WRITE
|
MAY_APPEND
);
/* Make sure mounter can read file for copy up later */
mask
|=
MAY_READ
;
...
...
@@ -286,7 +287,7 @@ ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size)
struct
posix_acl
*
ovl_get_acl
(
struct
inode
*
inode
,
int
type
)
{
struct
inode
*
realinode
=
ovl_inode_real
(
inode
,
NULL
);
struct
inode
*
realinode
=
ovl_inode_real
(
inode
);
const
struct
cred
*
old_cred
;
struct
posix_acl
*
acl
;
...
...
@@ -462,17 +463,24 @@ static int ovl_inode_set(struct inode *inode, void *data)
return
0
;
}
struct
inode
*
ovl_get_inode
(
struct
dentry
*
dentry
)
struct
inode
*
ovl_get_inode
(
struct
dentry
*
dentry
,
struct
dentry
*
upperdentry
)
{
struct
dentry
*
upperdentry
=
ovl_dentry_upp
er
(
dentry
);
struct
inode
*
realinode
=
d_inode
(
ovl_dentry_real
(
dentry
))
;
struct
dentry
*
lowerdentry
=
ovl_dentry_low
er
(
dentry
);
struct
inode
*
realinode
=
upperdentry
?
d_inode
(
upperdentry
)
:
NULL
;
struct
inode
*
inode
;
if
(
!
realinode
)
realinode
=
d_inode
(
lowerdentry
);
if
(
upperdentry
&&
!
d_is_dir
(
upperdentry
))
{
inode
=
iget5_locked
(
dentry
->
d_sb
,
(
unsigned
long
)
realinode
,
ovl_inode_test
,
ovl_inode_set
,
realinode
);
if
(
!
inode
||
!
(
inode
->
i_state
&
I_NEW
)
)
if
(
!
inode
)
goto
out
;
if
(
!
(
inode
->
i_state
&
I_NEW
))
{
dput
(
upperdentry
);
goto
out
;
}
set_nlink
(
inode
,
realinode
->
i_nlink
);
}
else
{
...
...
@@ -481,7 +489,7 @@ struct inode *ovl_get_inode(struct dentry *dentry)
goto
out
;
}
ovl_fill_inode
(
inode
,
realinode
->
i_mode
,
realinode
->
i_rdev
);
ovl_inode_init
(
inode
,
dentry
);
ovl_inode_init
(
inode
,
upperdentry
,
lower
dentry
);
if
(
inode
->
i_state
&
I_NEW
)
unlock_new_inode
(
inode
);
out:
...
...
fs/overlayfs/namei.c
View file @
09d8b586
...
...
@@ -359,7 +359,7 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
return
ERR_PTR
(
-
ENAMETOOLONG
);
old_cred
=
ovl_override_creds
(
dentry
->
d_sb
);
upperdir
=
ovl_
upperdentry_dereference
(
poe
);
upperdir
=
ovl_
dentry_upper
(
dentry
->
d_parent
);
if
(
upperdir
)
{
err
=
ovl_lookup_layer
(
upperdir
,
&
d
,
&
upperdentry
);
if
(
err
)
...
...
@@ -436,13 +436,12 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
oe
->
opaque
=
upperopaque
;
oe
->
impure
=
upperimpure
;
oe
->
redirect
=
upperredirect
;
oe
->
__upperdentry
=
upperdentry
;
memcpy
(
oe
->
lowerstack
,
stack
,
sizeof
(
struct
path
)
*
ctr
);
dentry
->
d_fsdata
=
oe
;
if
(
upperdentry
||
ctr
)
{
err
=
-
ENOMEM
;
inode
=
ovl_get_inode
(
dentry
);
inode
=
ovl_get_inode
(
dentry
,
upperdentry
);
if
(
!
inode
)
goto
out_free_oe
;
}
...
...
@@ -487,7 +486,7 @@ bool ovl_lower_positive(struct dentry *dentry)
return
oe
->
opaque
;
/* Negative upper -> positive lower */
if
(
!
o
e
->
__upperdentry
)
if
(
!
o
vl_dentry_upper
(
dentry
)
)
return
true
;
/* Positive upper -> have to look up lower to see whether it exists */
...
...
fs/overlayfs/overlayfs.h
View file @
09d8b586
...
...
@@ -189,7 +189,9 @@ enum ovl_path_type ovl_path_real(struct dentry *dentry, struct path *path);
struct
dentry
*
ovl_dentry_upper
(
struct
dentry
*
dentry
);
struct
dentry
*
ovl_dentry_lower
(
struct
dentry
*
dentry
);
struct
dentry
*
ovl_dentry_real
(
struct
dentry
*
dentry
);
struct
inode
*
ovl_inode_real
(
struct
inode
*
inode
,
bool
*
is_upper
);
struct
inode
*
ovl_inode_upper
(
struct
inode
*
inode
);
struct
inode
*
ovl_inode_lower
(
struct
inode
*
inode
);
struct
inode
*
ovl_inode_real
(
struct
inode
*
inode
);
struct
ovl_dir_cache
*
ovl_dir_cache
(
struct
dentry
*
dentry
);
void
ovl_set_dir_cache
(
struct
dentry
*
dentry
,
struct
ovl_dir_cache
*
cache
);
bool
ovl_dentry_is_opaque
(
struct
dentry
*
dentry
);
...
...
@@ -199,9 +201,9 @@ void ovl_dentry_set_opaque(struct dentry *dentry);
bool
ovl_redirect_dir
(
struct
super_block
*
sb
);
const
char
*
ovl_dentry_get_redirect
(
struct
dentry
*
dentry
);
void
ovl_dentry_set_redirect
(
struct
dentry
*
dentry
,
const
char
*
redirect
);
void
ovl_
dentry_update
(
struct
dentry
*
dentry
,
struct
dentry
*
upperdentry
);
void
ovl_inode_init
(
struct
inode
*
inode
,
struct
dentry
*
dentry
);
void
ovl_inode_update
(
struct
inode
*
inode
,
struct
inode
*
upperinode
);
void
ovl_
inode_init
(
struct
inode
*
inode
,
struct
dentry
*
upperdentry
,
struct
dentry
*
lower
dentry
);
void
ovl_inode_update
(
struct
inode
*
inode
,
struct
dentry
*
upperdentry
);
void
ovl_dentry_version_inc
(
struct
dentry
*
dentry
);
u64
ovl_dentry_version_get
(
struct
dentry
*
dentry
);
bool
ovl_is_whiteout
(
struct
dentry
*
dentry
);
...
...
@@ -250,7 +252,7 @@ int ovl_update_time(struct inode *inode, struct timespec *ts, int flags);
bool
ovl_is_private_xattr
(
const
char
*
name
);
struct
inode
*
ovl_new_inode
(
struct
super_block
*
sb
,
umode_t
mode
,
dev_t
rdev
);
struct
inode
*
ovl_get_inode
(
struct
dentry
*
dentry
);
struct
inode
*
ovl_get_inode
(
struct
dentry
*
dentry
,
struct
dentry
*
upperdentry
);
static
inline
void
ovl_copyattr
(
struct
inode
*
from
,
struct
inode
*
to
)
{
to
->
i_uid
=
from
->
i_uid
;
...
...
fs/overlayfs/ovl_entry.h
View file @
09d8b586
...
...
@@ -36,7 +36,6 @@ struct ovl_fs {
/* private information held for every overlayfs dentry */
struct
ovl_entry
{
struct
dentry
*
__upperdentry
;
struct
ovl_dir_cache
*
cache
;
union
{
struct
{
...
...
@@ -54,14 +53,9 @@ struct ovl_entry {
struct
ovl_entry
*
ovl_alloc_entry
(
unsigned
int
numlower
);
static
inline
struct
dentry
*
ovl_upperdentry_dereference
(
struct
ovl_entry
*
oe
)
{
return
lockless_dereference
(
oe
->
__upperdentry
);
}
struct
ovl_inode
{
struct
inode
vfs_inode
;
struct
inode
*
upper
;
struct
dentry
*
__upperdentry
;
struct
inode
*
lower
;
};
...
...
@@ -69,3 +63,8 @@ static inline struct ovl_inode *OVL_I(struct inode *inode)
{
return
container_of
(
inode
,
struct
ovl_inode
,
vfs_inode
);
}
static
inline
struct
dentry
*
ovl_upperdentry_dereference
(
struct
ovl_inode
*
oi
)
{
return
lockless_dereference
(
oi
->
__upperdentry
);
}
fs/overlayfs/super.c
View file @
09d8b586
...
...
@@ -41,7 +41,6 @@ static void ovl_dentry_release(struct dentry *dentry)
if
(
oe
)
{
unsigned
int
i
;
dput
(
oe
->
__upperdentry
);
kfree
(
oe
->
redirect
);
for
(
i
=
0
;
i
<
oe
->
numlower
;
i
++
)
dput
(
oe
->
lowerstack
[
i
].
dentry
);
...
...
@@ -171,7 +170,7 @@ static struct inode *ovl_alloc_inode(struct super_block *sb)
{
struct
ovl_inode
*
oi
=
kmem_cache_alloc
(
ovl_inode_cachep
,
GFP_KERNEL
);
oi
->
upper
=
NULL
;
oi
->
__upperdentry
=
NULL
;
oi
->
lower
=
NULL
;
return
&
oi
->
vfs_inode
;
...
...
@@ -186,6 +185,10 @@ static void ovl_i_callback(struct rcu_head *head)
static
void
ovl_destroy_inode
(
struct
inode
*
inode
)
{
struct
ovl_inode
*
oi
=
OVL_I
(
inode
);
dput
(
oi
->
__upperdentry
);
call_rcu
(
&
inode
->
i_rcu
,
ovl_i_callback
);
}
...
...
@@ -636,7 +639,7 @@ ovl_posix_acl_xattr_set(const struct xattr_handler *handler,
size_t
size
,
int
flags
)
{
struct
dentry
*
workdir
=
ovl_workdir
(
dentry
);
struct
inode
*
realinode
=
ovl_inode_real
(
inode
,
NULL
);
struct
inode
*
realinode
=
ovl_inode_real
(
inode
);
struct
posix_acl
*
acl
=
NULL
;
int
err
;
...
...
@@ -678,7 +681,7 @@ ovl_posix_acl_xattr_set(const struct xattr_handler *handler,
err
=
ovl_xattr_set
(
dentry
,
handler
->
name
,
value
,
size
,
flags
);
if
(
!
err
)
ovl_copyattr
(
ovl_inode_real
(
inode
,
NULL
),
inode
);
ovl_copyattr
(
ovl_inode_real
(
inode
),
inode
);
return
err
;
...
...
@@ -1000,7 +1003,6 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent)
kfree
(
lowertmp
);
if
(
upperpath
.
dentry
)
{
oe
->
__upperdentry
=
upperpath
.
dentry
;
oe
->
impure
=
ovl_is_impuredir
(
upperpath
.
dentry
);
}
for
(
i
=
0
;
i
<
numlower
;
i
++
)
{
...
...
@@ -1011,7 +1013,8 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent)
root_dentry
->
d_fsdata
=
oe
;
ovl_inode_init
(
d_inode
(
root_dentry
),
root_dentry
);
ovl_inode_init
(
d_inode
(
root_dentry
),
upperpath
.
dentry
,
ovl_dentry_lower
(
root_dentry
));
sb
->
s_root
=
root_dentry
;
...
...
fs/overlayfs/util.c
View file @
09d8b586
...
...
@@ -78,7 +78,7 @@ enum ovl_path_type ovl_path_type(struct dentry *dentry)
struct
ovl_entry
*
oe
=
dentry
->
d_fsdata
;
enum
ovl_path_type
type
=
0
;
if
(
o
e
->
__upperdentry
)
{
if
(
o
vl_dentry_upper
(
dentry
)
)
{
type
=
__OVL_PATH_UPPER
;
/*
...
...
@@ -99,10 +99,9 @@ enum ovl_path_type ovl_path_type(struct dentry *dentry)
void
ovl_path_upper
(
struct
dentry
*
dentry
,
struct
path
*
path
)
{
struct
ovl_fs
*
ofs
=
dentry
->
d_sb
->
s_fs_info
;
struct
ovl_entry
*
oe
=
dentry
->
d_fsdata
;
path
->
mnt
=
ofs
->
upper_mnt
;
path
->
dentry
=
ovl_
upperdentry_dereference
(
oe
);
path
->
dentry
=
ovl_
dentry_upper
(
dentry
);
}
void
ovl_path_lower
(
struct
dentry
*
dentry
,
struct
path
*
path
)
...
...
@@ -126,51 +125,39 @@ enum ovl_path_type ovl_path_real(struct dentry *dentry, struct path *path)
struct
dentry
*
ovl_dentry_upper
(
struct
dentry
*
dentry
)
{
struct
ovl_entry
*
oe
=
dentry
->
d_fsdata
;
return
ovl_upperdentry_dereference
(
oe
);
}
static
struct
dentry
*
__ovl_dentry_lower
(
struct
ovl_entry
*
oe
)
{
return
oe
->
numlower
?
oe
->
lowerstack
[
0
].
dentry
:
NULL
;
return
ovl_upperdentry_dereference
(
OVL_I
(
d_inode
(
dentry
)));
}
struct
dentry
*
ovl_dentry_lower
(
struct
dentry
*
dentry
)
{
struct
ovl_entry
*
oe
=
dentry
->
d_fsdata
;
return
__ovl_dentry_lower
(
oe
)
;
return
oe
->
numlower
?
oe
->
lowerstack
[
0
].
dentry
:
NULL
;
}
struct
dentry
*
ovl_dentry_real
(
struct
dentry
*
dentry
)
{
struct
ovl_entry
*
oe
=
dentry
->
d_fsdata
;
struct
dentry
*
realdentry
;
realdentry
=
ovl_upperdentry_dereference
(
oe
);
if
(
!
realdentry
)
realdentry
=
__ovl_dentry_lower
(
oe
);
return
realdentry
;
return
ovl_dentry_upper
(
dentry
)
?:
ovl_dentry_lower
(
dentry
);
}
struct
inode
*
ovl_inode_
real
(
struct
inode
*
inode
,
bool
*
is_upper
)
struct
inode
*
ovl_inode_
upper
(
struct
inode
*
inode
)
{
struct
inode
*
realinode
=
lockless_dereference
(
OVL_I
(
inode
)
->
upper
);
bool
isup
=
false
;
struct
dentry
*
upperdentry
=
ovl_upperdentry_dereference
(
OVL_I
(
inode
));
if
(
!
realinode
)
realinode
=
OVL_I
(
inode
)
->
lower
;
else
isup
=
true
;
return
upperdentry
?
d_inode
(
upperdentry
)
:
NULL
;
}
if
(
is_upper
)
*
is_upper
=
isup
;
struct
inode
*
ovl_inode_lower
(
struct
inode
*
inode
)
{
return
OVL_I
(
inode
)
->
lower
;
}
return
realinode
;
struct
inode
*
ovl_inode_real
(
struct
inode
*
inode
)
{
return
ovl_inode_upper
(
inode
)
?:
ovl_inode_lower
(
inode
);
}
struct
ovl_dir_cache
*
ovl_dir_cache
(
struct
dentry
*
dentry
)
{
struct
ovl_entry
*
oe
=
dentry
->
d_fsdata
;
...
...
@@ -232,42 +219,30 @@ void ovl_dentry_set_redirect(struct dentry *dentry, const char *redirect)
oe
->
redirect
=
redirect
;
}
void
ovl_dentry_update
(
struct
dentry
*
dentry
,
struct
dentry
*
upperdentry
)
void
ovl_inode_init
(
struct
inode
*
inode
,
struct
dentry
*
upperdentry
,
struct
dentry
*
lowerdentry
)
{
struct
ovl_entry
*
oe
=
dentry
->
d_fsdata
;
if
(
upperdentry
)
OVL_I
(
inode
)
->
__upperdentry
=
upperdentry
;
if
(
lowerdentry
)
OVL_I
(
inode
)
->
lower
=
d_inode
(
lowerdentry
);
WARN_ON
(
!
inode_is_locked
(
upperdentry
->
d_parent
->
d_inode
));
WARN_ON
(
oe
->
__upperdentry
);
/*
* Make sure upperdentry is consistent before making it visible to
* ovl_upperdentry_dereference().
*/
smp_wmb
();
oe
->
__upperdentry
=
upperdentry
;
ovl_copyattr
(
d_inode
(
upperdentry
?:
lowerdentry
),
inode
);
}
void
ovl_inode_
init
(
struct
inode
*
inode
,
struct
dentry
*
dentry
)
void
ovl_inode_
update
(
struct
inode
*
inode
,
struct
dentry
*
upper
dentry
)
{
struct
inode
*
realinode
=
d_inode
(
ovl_dentry_real
(
dentry
)
);
struct
inode
*
upperinode
=
d_inode
(
upperdentry
);
if
(
ovl_dentry_upper
(
dentry
))
OVL_I
(
inode
)
->
upper
=
realinode
;
else
OVL_I
(
inode
)
->
lower
=
realinode
;
ovl_copyattr
(
realinode
,
inode
);
}
void
ovl_inode_update
(
struct
inode
*
inode
,
struct
inode
*
upperinode
)
{
WARN_ON
(
!
upperinode
);
WARN_ON
(
!
inode_unhashed
(
inode
));
WARN_ON
(
!
inode_is_locked
(
upperdentry
->
d_parent
->
d_inode
));
WARN_ON
(
OVL_I
(
inode
)
->
__upperdentry
);
/*
* Make sure upperinode is consistent before making it visible to
* ovl_inode_real();
* Make sure upperdentry is consistent before making it visible
*/
smp_wmb
();
OVL_I
(
inode
)
->
upper
=
upperinode
;
OVL_I
(
inode
)
->
__upperdentry
=
upperdentry
;
if
(
!
S_ISDIR
(
upperinode
->
i_mode
))
{
inode
->
i_private
=
upperinode
;
__insert_inode_hash
(
inode
,
(
unsigned
long
)
upperinode
);
...
...
@@ -311,7 +286,7 @@ int ovl_copy_up_start(struct dentry *dentry)
spin_lock
(
&
ofs
->
copyup_wq
.
lock
);
err
=
wait_event_interruptible_locked
(
ofs
->
copyup_wq
,
!
oe
->
copying
);
if
(
!
err
)
{
if
(
o
e
->
__upperdentry
)
if
(
o
vl_dentry_upper
(
dentry
)
)
err
=
1
;
/* Already copied up */
else
oe
->
copying
=
true
;
...
...
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