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
28ade856
Commit
28ade856
authored
5 years ago
by
Trond Myklebust
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'containers'
parents
02a2779f
bf11fbdb
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
242 additions
and
9 deletions
+242
-9
fs/nfs/Makefile
fs/nfs/Makefile
+2
-1
fs/nfs/client.c
fs/nfs/client.c
+15
-2
fs/nfs/inode.c
fs/nfs/inode.c
+9
-5
fs/nfs/internal.h
fs/nfs/internal.h
+1
-1
fs/nfs/netns.h
fs/nfs/netns.h
+3
-0
fs/nfs/sysfs.c
fs/nfs/sysfs.c
+187
-0
fs/nfs/sysfs.h
fs/nfs/sysfs.h
+25
-0
No files found.
fs/nfs/Makefile
View file @
28ade856
...
...
@@ -8,7 +8,8 @@ obj-$(CONFIG_NFS_FS) += nfs.o
CFLAGS_nfstrace.o
+=
-I
$(src)
nfs-y
:=
client.o dir.o file.o getroot.o inode.o super.o
\
io.o direct.o pagelist.o read.o symlink.o unlink.o
\
write.o namespace.o mount_clnt.o nfstrace.o export.o
write.o namespace.o mount_clnt.o nfstrace.o
\
export.o sysfs.o
nfs-$(CONFIG_ROOT_NFS)
+=
nfsroot.o
nfs-$(CONFIG_SYSCTL)
+=
sysctl.o
nfs-$(CONFIG_NFS_FSCACHE)
+=
fscache.o fscache-index.o
...
...
This diff is collapsed.
Click to expand it.
fs/nfs/client.c
View file @
28ade856
...
...
@@ -49,6 +49,7 @@
#include "pnfs.h"
#include "nfs.h"
#include "netns.h"
#include "sysfs.h"
#define NFSDBG_FACILITY NFSDBG_CLIENT
...
...
@@ -192,7 +193,7 @@ struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_init)
EXPORT_SYMBOL_GPL
(
nfs_alloc_client
);
#if IS_ENABLED(CONFIG_NFS_V4)
void
nfs_cleanup_cb_ident_idr
(
struct
net
*
net
)
static
void
nfs_cleanup_cb_ident_idr
(
struct
net
*
net
)
{
struct
nfs_net
*
nn
=
net_generic
(
net
,
nfs_net_id
);
...
...
@@ -214,7 +215,7 @@ static void pnfs_init_server(struct nfs_server *server)
}
#else
void
nfs_cleanup_cb_ident_idr
(
struct
net
*
net
)
static
void
nfs_cleanup_cb_ident_idr
(
struct
net
*
net
)
{
}
...
...
@@ -1072,6 +1073,18 @@ void nfs_clients_init(struct net *net)
#endif
spin_lock_init
(
&
nn
->
nfs_client_lock
);
nn
->
boot_time
=
ktime_get_real
();
nfs_netns_sysfs_setup
(
nn
,
net
);
}
void
nfs_clients_exit
(
struct
net
*
net
)
{
struct
nfs_net
*
nn
=
net_generic
(
net
,
nfs_net_id
);
nfs_netns_sysfs_destroy
(
nn
);
nfs_cleanup_cb_ident_idr
(
net
);
WARN_ON_ONCE
(
!
list_empty
(
&
nn
->
nfs_client_list
));
WARN_ON_ONCE
(
!
list_empty
(
&
nn
->
nfs_volume_list
));
}
#ifdef CONFIG_PROC_FS
...
...
This diff is collapsed.
Click to expand it.
fs/nfs/inode.c
View file @
28ade856
...
...
@@ -51,6 +51,7 @@
#include "pnfs.h"
#include "nfs.h"
#include "netns.h"
#include "sysfs.h"
#include "nfstrace.h"
...
...
@@ -2167,12 +2168,8 @@ static int nfs_net_init(struct net *net)
static
void
nfs_net_exit
(
struct
net
*
net
)
{
struct
nfs_net
*
nn
=
net_generic
(
net
,
nfs_net_id
);
nfs_fs_proc_net_exit
(
net
);
nfs_cleanup_cb_ident_idr
(
net
);
WARN_ON_ONCE
(
!
list_empty
(
&
nn
->
nfs_client_list
));
WARN_ON_ONCE
(
!
list_empty
(
&
nn
->
nfs_volume_list
));
nfs_clients_exit
(
net
);
}
static
struct
pernet_operations
nfs_net_ops
=
{
...
...
@@ -2189,6 +2186,10 @@ static int __init init_nfs_fs(void)
{
int
err
;
err
=
nfs_sysfs_init
();
if
(
err
<
0
)
goto
out10
;
err
=
register_pernet_subsys
(
&
nfs_net_ops
);
if
(
err
<
0
)
goto
out9
;
...
...
@@ -2252,6 +2253,8 @@ static int __init init_nfs_fs(void)
out8:
unregister_pernet_subsys
(
&
nfs_net_ops
);
out9:
nfs_sysfs_exit
();
out10:
return
err
;
}
...
...
@@ -2268,6 +2271,7 @@ static void __exit exit_nfs_fs(void)
unregister_nfs_fs
();
nfs_fs_proc_exit
();
nfsiod_stop
();
nfs_sysfs_exit
();
}
/* Not quite true; I just maintain it */
...
...
This diff is collapsed.
Click to expand it.
fs/nfs/internal.h
View file @
28ade856
...
...
@@ -158,6 +158,7 @@ extern void nfs_umount(const struct nfs_mount_request *info);
/* client.c */
extern
const
struct
rpc_program
nfs_program
;
extern
void
nfs_clients_init
(
struct
net
*
net
);
extern
void
nfs_clients_exit
(
struct
net
*
net
);
extern
struct
nfs_client
*
nfs_alloc_client
(
const
struct
nfs_client_initdata
*
);
int
nfs_create_rpc_client
(
struct
nfs_client
*
,
const
struct
nfs_client_initdata
*
,
rpc_authflavor_t
);
struct
nfs_client
*
nfs_get_client
(
const
struct
nfs_client_initdata
*
);
...
...
@@ -170,7 +171,6 @@ int nfs_init_server_rpcclient(struct nfs_server *, const struct rpc_timeout *t,
struct
nfs_server
*
nfs_alloc_server
(
void
);
void
nfs_server_copy_userdata
(
struct
nfs_server
*
,
struct
nfs_server
*
);
extern
void
nfs_cleanup_cb_ident_idr
(
struct
net
*
);
extern
void
nfs_put_client
(
struct
nfs_client
*
);
extern
void
nfs_free_client
(
struct
nfs_client
*
);
extern
struct
nfs_client
*
nfs4_find_client_ident
(
struct
net
*
,
int
);
...
...
This diff is collapsed.
Click to expand it.
fs/nfs/netns.h
View file @
28ade856
...
...
@@ -15,6 +15,8 @@ struct bl_dev_msg {
uint32_t
major
,
minor
;
};
struct
nfs_netns_client
;
struct
nfs_net
{
struct
cache_detail
*
nfs_dns_resolve
;
struct
rpc_pipe
*
bl_device_pipe
;
...
...
@@ -29,6 +31,7 @@ struct nfs_net {
unsigned
short
nfs_callback_tcpport6
;
int
cb_users
[
NFS4_MAX_MINOR_VERSION
+
1
];
#endif
struct
nfs_netns_client
*
nfs_client
;
spinlock_t
nfs_client_lock
;
ktime_t
boot_time
;
#ifdef CONFIG_PROC_FS
...
...
This diff is collapsed.
Click to expand it.
fs/nfs/sysfs.c
0 → 100644
View file @
28ade856
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (c) 2019 Hammerspace Inc
*/
#include <linux/module.h>
#include <linux/kobject.h>
#include <linux/sysfs.h>
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/netdevice.h>
#include <linux/string.h>
#include <linux/nfs_fs.h>
#include <linux/rcupdate.h>
#include "nfs4_fs.h"
#include "netns.h"
#include "sysfs.h"
struct
kobject
*
nfs_client_kobj
;
static
struct
kset
*
nfs_client_kset
;
static
void
nfs_netns_object_release
(
struct
kobject
*
kobj
)
{
kfree
(
kobj
);
}
static
const
struct
kobj_ns_type_operations
*
nfs_netns_object_child_ns_type
(
struct
kobject
*
kobj
)
{
return
&
net_ns_type_operations
;
}
static
struct
kobj_type
nfs_netns_object_type
=
{
.
release
=
nfs_netns_object_release
,
.
sysfs_ops
=
&
kobj_sysfs_ops
,
.
child_ns_type
=
nfs_netns_object_child_ns_type
,
};
static
struct
kobject
*
nfs_netns_object_alloc
(
const
char
*
name
,
struct
kset
*
kset
,
struct
kobject
*
parent
)
{
struct
kobject
*
kobj
;
kobj
=
kzalloc
(
sizeof
(
*
kobj
),
GFP_KERNEL
);
if
(
kobj
)
{
kobj
->
kset
=
kset
;
if
(
kobject_init_and_add
(
kobj
,
&
nfs_netns_object_type
,
parent
,
"%s"
,
name
)
==
0
)
return
kobj
;
kobject_put
(
kobj
);
}
return
NULL
;
}
int
nfs_sysfs_init
(
void
)
{
nfs_client_kset
=
kset_create_and_add
(
"nfs"
,
NULL
,
fs_kobj
);
if
(
!
nfs_client_kset
)
return
-
ENOMEM
;
nfs_client_kobj
=
nfs_netns_object_alloc
(
"net"
,
nfs_client_kset
,
NULL
);
if
(
!
nfs_client_kobj
)
{
kset_unregister
(
nfs_client_kset
);
nfs_client_kset
=
NULL
;
return
-
ENOMEM
;
}
return
0
;
}
void
nfs_sysfs_exit
(
void
)
{
kobject_put
(
nfs_client_kobj
);
kset_unregister
(
nfs_client_kset
);
}
static
ssize_t
nfs_netns_identifier_show
(
struct
kobject
*
kobj
,
struct
kobj_attribute
*
attr
,
char
*
buf
)
{
struct
nfs_netns_client
*
c
=
container_of
(
kobj
,
struct
nfs_netns_client
,
kobject
);
return
scnprintf
(
buf
,
PAGE_SIZE
,
"%s
\n
"
,
c
->
identifier
);
}
/* Strip trailing '\n' */
static
size_t
nfs_string_strip
(
const
char
*
c
,
size_t
len
)
{
while
(
len
>
0
&&
c
[
len
-
1
]
==
'\n'
)
--
len
;
return
len
;
}
static
ssize_t
nfs_netns_identifier_store
(
struct
kobject
*
kobj
,
struct
kobj_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
{
struct
nfs_netns_client
*
c
=
container_of
(
kobj
,
struct
nfs_netns_client
,
kobject
);
const
char
*
old
;
char
*
p
;
size_t
len
;
len
=
nfs_string_strip
(
buf
,
min_t
(
size_t
,
count
,
CONTAINER_ID_MAXLEN
));
if
(
!
len
)
return
0
;
p
=
kmemdup_nul
(
buf
,
len
,
GFP_KERNEL
);
if
(
!
p
)
return
-
ENOMEM
;
old
=
xchg
(
&
c
->
identifier
,
p
);
if
(
old
)
{
synchronize_rcu
();
kfree
(
old
);
}
return
count
;
}
static
void
nfs_netns_client_release
(
struct
kobject
*
kobj
)
{
struct
nfs_netns_client
*
c
=
container_of
(
kobj
,
struct
nfs_netns_client
,
kobject
);
if
(
c
->
identifier
)
kfree
(
c
->
identifier
);
kfree
(
c
);
}
static
const
void
*
nfs_netns_client_namespace
(
struct
kobject
*
kobj
)
{
return
container_of
(
kobj
,
struct
nfs_netns_client
,
kobject
)
->
net
;
}
static
struct
kobj_attribute
nfs_netns_client_id
=
__ATTR
(
identifier
,
0644
,
nfs_netns_identifier_show
,
nfs_netns_identifier_store
);
static
struct
attribute
*
nfs_netns_client_attrs
[]
=
{
&
nfs_netns_client_id
.
attr
,
NULL
,
};
static
struct
kobj_type
nfs_netns_client_type
=
{
.
release
=
nfs_netns_client_release
,
.
default_attrs
=
nfs_netns_client_attrs
,
.
sysfs_ops
=
&
kobj_sysfs_ops
,
.
namespace
=
nfs_netns_client_namespace
,
};
static
struct
nfs_netns_client
*
nfs_netns_client_alloc
(
struct
kobject
*
parent
,
struct
net
*
net
)
{
struct
nfs_netns_client
*
p
;
p
=
kzalloc
(
sizeof
(
*
p
),
GFP_KERNEL
);
if
(
p
)
{
p
->
net
=
net
;
p
->
kobject
.
kset
=
nfs_client_kset
;
if
(
kobject_init_and_add
(
&
p
->
kobject
,
&
nfs_netns_client_type
,
parent
,
"nfs_client"
)
==
0
)
return
p
;
kobject_put
(
&
p
->
kobject
);
}
return
NULL
;
}
void
nfs_netns_sysfs_setup
(
struct
nfs_net
*
netns
,
struct
net
*
net
)
{
struct
nfs_netns_client
*
clp
;
clp
=
nfs_netns_client_alloc
(
nfs_client_kobj
,
net
);
if
(
clp
)
{
netns
->
nfs_client
=
clp
;
kobject_uevent
(
&
clp
->
kobject
,
KOBJ_ADD
);
}
}
void
nfs_netns_sysfs_destroy
(
struct
nfs_net
*
netns
)
{
struct
nfs_netns_client
*
clp
=
netns
->
nfs_client
;
if
(
clp
)
{
kobject_uevent
(
&
clp
->
kobject
,
KOBJ_REMOVE
);
kobject_del
(
&
clp
->
kobject
);
kobject_put
(
&
clp
->
kobject
);
netns
->
nfs_client
=
NULL
;
}
}
This diff is collapsed.
Click to expand it.
fs/nfs/sysfs.h
0 → 100644
View file @
28ade856
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (c) 2019 Hammerspace Inc
*/
#ifndef __NFS_SYSFS_H
#define __NFS_SYSFS_H
#define CONTAINER_ID_MAXLEN (64)
struct
nfs_netns_client
{
struct
kobject
kobject
;
struct
net
*
net
;
const
char
*
identifier
;
};
extern
struct
kobject
*
nfs_client_kobj
;
extern
int
nfs_sysfs_init
(
void
);
extern
void
nfs_sysfs_exit
(
void
);
void
nfs_netns_sysfs_setup
(
struct
nfs_net
*
netns
,
struct
net
*
net
);
void
nfs_netns_sysfs_destroy
(
struct
nfs_net
*
netns
);
#endif
This diff is collapsed.
Click to expand it.
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