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
cf6605d1
Commit
cf6605d1
authored
Feb 18, 2020
by
Trond Myklebust
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
NFSv4: Ensure layout headers are RCU safe
Signed-off-by:
Trond Myklebust
<
trond.myklebust@hammerspace.com
>
parent
d911c57a
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
13 additions
and
11 deletions
+13
-11
fs/nfs/blocklayout/blocklayout.c
fs/nfs/blocklayout/blocklayout.c
+1
-1
fs/nfs/filelayout/filelayout.c
fs/nfs/filelayout/filelayout.c
+1
-1
fs/nfs/flexfilelayout/flexfilelayout.c
fs/nfs/flexfilelayout/flexfilelayout.c
+3
-3
fs/nfs/pnfs.c
fs/nfs/pnfs.c
+6
-6
fs/nfs/pnfs.h
fs/nfs/pnfs.h
+2
-0
No files found.
fs/nfs/blocklayout/blocklayout.c
View file @
cf6605d1
...
@@ -476,7 +476,7 @@ static void bl_free_layout_hdr(struct pnfs_layout_hdr *lo)
...
@@ -476,7 +476,7 @@ static void bl_free_layout_hdr(struct pnfs_layout_hdr *lo)
err
=
ext_tree_remove
(
bl
,
true
,
0
,
LLONG_MAX
);
err
=
ext_tree_remove
(
bl
,
true
,
0
,
LLONG_MAX
);
WARN_ON
(
err
);
WARN_ON
(
err
);
kfree
(
bl
);
kfree
_rcu
(
bl
,
bl_layout
.
plh_rcu
);
}
}
static
struct
pnfs_layout_hdr
*
__bl_alloc_layout_hdr
(
struct
inode
*
inode
,
static
struct
pnfs_layout_hdr
*
__bl_alloc_layout_hdr
(
struct
inode
*
inode
,
...
...
fs/nfs/filelayout/filelayout.c
View file @
cf6605d1
...
@@ -1146,7 +1146,7 @@ filelayout_alloc_layout_hdr(struct inode *inode, gfp_t gfp_flags)
...
@@ -1146,7 +1146,7 @@ filelayout_alloc_layout_hdr(struct inode *inode, gfp_t gfp_flags)
static
void
static
void
filelayout_free_layout_hdr
(
struct
pnfs_layout_hdr
*
lo
)
filelayout_free_layout_hdr
(
struct
pnfs_layout_hdr
*
lo
)
{
{
kfree
(
FILELAYOUT_FROM_HDR
(
lo
)
);
kfree
_rcu
(
FILELAYOUT_FROM_HDR
(
lo
),
generic_hdr
.
plh_rcu
);
}
}
static
struct
pnfs_ds_commit_info
*
static
struct
pnfs_ds_commit_info
*
...
...
fs/nfs/flexfilelayout/flexfilelayout.c
View file @
cf6605d1
...
@@ -59,14 +59,14 @@ ff_layout_alloc_layout_hdr(struct inode *inode, gfp_t gfp_flags)
...
@@ -59,14 +59,14 @@ ff_layout_alloc_layout_hdr(struct inode *inode, gfp_t gfp_flags)
static
void
static
void
ff_layout_free_layout_hdr
(
struct
pnfs_layout_hdr
*
lo
)
ff_layout_free_layout_hdr
(
struct
pnfs_layout_hdr
*
lo
)
{
{
struct
nfs4_flexfile_layout
*
ffl
=
FF_LAYOUT_FROM_HDR
(
lo
);
struct
nfs4_ff_layout_ds_err
*
err
,
*
n
;
struct
nfs4_ff_layout_ds_err
*
err
,
*
n
;
list_for_each_entry_safe
(
err
,
n
,
&
FF_LAYOUT_FROM_HDR
(
lo
)
->
error_list
,
list_for_each_entry_safe
(
err
,
n
,
&
ffl
->
error_list
,
list
)
{
list
)
{
list_del
(
&
err
->
list
);
list_del
(
&
err
->
list
);
kfree
(
err
);
kfree
(
err
);
}
}
kfree
(
FF_LAYOUT_FROM_HDR
(
lo
)
);
kfree
_rcu
(
ffl
,
generic_hdr
.
plh_rcu
);
}
}
static
int
decode_pnfs_stateid
(
struct
xdr_stream
*
xdr
,
nfs4_stateid
*
stateid
)
static
int
decode_pnfs_stateid
(
struct
xdr_stream
*
xdr
,
nfs4_stateid
*
stateid
)
...
...
fs/nfs/pnfs.c
View file @
cf6605d1
...
@@ -268,11 +268,11 @@ pnfs_free_layout_hdr(struct pnfs_layout_hdr *lo)
...
@@ -268,11 +268,11 @@ pnfs_free_layout_hdr(struct pnfs_layout_hdr *lo)
struct
nfs_server
*
server
=
NFS_SERVER
(
lo
->
plh_inode
);
struct
nfs_server
*
server
=
NFS_SERVER
(
lo
->
plh_inode
);
struct
pnfs_layoutdriver_type
*
ld
=
server
->
pnfs_curr_ld
;
struct
pnfs_layoutdriver_type
*
ld
=
server
->
pnfs_curr_ld
;
if
(
!
list_empty
(
&
lo
->
plh_layout
s
))
{
if
(
test_and_clear_bit
(
NFS_LAYOUT_HASHED
,
&
lo
->
plh_flag
s
))
{
struct
nfs_client
*
clp
=
server
->
nfs_client
;
struct
nfs_client
*
clp
=
server
->
nfs_client
;
spin_lock
(
&
clp
->
cl_lock
);
spin_lock
(
&
clp
->
cl_lock
);
list_del_
init
(
&
lo
->
plh_layouts
);
list_del_
rcu
(
&
lo
->
plh_layouts
);
spin_unlock
(
&
clp
->
cl_lock
);
spin_unlock
(
&
clp
->
cl_lock
);
}
}
put_cred
(
lo
->
plh_lc_cred
);
put_cred
(
lo
->
plh_lc_cred
);
...
@@ -784,7 +784,8 @@ pnfs_layout_bulk_destroy_byserver_locked(struct nfs_client *clp,
...
@@ -784,7 +784,8 @@ pnfs_layout_bulk_destroy_byserver_locked(struct nfs_client *clp,
break
;
break
;
inode
=
igrab
(
lo
->
plh_inode
);
inode
=
igrab
(
lo
->
plh_inode
);
if
(
inode
!=
NULL
)
{
if
(
inode
!=
NULL
)
{
list_del_init
(
&
lo
->
plh_layouts
);
if
(
test_and_clear_bit
(
NFS_LAYOUT_HASHED
,
&
lo
->
plh_flags
))
list_del_rcu
(
&
lo
->
plh_layouts
);
if
(
pnfs_layout_add_bulk_destroy_list
(
inode
,
if
(
pnfs_layout_add_bulk_destroy_list
(
inode
,
layout_list
))
layout_list
))
continue
;
continue
;
...
@@ -1870,15 +1871,14 @@ static void pnfs_clear_first_layoutget(struct pnfs_layout_hdr *lo)
...
@@ -1870,15 +1871,14 @@ static void pnfs_clear_first_layoutget(struct pnfs_layout_hdr *lo)
static
void
_add_to_server_list
(
struct
pnfs_layout_hdr
*
lo
,
static
void
_add_to_server_list
(
struct
pnfs_layout_hdr
*
lo
,
struct
nfs_server
*
server
)
struct
nfs_server
*
server
)
{
{
if
(
list_empty
(
&
lo
->
plh_layout
s
))
{
if
(
!
test_and_set_bit
(
NFS_LAYOUT_HASHED
,
&
lo
->
plh_flag
s
))
{
struct
nfs_client
*
clp
=
server
->
nfs_client
;
struct
nfs_client
*
clp
=
server
->
nfs_client
;
/* The lo must be on the clp list if there is any
/* The lo must be on the clp list if there is any
* chance of a CB_LAYOUTRECALL(FILE) coming in.
* chance of a CB_LAYOUTRECALL(FILE) coming in.
*/
*/
spin_lock
(
&
clp
->
cl_lock
);
spin_lock
(
&
clp
->
cl_lock
);
if
(
list_empty
(
&
lo
->
plh_layouts
))
list_add_tail_rcu
(
&
lo
->
plh_layouts
,
&
server
->
layouts
);
list_add_tail
(
&
lo
->
plh_layouts
,
&
server
->
layouts
);
spin_unlock
(
&
clp
->
cl_lock
);
spin_unlock
(
&
clp
->
cl_lock
);
}
}
}
}
...
...
fs/nfs/pnfs.h
View file @
cf6605d1
...
@@ -105,6 +105,7 @@ enum {
...
@@ -105,6 +105,7 @@ enum {
NFS_LAYOUT_INVALID_STID
,
/* layout stateid id is invalid */
NFS_LAYOUT_INVALID_STID
,
/* layout stateid id is invalid */
NFS_LAYOUT_FIRST_LAYOUTGET
,
/* Serialize first layoutget */
NFS_LAYOUT_FIRST_LAYOUTGET
,
/* Serialize first layoutget */
NFS_LAYOUT_INODE_FREEING
,
/* The inode is being freed */
NFS_LAYOUT_INODE_FREEING
,
/* The inode is being freed */
NFS_LAYOUT_HASHED
,
/* The layout visible */
};
};
enum
layoutdriver_policy_flags
{
enum
layoutdriver_policy_flags
{
...
@@ -203,6 +204,7 @@ struct pnfs_layout_hdr {
...
@@ -203,6 +204,7 @@ struct pnfs_layout_hdr {
loff_t
plh_lwb
;
/* last write byte for layoutcommit */
loff_t
plh_lwb
;
/* last write byte for layoutcommit */
const
struct
cred
*
plh_lc_cred
;
/* layoutcommit cred */
const
struct
cred
*
plh_lc_cred
;
/* layoutcommit cred */
struct
inode
*
plh_inode
;
struct
inode
*
plh_inode
;
struct
rcu_head
plh_rcu
;
};
};
struct
pnfs_device
{
struct
pnfs_device
{
...
...
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