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
9cdda8d3
Commit
9cdda8d3
authored
May 22, 2013
by
Al Viro
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[readdir] convert btrfs
Signed-off-by:
Al Viro
<
viro@zeniv.linux.org.uk
>
parent
8e28bc7e
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
21 additions
and
40 deletions
+21
-40
fs/btrfs/delayed-inode.c
fs/btrfs/delayed-inode.c
+4
-5
fs/btrfs/delayed-inode.h
fs/btrfs/delayed-inode.h
+1
-2
fs/btrfs/inode.c
fs/btrfs/inode.c
+16
-33
No files found.
fs/btrfs/delayed-inode.c
View file @
9cdda8d3
...
...
@@ -1681,8 +1681,7 @@ int btrfs_should_delete_dir_index(struct list_head *del_list,
* btrfs_readdir_delayed_dir_index - read dir info stored in the delayed tree
*
*/
int
btrfs_readdir_delayed_dir_index
(
struct
file
*
filp
,
void
*
dirent
,
filldir_t
filldir
,
int
btrfs_readdir_delayed_dir_index
(
struct
dir_context
*
ctx
,
struct
list_head
*
ins_list
)
{
struct
btrfs_dir_item
*
di
;
...
...
@@ -1704,13 +1703,13 @@ int btrfs_readdir_delayed_dir_index(struct file *filp, void *dirent,
list_for_each_entry_safe
(
curr
,
next
,
ins_list
,
readdir_list
)
{
list_del
(
&
curr
->
readdir_list
);
if
(
curr
->
key
.
offset
<
filp
->
f_
pos
)
{
if
(
curr
->
key
.
offset
<
ctx
->
pos
)
{
if
(
atomic_dec_and_test
(
&
curr
->
refs
))
kfree
(
curr
);
continue
;
}
filp
->
f_
pos
=
curr
->
key
.
offset
;
ctx
->
pos
=
curr
->
key
.
offset
;
di
=
(
struct
btrfs_dir_item
*
)
curr
->
data
;
name
=
(
char
*
)(
di
+
1
);
...
...
@@ -1719,7 +1718,7 @@ int btrfs_readdir_delayed_dir_index(struct file *filp, void *dirent,
d_type
=
btrfs_filetype_table
[
di
->
type
];
btrfs_disk_key_to_cpu
(
&
location
,
&
di
->
location
);
over
=
filldir
(
dirent
,
name
,
name_len
,
curr
->
key
.
offset
,
over
=
!
dir_emit
(
ctx
,
name
,
name_len
,
location
.
objectid
,
d_type
);
if
(
atomic_dec_and_test
(
&
curr
->
refs
))
...
...
fs/btrfs/delayed-inode.h
View file @
9cdda8d3
...
...
@@ -139,8 +139,7 @@ void btrfs_put_delayed_items(struct list_head *ins_list,
struct
list_head
*
del_list
);
int
btrfs_should_delete_dir_index
(
struct
list_head
*
del_list
,
u64
index
);
int
btrfs_readdir_delayed_dir_index
(
struct
file
*
filp
,
void
*
dirent
,
filldir_t
filldir
,
int
btrfs_readdir_delayed_dir_index
(
struct
dir_context
*
ctx
,
struct
list_head
*
ins_list
);
/* for init */
...
...
fs/btrfs/inode.c
View file @
9cdda8d3
...
...
@@ -5137,10 +5137,9 @@ unsigned char btrfs_filetype_table[] = {
DT_UNKNOWN
,
DT_REG
,
DT_DIR
,
DT_CHR
,
DT_BLK
,
DT_FIFO
,
DT_SOCK
,
DT_LNK
};
static
int
btrfs_real_readdir
(
struct
file
*
filp
,
void
*
dirent
,
filldir_t
filldir
)
static
int
btrfs_real_readdir
(
struct
file
*
file
,
struct
dir_context
*
ctx
)
{
struct
inode
*
inode
=
file_inode
(
fil
p
);
struct
inode
*
inode
=
file_inode
(
fil
e
);
struct
btrfs_root
*
root
=
BTRFS_I
(
inode
)
->
root
;
struct
btrfs_item
*
item
;
struct
btrfs_dir_item
*
di
;
...
...
@@ -5161,29 +5160,15 @@ static int btrfs_real_readdir(struct file *filp, void *dirent,
char
tmp_name
[
32
];
char
*
name_ptr
;
int
name_len
;
int
is_curr
=
0
;
/*
filp->f_
pos points to the current index? */
int
is_curr
=
0
;
/*
ctx->
pos points to the current index? */
/* FIXME, use a real flag for deciding about the key type */
if
(
root
->
fs_info
->
tree_root
==
root
)
key_type
=
BTRFS_DIR_ITEM_KEY
;
/* special case for "." */
if
(
filp
->
f_pos
==
0
)
{
over
=
filldir
(
dirent
,
"."
,
1
,
filp
->
f_pos
,
btrfs_ino
(
inode
),
DT_DIR
);
if
(
over
)
return
0
;
filp
->
f_pos
=
1
;
}
/* special case for .., just use the back ref */
if
(
filp
->
f_pos
==
1
)
{
u64
pino
=
parent_ino
(
filp
->
f_path
.
dentry
);
over
=
filldir
(
dirent
,
".."
,
2
,
filp
->
f_pos
,
pino
,
DT_DIR
);
if
(
over
)
return
0
;
filp
->
f_pos
=
2
;
}
if
(
!
dir_emit_dots
(
file
,
ctx
))
return
0
;
path
=
btrfs_alloc_path
();
if
(
!
path
)
return
-
ENOMEM
;
...
...
@@ -5197,7 +5182,7 @@ static int btrfs_real_readdir(struct file *filp, void *dirent,
}
btrfs_set_key_type
(
&
key
,
key_type
);
key
.
offset
=
filp
->
f_
pos
;
key
.
offset
=
ctx
->
pos
;
key
.
objectid
=
btrfs_ino
(
inode
);
ret
=
btrfs_search_slot
(
NULL
,
root
,
&
key
,
path
,
0
,
0
);
...
...
@@ -5223,14 +5208,14 @@ static int btrfs_real_readdir(struct file *filp, void *dirent,
break
;
if
(
btrfs_key_type
(
&
found_key
)
!=
key_type
)
break
;
if
(
found_key
.
offset
<
filp
->
f_
pos
)
if
(
found_key
.
offset
<
ctx
->
pos
)
goto
next
;
if
(
key_type
==
BTRFS_DIR_INDEX_KEY
&&
btrfs_should_delete_dir_index
(
&
del_list
,
found_key
.
offset
))
goto
next
;
filp
->
f_
pos
=
found_key
.
offset
;
ctx
->
pos
=
found_key
.
offset
;
is_curr
=
1
;
di
=
btrfs_item_ptr
(
leaf
,
slot
,
struct
btrfs_dir_item
);
...
...
@@ -5274,9 +5259,8 @@ static int btrfs_real_readdir(struct file *filp, void *dirent,
over
=
0
;
goto
skip
;
}
over
=
filldir
(
dirent
,
name_ptr
,
name_len
,
found_key
.
offset
,
location
.
objectid
,
d_type
);
over
=
!
dir_emit
(
ctx
,
name_ptr
,
name_len
,
location
.
objectid
,
d_type
);
skip:
if
(
name_ptr
!=
tmp_name
)
...
...
@@ -5295,9 +5279,8 @@ static int btrfs_real_readdir(struct file *filp, void *dirent,
if
(
key_type
==
BTRFS_DIR_INDEX_KEY
)
{
if
(
is_curr
)
filp
->
f_pos
++
;
ret
=
btrfs_readdir_delayed_dir_index
(
filp
,
dirent
,
filldir
,
&
ins_list
);
ctx
->
pos
++
;
ret
=
btrfs_readdir_delayed_dir_index
(
ctx
,
&
ins_list
);
if
(
ret
)
goto
nopos
;
}
...
...
@@ -5308,9 +5291,9 @@ static int btrfs_real_readdir(struct file *filp, void *dirent,
* 32-bit glibc will use getdents64, but then strtol -
* so the last number we can serve is this.
*/
filp
->
f_
pos
=
0x7fffffff
;
ctx
->
pos
=
0x7fffffff
;
else
filp
->
f_
pos
++
;
ctx
->
pos
++
;
nopos:
ret
=
0
;
err:
...
...
@@ -8731,7 +8714,7 @@ static const struct inode_operations btrfs_dir_ro_inode_operations = {
static
const
struct
file_operations
btrfs_dir_file_operations
=
{
.
llseek
=
generic_file_llseek
,
.
read
=
generic_read_dir
,
.
readdir
=
btrfs_real_readdir
,
.
iterate
=
btrfs_real_readdir
,
.
unlocked_ioctl
=
btrfs_ioctl
,
#ifdef CONFIG_COMPAT
.
compat_ioctl
=
btrfs_ioctl
,
...
...
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