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
a89b3f97
Commit
a89b3f97
authored
Oct 03, 2016
by
Dave Chinner
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'xfs-4.9-delalloc-rework' into for-next
parents
79ad5761
51446f5b
Changes
6
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
242 additions
and
350 deletions
+242
-350
fs/xfs/libxfs/xfs_bmap.c
fs/xfs/libxfs/xfs_bmap.c
+2
-87
fs/xfs/libxfs/xfs_bmap.h
fs/xfs/libxfs/xfs_bmap.h
+7
-3
fs/xfs/xfs_icache.c
fs/xfs/xfs_icache.c
+14
-0
fs/xfs/xfs_inode.h
fs/xfs/xfs_inode.h
+1
-0
fs/xfs/xfs_iomap.c
fs/xfs/xfs_iomap.c
+218
-258
fs/xfs/xfs_iomap.h
fs/xfs/xfs_iomap.h
+0
-2
No files found.
fs/xfs/libxfs/xfs_bmap.c
View file @
a89b3f97
...
...
@@ -1389,7 +1389,7 @@ xfs_bmap_search_multi_extents(
* Else, *lastxp will be set to the index of the found
* entry; *gotp will contain the entry.
*/
STATIC
xfs_bmbt_rec_host_t
*
/* pointer to found extent entry */
xfs_bmbt_rec_host_t
*
/* pointer to found extent entry */
xfs_bmap_search_extents
(
xfs_inode_t
*
ip
,
/* incore inode pointer */
xfs_fileoff_t
bno
,
/* block number searched for */
...
...
@@ -4076,7 +4076,7 @@ xfs_bmapi_read(
return
0
;
}
STATIC
int
int
xfs_bmapi_reserve_delalloc
(
struct
xfs_inode
*
ip
,
xfs_fileoff_t
aoff
,
...
...
@@ -4172,91 +4172,6 @@ xfs_bmapi_reserve_delalloc(
return
error
;
}
/*
* Map file blocks to filesystem blocks, adding delayed allocations as needed.
*/
int
xfs_bmapi_delay
(
struct
xfs_inode
*
ip
,
/* incore inode */
xfs_fileoff_t
bno
,
/* starting file offs. mapped */
xfs_filblks_t
len
,
/* length to map in file */
struct
xfs_bmbt_irec
*
mval
,
/* output: map values */
int
*
nmap
,
/* i/o: mval size/count */
int
flags
)
/* XFS_BMAPI_... */
{
struct
xfs_mount
*
mp
=
ip
->
i_mount
;
struct
xfs_ifork
*
ifp
=
XFS_IFORK_PTR
(
ip
,
XFS_DATA_FORK
);
struct
xfs_bmbt_irec
got
;
/* current file extent record */
struct
xfs_bmbt_irec
prev
;
/* previous file extent record */
xfs_fileoff_t
obno
;
/* old block number (offset) */
xfs_fileoff_t
end
;
/* end of mapped file region */
xfs_extnum_t
lastx
;
/* last useful extent number */
int
eof
;
/* we've hit the end of extents */
int
n
=
0
;
/* current extent index */
int
error
=
0
;
ASSERT
(
*
nmap
>=
1
);
ASSERT
(
*
nmap
<=
XFS_BMAP_MAX_NMAP
);
ASSERT
(
!
(
flags
&
~
XFS_BMAPI_ENTIRE
));
ASSERT
(
xfs_isilocked
(
ip
,
XFS_ILOCK_EXCL
));
if
(
unlikely
(
XFS_TEST_ERROR
(
(
XFS_IFORK_FORMAT
(
ip
,
XFS_DATA_FORK
)
!=
XFS_DINODE_FMT_EXTENTS
&&
XFS_IFORK_FORMAT
(
ip
,
XFS_DATA_FORK
)
!=
XFS_DINODE_FMT_BTREE
),
mp
,
XFS_ERRTAG_BMAPIFORMAT
,
XFS_RANDOM_BMAPIFORMAT
)))
{
XFS_ERROR_REPORT
(
"xfs_bmapi_delay"
,
XFS_ERRLEVEL_LOW
,
mp
);
return
-
EFSCORRUPTED
;
}
if
(
XFS_FORCED_SHUTDOWN
(
mp
))
return
-
EIO
;
XFS_STATS_INC
(
mp
,
xs_blk_mapw
);
if
(
!
(
ifp
->
if_flags
&
XFS_IFEXTENTS
))
{
error
=
xfs_iread_extents
(
NULL
,
ip
,
XFS_DATA_FORK
);
if
(
error
)
return
error
;
}
xfs_bmap_search_extents
(
ip
,
bno
,
XFS_DATA_FORK
,
&
eof
,
&
lastx
,
&
got
,
&
prev
);
end
=
bno
+
len
;
obno
=
bno
;
while
(
bno
<
end
&&
n
<
*
nmap
)
{
if
(
eof
||
got
.
br_startoff
>
bno
)
{
error
=
xfs_bmapi_reserve_delalloc
(
ip
,
bno
,
len
,
&
got
,
&
prev
,
&
lastx
,
eof
);
if
(
error
)
{
if
(
n
==
0
)
{
*
nmap
=
0
;
return
error
;
}
break
;
}
}
/* set up the extent map to return. */
xfs_bmapi_trim_map
(
mval
,
&
got
,
&
bno
,
len
,
obno
,
end
,
n
,
flags
);
xfs_bmapi_update_map
(
&
mval
,
&
bno
,
&
len
,
obno
,
end
,
&
n
,
flags
);
/* If we're done, stop now. */
if
(
bno
>=
end
||
n
>=
*
nmap
)
break
;
/* Else go on to the next record. */
prev
=
got
;
if
(
++
lastx
<
ifp
->
if_bytes
/
sizeof
(
xfs_bmbt_rec_t
))
xfs_bmbt_get_all
(
xfs_iext_get_ext
(
ifp
,
lastx
),
&
got
);
else
eof
=
1
;
}
*
nmap
=
n
;
return
0
;
}
static
int
xfs_bmapi_allocate
(
struct
xfs_bmalloca
*
bma
)
...
...
fs/xfs/libxfs/xfs_bmap.h
View file @
a89b3f97
...
...
@@ -181,9 +181,6 @@ int xfs_bmap_read_extents(struct xfs_trans *tp, struct xfs_inode *ip,
int
xfs_bmapi_read
(
struct
xfs_inode
*
ip
,
xfs_fileoff_t
bno
,
xfs_filblks_t
len
,
struct
xfs_bmbt_irec
*
mval
,
int
*
nmap
,
int
flags
);
int
xfs_bmapi_delay
(
struct
xfs_inode
*
ip
,
xfs_fileoff_t
bno
,
xfs_filblks_t
len
,
struct
xfs_bmbt_irec
*
mval
,
int
*
nmap
,
int
flags
);
int
xfs_bmapi_write
(
struct
xfs_trans
*
tp
,
struct
xfs_inode
*
ip
,
xfs_fileoff_t
bno
,
xfs_filblks_t
len
,
int
flags
,
xfs_fsblock_t
*
firstblock
,
xfs_extlen_t
total
,
...
...
@@ -202,5 +199,12 @@ int xfs_bmap_shift_extents(struct xfs_trans *tp, struct xfs_inode *ip,
struct
xfs_defer_ops
*
dfops
,
enum
shift_direction
direction
,
int
num_exts
);
int
xfs_bmap_split_extent
(
struct
xfs_inode
*
ip
,
xfs_fileoff_t
split_offset
);
struct
xfs_bmbt_rec_host
*
xfs_bmap_search_extents
(
struct
xfs_inode
*
ip
,
xfs_fileoff_t
bno
,
int
fork
,
int
*
eofp
,
xfs_extnum_t
*
lastxp
,
struct
xfs_bmbt_irec
*
gotp
,
struct
xfs_bmbt_irec
*
prevp
);
int
xfs_bmapi_reserve_delalloc
(
struct
xfs_inode
*
ip
,
xfs_fileoff_t
aoff
,
xfs_filblks_t
len
,
struct
xfs_bmbt_irec
*
got
,
struct
xfs_bmbt_irec
*
prev
,
xfs_extnum_t
*
lastx
,
int
eof
);
#endif
/* __XFS_BMAP_H__ */
fs/xfs/xfs_icache.c
View file @
a89b3f97
...
...
@@ -1414,6 +1414,16 @@ xfs_inode_set_eofblocks_tag(
struct
xfs_perag
*
pag
;
int
tagged
;
/*
* Don't bother locking the AG and looking up in the radix trees
* if we already know that we have the tag set.
*/
if
(
ip
->
i_flags
&
XFS_IEOFBLOCKS
)
return
;
spin_lock
(
&
ip
->
i_flags_lock
);
ip
->
i_flags
|=
XFS_IEOFBLOCKS
;
spin_unlock
(
&
ip
->
i_flags_lock
);
pag
=
xfs_perag_get
(
mp
,
XFS_INO_TO_AGNO
(
mp
,
ip
->
i_ino
));
spin_lock
(
&
pag
->
pag_ici_lock
);
trace_xfs_inode_set_eofblocks_tag
(
ip
);
...
...
@@ -1449,6 +1459,10 @@ xfs_inode_clear_eofblocks_tag(
struct
xfs_mount
*
mp
=
ip
->
i_mount
;
struct
xfs_perag
*
pag
;
spin_lock
(
&
ip
->
i_flags_lock
);
ip
->
i_flags
&=
~
XFS_IEOFBLOCKS
;
spin_unlock
(
&
ip
->
i_flags_lock
);
pag
=
xfs_perag_get
(
mp
,
XFS_INO_TO_AGNO
(
mp
,
ip
->
i_ino
));
spin_lock
(
&
pag
->
pag_ici_lock
);
trace_xfs_inode_clear_eofblocks_tag
(
ip
);
...
...
fs/xfs/xfs_inode.h
View file @
a89b3f97
...
...
@@ -216,6 +216,7 @@ xfs_get_initial_prid(struct xfs_inode *dp)
#define __XFS_IPINNED_BIT 8
/* wakeup key for zero pin count */
#define XFS_IPINNED (1 << __XFS_IPINNED_BIT)
#define XFS_IDONTCACHE (1 << 9)
/* don't cache the inode long term */
#define XFS_IEOFBLOCKS (1 << 10)
/* has the preallocblocks tag set */
/*
* Per-lifetime flags need to be reset when re-using a reclaimable inode during
...
...
fs/xfs/xfs_iomap.c
View file @
a89b3f97
This diff is collapsed.
Click to expand it.
fs/xfs/xfs_iomap.h
View file @
a89b3f97
...
...
@@ -25,8 +25,6 @@ struct xfs_bmbt_irec;
int
xfs_iomap_write_direct
(
struct
xfs_inode
*
,
xfs_off_t
,
size_t
,
struct
xfs_bmbt_irec
*
,
int
);
int
xfs_iomap_write_delay
(
struct
xfs_inode
*
,
xfs_off_t
,
size_t
,
struct
xfs_bmbt_irec
*
);
int
xfs_iomap_write_allocate
(
struct
xfs_inode
*
,
xfs_off_t
,
struct
xfs_bmbt_irec
*
);
int
xfs_iomap_write_unwritten
(
struct
xfs_inode
*
,
xfs_off_t
,
xfs_off_t
);
...
...
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