aboutsummaryrefslogtreecommitdiffstats
path: root/include/trace
diff options
context:
space:
mode:
authorLukas Czerner <lczerner@redhat.com>2013-05-27 23:33:35 -0400
committerTheodore Ts'o <tytso@mit.edu>2013-05-27 23:33:35 -0400
commitd23142c6271c499d913d0d5e668b5a4eb6dafcb0 (patch)
tree71cd768dc0d4dfc9034187393f6084042f775b57 /include/trace
parent61801325f790ea15ba0630a7a26bd80a0741813f (diff)
ext4: make punch hole code path work with bigalloc
Currently punch hole is disabled in file systems with bigalloc feature enabled. However the recent changes in punch hole patch should make it easier to support punching holes on bigalloc enabled file systems. This commit changes partial_cluster handling in ext4_remove_blocks(), ext4_ext_rm_leaf() and ext4_ext_remove_space(). Currently partial_cluster is unsigned long long type and it makes sure that we will free the partial cluster if all extents has been released from that cluster. However it has been specifically designed only for truncate. With punch hole we can be freeing just some extents in the cluster leaving the rest untouched. So we have to make sure that we will notice cluster which still has some extents. To do this I've changed partial_cluster to be signed long long type. The only scenario where this could be a problem is when cluster_size == block size, however in that case there would not be any partial clusters so we're safe. For bigger clusters the signed type is enough. Now we use the negative value in partial_cluster to mark such cluster used, hence we know that we must not free it even if all other extents has been freed from such cluster. This scenario can be described in simple diagram: |FFF...FF..FF.UUU| ^----------^ punch hole . - free space | - cluster boundary F - freed extent U - used extent Also update respective tracepoints to use signed long long type for partial_cluster. Signed-off-by: Lukas Czerner <lczerner@redhat.com> Reviewed-by: Jan Kara <jack@suse.cz> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Diffstat (limited to 'include/trace')
-rw-r--r--include/trace/events/ext4.h25
1 files changed, 13 insertions, 12 deletions
diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h
index bcb5a021945c..e23b2188110a 100644
--- a/include/trace/events/ext4.h
+++ b/include/trace/events/ext4.h
@@ -1928,7 +1928,7 @@ TRACE_EVENT(ext4_ext_show_extent,
1928TRACE_EVENT(ext4_remove_blocks, 1928TRACE_EVENT(ext4_remove_blocks,
1929 TP_PROTO(struct inode *inode, struct ext4_extent *ex, 1929 TP_PROTO(struct inode *inode, struct ext4_extent *ex,
1930 ext4_lblk_t from, ext4_fsblk_t to, 1930 ext4_lblk_t from, ext4_fsblk_t to,
1931 ext4_fsblk_t partial_cluster), 1931 long long partial_cluster),
1932 1932
1933 TP_ARGS(inode, ex, from, to, partial_cluster), 1933 TP_ARGS(inode, ex, from, to, partial_cluster),
1934 1934
@@ -1937,7 +1937,7 @@ TRACE_EVENT(ext4_remove_blocks,
1937 __field( ino_t, ino ) 1937 __field( ino_t, ino )
1938 __field( ext4_lblk_t, from ) 1938 __field( ext4_lblk_t, from )
1939 __field( ext4_lblk_t, to ) 1939 __field( ext4_lblk_t, to )
1940 __field( ext4_fsblk_t, partial ) 1940 __field( long long, partial )
1941 __field( ext4_fsblk_t, ee_pblk ) 1941 __field( ext4_fsblk_t, ee_pblk )
1942 __field( ext4_lblk_t, ee_lblk ) 1942 __field( ext4_lblk_t, ee_lblk )
1943 __field( unsigned short, ee_len ) 1943 __field( unsigned short, ee_len )
@@ -1955,7 +1955,7 @@ TRACE_EVENT(ext4_remove_blocks,
1955 ), 1955 ),
1956 1956
1957 TP_printk("dev %d,%d ino %lu extent [%u(%llu), %u]" 1957 TP_printk("dev %d,%d ino %lu extent [%u(%llu), %u]"
1958 "from %u to %u partial_cluster %u", 1958 "from %u to %u partial_cluster %lld",
1959 MAJOR(__entry->dev), MINOR(__entry->dev), 1959 MAJOR(__entry->dev), MINOR(__entry->dev),
1960 (unsigned long) __entry->ino, 1960 (unsigned long) __entry->ino,
1961 (unsigned) __entry->ee_lblk, 1961 (unsigned) __entry->ee_lblk,
@@ -1963,19 +1963,20 @@ TRACE_EVENT(ext4_remove_blocks,
1963 (unsigned short) __entry->ee_len, 1963 (unsigned short) __entry->ee_len,
1964 (unsigned) __entry->from, 1964 (unsigned) __entry->from,
1965 (unsigned) __entry->to, 1965 (unsigned) __entry->to,
1966 (unsigned) __entry->partial) 1966 (long long) __entry->partial)
1967); 1967);
1968 1968
1969TRACE_EVENT(ext4_ext_rm_leaf, 1969TRACE_EVENT(ext4_ext_rm_leaf,
1970 TP_PROTO(struct inode *inode, ext4_lblk_t start, 1970 TP_PROTO(struct inode *inode, ext4_lblk_t start,
1971 struct ext4_extent *ex, ext4_fsblk_t partial_cluster), 1971 struct ext4_extent *ex,
1972 long long partial_cluster),
1972 1973
1973 TP_ARGS(inode, start, ex, partial_cluster), 1974 TP_ARGS(inode, start, ex, partial_cluster),
1974 1975
1975 TP_STRUCT__entry( 1976 TP_STRUCT__entry(
1976 __field( dev_t, dev ) 1977 __field( dev_t, dev )
1977 __field( ino_t, ino ) 1978 __field( ino_t, ino )
1978 __field( ext4_fsblk_t, partial ) 1979 __field( long long, partial )
1979 __field( ext4_lblk_t, start ) 1980 __field( ext4_lblk_t, start )
1980 __field( ext4_lblk_t, ee_lblk ) 1981 __field( ext4_lblk_t, ee_lblk )
1981 __field( ext4_fsblk_t, ee_pblk ) 1982 __field( ext4_fsblk_t, ee_pblk )
@@ -1993,14 +1994,14 @@ TRACE_EVENT(ext4_ext_rm_leaf,
1993 ), 1994 ),
1994 1995
1995 TP_printk("dev %d,%d ino %lu start_lblk %u last_extent [%u(%llu), %u]" 1996 TP_printk("dev %d,%d ino %lu start_lblk %u last_extent [%u(%llu), %u]"
1996 "partial_cluster %u", 1997 "partial_cluster %lld",
1997 MAJOR(__entry->dev), MINOR(__entry->dev), 1998 MAJOR(__entry->dev), MINOR(__entry->dev),
1998 (unsigned long) __entry->ino, 1999 (unsigned long) __entry->ino,
1999 (unsigned) __entry->start, 2000 (unsigned) __entry->start,
2000 (unsigned) __entry->ee_lblk, 2001 (unsigned) __entry->ee_lblk,
2001 (unsigned long long) __entry->ee_pblk, 2002 (unsigned long long) __entry->ee_pblk,
2002 (unsigned short) __entry->ee_len, 2003 (unsigned short) __entry->ee_len,
2003 (unsigned) __entry->partial) 2004 (long long) __entry->partial)
2004); 2005);
2005 2006
2006TRACE_EVENT(ext4_ext_rm_idx, 2007TRACE_EVENT(ext4_ext_rm_idx,
@@ -2058,7 +2059,7 @@ TRACE_EVENT(ext4_ext_remove_space,
2058 2059
2059TRACE_EVENT(ext4_ext_remove_space_done, 2060TRACE_EVENT(ext4_ext_remove_space_done,
2060 TP_PROTO(struct inode *inode, ext4_lblk_t start, ext4_lblk_t end, 2061 TP_PROTO(struct inode *inode, ext4_lblk_t start, ext4_lblk_t end,
2061 int depth, ext4_lblk_t partial, __le16 eh_entries), 2062 int depth, long long partial, __le16 eh_entries),
2062 2063
2063 TP_ARGS(inode, start, end, depth, partial, eh_entries), 2064 TP_ARGS(inode, start, end, depth, partial, eh_entries),
2064 2065
@@ -2068,7 +2069,7 @@ TRACE_EVENT(ext4_ext_remove_space_done,
2068 __field( ext4_lblk_t, start ) 2069 __field( ext4_lblk_t, start )
2069 __field( ext4_lblk_t, end ) 2070 __field( ext4_lblk_t, end )
2070 __field( int, depth ) 2071 __field( int, depth )
2071 __field( ext4_lblk_t, partial ) 2072 __field( long long, partial )
2072 __field( unsigned short, eh_entries ) 2073 __field( unsigned short, eh_entries )
2073 ), 2074 ),
2074 2075
@@ -2082,14 +2083,14 @@ TRACE_EVENT(ext4_ext_remove_space_done,
2082 __entry->eh_entries = le16_to_cpu(eh_entries); 2083 __entry->eh_entries = le16_to_cpu(eh_entries);
2083 ), 2084 ),
2084 2085
2085 TP_printk("dev %d,%d ino %lu since %u end %u depth %d partial %u " 2086 TP_printk("dev %d,%d ino %lu since %u end %u depth %d partial %lld "
2086 "remaining_entries %u", 2087 "remaining_entries %u",
2087 MAJOR(__entry->dev), MINOR(__entry->dev), 2088 MAJOR(__entry->dev), MINOR(__entry->dev),
2088 (unsigned long) __entry->ino, 2089 (unsigned long) __entry->ino,
2089 (unsigned) __entry->start, 2090 (unsigned) __entry->start,
2090 (unsigned) __entry->end, 2091 (unsigned) __entry->end,
2091 __entry->depth, 2092 __entry->depth,
2092 (unsigned) __entry->partial, 2093 (long long) __entry->partial,
2093 (unsigned short) __entry->eh_entries) 2094 (unsigned short) __entry->eh_entries)
2094); 2095);
2095 2096