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
08607c1b
Commit
08607c1b
authored
Jun 08, 2007
by
Chris Mason
Committed by
David Woodhouse
Jun 08, 2007
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Btrfs: add compat ioctl
Signed-off-by:
Chris Mason
<
chris.mason@oracle.com
>
parent
fabb5681
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
98 additions
and
7 deletions
+98
-7
fs/btrfs/TODO
fs/btrfs/TODO
+0
-1
fs/btrfs/ctree.h
fs/btrfs/ctree.h
+3
-2
fs/btrfs/disk-io.c
fs/btrfs/disk-io.c
+2
-2
fs/btrfs/super.c
fs/btrfs/super.c
+25
-2
fs/btrfs/transaction.c
fs/btrfs/transaction.c
+60
-0
fs/btrfs/transaction.h
fs/btrfs/transaction.h
+8
-0
No files found.
fs/btrfs/TODO
View file @
08607c1b
...
...
@@ -7,7 +7,6 @@
* Get rid of struct ctree_path, limiting tree levels held at one time
* Add generation number to key pointer in nodes
* Add generation number to inode
* Add ability to switch a block group from data to metadata or vice versa
* forbid cross subvolume renames and hardlinks
* Release
* Do real tree locking
...
...
fs/btrfs/ctree.h
View file @
08607c1b
...
...
@@ -3,7 +3,7 @@
#include <linux/fs.h>
#include <linux/buffer_head.h>
#include <linux/
kobject
.h>
#include <linux/
workqueue
.h>
#include "bit-radix.h"
struct
btrfs_trans_handle
;
...
...
@@ -281,6 +281,7 @@ struct btrfs_block_group_cache {
};
struct
crypto_hash
;
struct
btrfs_fs_info
{
struct
btrfs_root
*
extent_root
;
struct
btrfs_root
*
tree_root
;
...
...
@@ -308,9 +309,9 @@ struct btrfs_fs_info {
struct
mutex
fs_mutex
;
struct
list_head
trans_list
;
struct
crypto_hash
*
hash_tfm
;
struct
delayed_work
trans_work
;
spinlock_t
hash_lock
;
int
do_barriers
;
struct
kobject
kobj
;
};
/*
...
...
fs/btrfs/disk-io.c
View file @
08607c1b
...
...
@@ -577,6 +577,7 @@ struct btrfs_root *open_ctree(struct super_block *sb)
fs_info
->
do_barriers
=
1
;
fs_info
->
extent_tree_insert_nr
=
0
;
fs_info
->
extent_tree_prealloc_nr
=
0
;
INIT_DELAYED_WORK
(
&
fs_info
->
trans_work
,
btrfs_transaction_cleaner
);
BTRFS_I
(
fs_info
->
btree_inode
)
->
root
=
tree_root
;
memset
(
&
BTRFS_I
(
fs_info
->
btree_inode
)
->
location
,
0
,
sizeof
(
struct
btrfs_key
));
...
...
@@ -648,7 +649,6 @@ struct btrfs_root *open_ctree(struct super_block *sb)
btrfs_read_block_groups
(
extent_root
);
fs_info
->
generation
=
btrfs_super_generation
(
disk_super
)
+
1
;
memset
(
&
fs_info
->
kobj
,
0
,
sizeof
(
fs_info
->
kobj
));
mutex_unlock
(
&
fs_info
->
fs_mutex
);
return
tree_root
;
}
...
...
@@ -746,6 +746,7 @@ int close_ctree(struct btrfs_root *root)
struct
btrfs_trans_handle
*
trans
;
struct
btrfs_fs_info
*
fs_info
=
root
->
fs_info
;
btrfs_transaction_flush_work
(
root
);
mutex_lock
(
&
fs_info
->
fs_mutex
);
trans
=
btrfs_start_transaction
(
root
,
1
);
btrfs_commit_transaction
(
trans
,
root
);
...
...
@@ -776,7 +777,6 @@ int close_ctree(struct btrfs_root *root)
del_fs_roots
(
fs_info
);
kfree
(
fs_info
->
extent_root
);
kfree
(
fs_info
->
tree_root
);
kobject_unregister
(
&
fs_info
->
kobj
);
return
0
;
}
...
...
fs/btrfs/super.c
View file @
08607c1b
...
...
@@ -12,6 +12,7 @@
#include <linux/swap.h>
#include <linux/writeback.h>
#include <linux/statfs.h>
#include <linux/compat.h>
#include "ctree.h"
#include "disk-io.h"
#include "transaction.h"
...
...
@@ -950,7 +951,7 @@ static int btrfs_fill_super(struct super_block * sb, void * data, int silent)
return
-
ENOMEM
;
}
sb
->
s_root
=
root_dentry
;
btrfs_transaction_queue_work
(
tree_root
,
HZ
*
30
);
return
0
;
}
...
...
@@ -1452,7 +1453,7 @@ static int btrfs_prepare_write(struct file *file, struct page *page,
static
void
btrfs_write_super
(
struct
super_block
*
sb
)
{
btrfs_sync_fs
(
sb
,
1
)
;
sb
->
s_dirt
=
0
;
}
static
int
btrfs_readpage
(
struct
file
*
file
,
struct
page
*
page
)
...
...
@@ -2698,6 +2699,20 @@ static int btrfs_ioctl(struct inode *inode, struct file *filp, unsigned int
return
ret
;
}
#ifdef CONFIG_COMPAT
static
long
btrfs_compat_ioctl
(
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
struct
inode
*
inode
=
file
->
f_path
.
dentry
->
d_inode
;
int
ret
;
lock_kernel
();
ret
=
btrfs_ioctl
(
inode
,
file
,
cmd
,
(
unsigned
long
)
compat_ptr
(
arg
));
unlock_kernel
();
return
ret
;
}
#endif
static
struct
kmem_cache
*
btrfs_inode_cachep
;
struct
kmem_cache
*
btrfs_trans_handle_cachep
;
struct
kmem_cache
*
btrfs_transaction_cachep
;
...
...
@@ -3042,6 +3057,9 @@ static struct file_operations btrfs_dir_file_operations = {
.
read
=
generic_read_dir
,
.
readdir
=
btrfs_readdir
,
.
ioctl
=
btrfs_ioctl
,
#ifdef CONFIG_COMPAT
.
compat_ioctl
=
btrfs_compat_ioctl
,
#endif
};
static
struct
address_space_operations
btrfs_aops
=
{
...
...
@@ -3073,6 +3091,9 @@ static struct file_operations btrfs_file_operations = {
.
open
=
generic_file_open
,
.
ioctl
=
btrfs_ioctl
,
.
fsync
=
btrfs_sync_file
,
#ifdef CONFIG_COMPAT
.
compat_ioctl
=
btrfs_compat_ioctl
,
#endif
};
static
struct
inode_operations
btrfs_symlink_inode_operations
=
{
...
...
@@ -3085,6 +3106,7 @@ static int __init init_btrfs_fs(void)
{
int
err
;
printk
(
"btrfs loaded!
\n
"
);
btrfs_init_transaction_sys
();
err
=
init_inodecache
();
if
(
err
)
return
err
;
...
...
@@ -3095,6 +3117,7 @@ static int __init init_btrfs_fs(void)
static
void
__exit
exit_btrfs_fs
(
void
)
{
btrfs_exit_transaction_sys
();
destroy_inodecache
();
unregister_filesystem
(
&
btrfs_fs_type
);
printk
(
"btrfs unloaded
\n
"
);
...
...
fs/btrfs/transaction.c
View file @
08607c1b
...
...
@@ -8,6 +8,8 @@ static int total_trans = 0;
extern
struct
kmem_cache
*
btrfs_trans_handle_cachep
;
extern
struct
kmem_cache
*
btrfs_transaction_cachep
;
static
struct
workqueue_struct
*
trans_wq
;
#define BTRFS_ROOT_TRANS_TAG 0
#define TRANS_MAGIC 0xE1E10E
...
...
@@ -44,6 +46,7 @@ static int join_transaction(struct btrfs_root *root)
cur_trans
->
in_commit
=
0
;
cur_trans
->
use_count
=
1
;
cur_trans
->
commit_done
=
0
;
cur_trans
->
start_time
=
get_seconds
();
list_add_tail
(
&
cur_trans
->
list
,
&
root
->
fs_info
->
trans_list
);
init_bit_radix
(
&
cur_trans
->
dirty_pages
);
}
...
...
@@ -350,3 +353,60 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans,
return
ret
;
}
void
btrfs_transaction_cleaner
(
struct
work_struct
*
work
)
{
struct
btrfs_fs_info
*
fs_info
=
container_of
(
work
,
struct
btrfs_fs_info
,
trans_work
.
work
);
struct
btrfs_root
*
root
=
fs_info
->
tree_root
;
struct
btrfs_transaction
*
cur
;
struct
btrfs_trans_handle
*
trans
;
unsigned
long
now
;
unsigned
long
delay
=
HZ
*
30
;
int
ret
;
printk
(
"btrfs transaction cleaner
\n
"
);
mutex_lock
(
&
root
->
fs_info
->
fs_mutex
);
mutex_lock
(
&
root
->
fs_info
->
trans_mutex
);
cur
=
root
->
fs_info
->
running_transaction
;
if
(
!
cur
)
{
mutex_unlock
(
&
root
->
fs_info
->
trans_mutex
);
goto
out
;
}
now
=
get_seconds
();
if
(
now
<
cur
->
start_time
||
now
-
cur
->
start_time
<
30
)
{
mutex_unlock
(
&
root
->
fs_info
->
trans_mutex
);
delay
=
HZ
*
5
;
goto
out
;
}
mutex_unlock
(
&
root
->
fs_info
->
trans_mutex
);
printk
(
"forcing commit
\n
"
);
trans
=
btrfs_start_transaction
(
root
,
1
);
ret
=
btrfs_commit_transaction
(
trans
,
root
);
out:
mutex_unlock
(
&
root
->
fs_info
->
fs_mutex
);
btrfs_transaction_queue_work
(
root
,
delay
);
}
void
btrfs_transaction_queue_work
(
struct
btrfs_root
*
root
,
int
delay
)
{
queue_delayed_work
(
trans_wq
,
&
root
->
fs_info
->
trans_work
,
delay
);
}
void
btrfs_transaction_flush_work
(
struct
btrfs_root
*
root
)
{
cancel_rearming_delayed_workqueue
(
trans_wq
,
&
root
->
fs_info
->
trans_work
);
flush_workqueue
(
trans_wq
);
}
void
__init
btrfs_init_transaction_sys
(
void
)
{
trans_wq
=
create_workqueue
(
"btrfs"
);
}
void
__exit
btrfs_exit_transaction_sys
(
void
)
{
destroy_workqueue
(
trans_wq
);
}
fs/btrfs/transaction.h
View file @
08607c1b
...
...
@@ -11,6 +11,7 @@ struct btrfs_transaction {
int
magic
;
struct
list_head
list
;
struct
radix_tree_root
dirty_pages
;
unsigned
long
start_time
;
wait_queue_head_t
writer_wait
;
wait_queue_head_t
commit_wait
;
};
...
...
@@ -47,4 +48,11 @@ int btrfs_write_and_wait_transaction(struct btrfs_trans_handle *trans,
struct
btrfs_root
*
root
);
int
btrfs_commit_tree_roots
(
struct
btrfs_trans_handle
*
trans
,
struct
btrfs_root
*
root
);
void
btrfs_transaction_cleaner
(
struct
work_struct
*
work
);
void
btrfs_transaction_flush_work
(
struct
btrfs_root
*
root
);
void
btrfs_transaction_queue_work
(
struct
btrfs_root
*
root
,
int
delay
);
void
btrfs_init_transaction_sys
(
void
);
void
btrfs_exit_transaction_sys
(
void
);
#endif
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