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
Kirill Smelkov
linux
Commits
ca7068c4
Commit
ca7068c4
authored
Mar 17, 2012
by
Al Viro
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
anon_inodes: move allocation of anon_inode into ->mount()
Signed-off-by:
Al Viro
<
viro@zeniv.linux.org.uk
>
parent
2226a288
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
56 additions
and
53 deletions
+56
-53
fs/anon_inodes.c
fs/anon_inodes.c
+56
-53
No files found.
fs/anon_inodes.c
View file @
ca7068c4
...
...
@@ -39,19 +39,6 @@ static const struct dentry_operations anon_inodefs_dentry_operations = {
.
d_dname
=
anon_inodefs_dname
,
};
static
struct
dentry
*
anon_inodefs_mount
(
struct
file_system_type
*
fs_type
,
int
flags
,
const
char
*
dev_name
,
void
*
data
)
{
return
mount_pseudo
(
fs_type
,
"anon_inode:"
,
NULL
,
&
anon_inodefs_dentry_operations
,
ANON_INODE_FS_MAGIC
);
}
static
struct
file_system_type
anon_inode_fs_type
=
{
.
name
=
"anon_inodefs"
,
.
mount
=
anon_inodefs_mount
,
.
kill_sb
=
kill_anon_super
,
};
/*
* nop .set_page_dirty method so that people can use .page_mkwrite on
* anon inodes.
...
...
@@ -65,6 +52,62 @@ static const struct address_space_operations anon_aops = {
.
set_page_dirty
=
anon_set_page_dirty
,
};
/*
* A single inode exists for all anon_inode files. Contrary to pipes,
* anon_inode inodes have no associated per-instance data, so we need
* only allocate one of them.
*/
static
struct
inode
*
anon_inode_mkinode
(
struct
super_block
*
s
)
{
struct
inode
*
inode
=
new_inode_pseudo
(
s
);
if
(
!
inode
)
return
ERR_PTR
(
-
ENOMEM
);
inode
->
i_ino
=
get_next_ino
();
inode
->
i_fop
=
&
anon_inode_fops
;
inode
->
i_mapping
->
a_ops
=
&
anon_aops
;
/*
* Mark the inode dirty from the very beginning,
* that way it will never be moved to the dirty
* list because mark_inode_dirty() will think
* that it already _is_ on the dirty list.
*/
inode
->
i_state
=
I_DIRTY
;
inode
->
i_mode
=
S_IRUSR
|
S_IWUSR
;
inode
->
i_uid
=
current_fsuid
();
inode
->
i_gid
=
current_fsgid
();
inode
->
i_flags
|=
S_PRIVATE
;
inode
->
i_atime
=
inode
->
i_mtime
=
inode
->
i_ctime
=
CURRENT_TIME
;
return
inode
;
}
static
struct
dentry
*
anon_inodefs_mount
(
struct
file_system_type
*
fs_type
,
int
flags
,
const
char
*
dev_name
,
void
*
data
)
{
struct
dentry
*
root
;
root
=
mount_pseudo
(
fs_type
,
"anon_inode:"
,
NULL
,
&
anon_inodefs_dentry_operations
,
ANON_INODE_FS_MAGIC
);
if
(
!
IS_ERR
(
root
))
{
struct
super_block
*
s
=
root
->
d_sb
;
anon_inode_inode
=
anon_inode_mkinode
(
s
);
if
(
IS_ERR
(
anon_inode_inode
))
{
dput
(
root
);
deactivate_locked_super
(
s
);
root
=
ERR_CAST
(
anon_inode_inode
);
}
}
return
root
;
}
static
struct
file_system_type
anon_inode_fs_type
=
{
.
name
=
"anon_inodefs"
,
.
mount
=
anon_inodefs_mount
,
.
kill_sb
=
kill_anon_super
,
};
/**
* anon_inode_getfile - creates a new file instance by hooking it up to an
* anonymous inode, and a dentry that describe the "class"
...
...
@@ -180,38 +223,6 @@ int anon_inode_getfd(const char *name, const struct file_operations *fops,
}
EXPORT_SYMBOL_GPL
(
anon_inode_getfd
);
/*
* A single inode exists for all anon_inode files. Contrary to pipes,
* anon_inode inodes have no associated per-instance data, so we need
* only allocate one of them.
*/
static
struct
inode
*
anon_inode_mkinode
(
void
)
{
struct
inode
*
inode
=
new_inode_pseudo
(
anon_inode_mnt
->
mnt_sb
);
if
(
!
inode
)
return
ERR_PTR
(
-
ENOMEM
);
inode
->
i_ino
=
get_next_ino
();
inode
->
i_fop
=
&
anon_inode_fops
;
inode
->
i_mapping
->
a_ops
=
&
anon_aops
;
/*
* Mark the inode dirty from the very beginning,
* that way it will never be moved to the dirty
* list because mark_inode_dirty() will think
* that it already _is_ on the dirty list.
*/
inode
->
i_state
=
I_DIRTY
;
inode
->
i_mode
=
S_IRUSR
|
S_IWUSR
;
inode
->
i_uid
=
current_fsuid
();
inode
->
i_gid
=
current_fsgid
();
inode
->
i_flags
|=
S_PRIVATE
;
inode
->
i_atime
=
inode
->
i_mtime
=
inode
->
i_ctime
=
CURRENT_TIME
;
return
inode
;
}
static
int
__init
anon_inode_init
(
void
)
{
int
error
;
...
...
@@ -224,16 +235,8 @@ static int __init anon_inode_init(void)
error
=
PTR_ERR
(
anon_inode_mnt
);
goto
err_unregister_filesystem
;
}
anon_inode_inode
=
anon_inode_mkinode
();
if
(
IS_ERR
(
anon_inode_inode
))
{
error
=
PTR_ERR
(
anon_inode_inode
);
goto
err_mntput
;
}
return
0
;
err_mntput:
kern_unmount
(
anon_inode_mnt
);
err_unregister_filesystem:
unregister_filesystem
(
&
anon_inode_fs_type
);
err_exit:
...
...
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