mirror of
git://git.sv.gnu.org/coreutils.git
synced 2026-08-01 21:47:06 +02:00
extent-scan: adjust naming and formatting
* src/extent-scan.h [struct extent_scan]: Rename member: s/hit_last_extent/hit_final_extent/. "final" is clearer, since "last" can be interpreted as "preceding". Rename extent-scan functions to start with extent_scan_. * src/Makefile.am (copy_sources): Also distribute extent-scan.h. * src/extent-scan.c: Don't include error.h or quote.h. Neither is used. * src/copy.c: shorten a comment to fit in 80 columns * src/extent-scan.c, src/extent-scan.h: Correct formatting.
This commit is contained in:
+1
-1
@@ -450,7 +450,7 @@ uninstall-local:
|
||||
fi; \
|
||||
fi
|
||||
|
||||
copy_sources = copy.c cp-hash.c extent-scan.c
|
||||
copy_sources = copy.c cp-hash.c extent-scan.c extent-scan.h
|
||||
|
||||
# Use `ginstall' in the definition of PROGRAMS and in dependencies to avoid
|
||||
# confusion with the `install' target. The install rule transforms `ginstall'
|
||||
|
||||
+7
-9
@@ -204,19 +204,18 @@ extent_copy (int src_fd, int dest_fd, size_t buf_size,
|
||||
uint64_t last_ext_len = 0;
|
||||
uint64_t last_read_size = 0;
|
||||
|
||||
open_extent_scan (src_fd, &scan);
|
||||
extent_scan_init (src_fd, &scan);
|
||||
|
||||
do
|
||||
{
|
||||
bool ok = get_extents_info (&scan);
|
||||
bool ok = extent_scan_read (&scan);
|
||||
if (! ok)
|
||||
{
|
||||
if (scan.hit_last_extent)
|
||||
if (scan.hit_final_extent)
|
||||
break;
|
||||
|
||||
if (scan.initial_scan_failed)
|
||||
{
|
||||
close_extent_scan (&scan);
|
||||
*require_normal_copy = true;
|
||||
return false;
|
||||
}
|
||||
@@ -288,7 +287,7 @@ extent_copy (int src_fd, int dest_fd, size_t buf_size,
|
||||
|
||||
if (n_read == 0)
|
||||
{
|
||||
/* Figure out how many bytes read from the previous extent. */
|
||||
/* Record number of bytes read from the previous extent. */
|
||||
last_read_size = last_ext_len - ext_len;
|
||||
break;
|
||||
}
|
||||
@@ -304,11 +303,10 @@ extent_copy (int src_fd, int dest_fd, size_t buf_size,
|
||||
}
|
||||
|
||||
/* Release the space allocated to scan->ext_info. */
|
||||
free_extents_info (&scan);
|
||||
} while (! scan.hit_last_extent);
|
||||
extent_scan_free (&scan);
|
||||
|
||||
/* Do nothing now. */
|
||||
close_extent_scan (&scan);
|
||||
}
|
||||
while (! scan.hit_final_extent);
|
||||
|
||||
/* If a file ends up with holes, the sum of the last extent logical offset
|
||||
and the read-returned size or the last extent length will be shorter than
|
||||
|
||||
+13
-10
@@ -24,23 +24,21 @@
|
||||
|
||||
#include "system.h"
|
||||
#include "extent-scan.h"
|
||||
#include "error.h"
|
||||
#include "quote.h"
|
||||
|
||||
#ifndef HAVE_FIEMAP
|
||||
# include "fiemap.h"
|
||||
#endif
|
||||
|
||||
/* Allocate space for struct extent_scan, initialize the entries if
|
||||
necessary and return it as the input argument of get_extents_info(). */
|
||||
necessary and return it as the input argument of extent_scan_read(). */
|
||||
extern void
|
||||
open_extent_scan (int src_fd, struct extent_scan *scan)
|
||||
extent_scan_init (int src_fd, struct extent_scan *scan)
|
||||
{
|
||||
scan->fd = src_fd;
|
||||
scan->ei_count = 0;
|
||||
scan->scan_start = 0;
|
||||
scan->initial_scan_failed = false;
|
||||
scan->hit_last_extent = false;
|
||||
scan->hit_final_extent = false;
|
||||
}
|
||||
|
||||
#ifdef __linux__
|
||||
@@ -50,14 +48,13 @@ open_extent_scan (int src_fd, struct extent_scan *scan)
|
||||
/* Call ioctl(2) with FS_IOC_FIEMAP (available in linux 2.6.27) to
|
||||
obtain a map of file extents excluding holes. */
|
||||
extern bool
|
||||
get_extents_info (struct extent_scan *scan)
|
||||
extent_scan_read (struct extent_scan *scan)
|
||||
{
|
||||
union { struct fiemap f; char c[4096]; } fiemap_buf;
|
||||
struct fiemap *fiemap = &fiemap_buf.f;
|
||||
struct fiemap_extent *fm_extents = &fiemap->fm_extents[0];
|
||||
enum { count = (sizeof fiemap_buf - sizeof *fiemap) / sizeof *fm_extents };
|
||||
verify (count != 0);
|
||||
unsigned int i;
|
||||
|
||||
/* This is required at least to initialize fiemap->fm_start,
|
||||
but also serves (in mid 2010) to appease valgrind, which
|
||||
@@ -81,13 +78,14 @@ get_extents_info (struct extent_scan *scan)
|
||||
/* If 0 extents are returned, then more get_extent_table() are not needed. */
|
||||
if (fiemap->fm_mapped_extents == 0)
|
||||
{
|
||||
scan->hit_last_extent = true;
|
||||
scan->hit_final_extent = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
scan->ei_count = fiemap->fm_mapped_extents;
|
||||
scan->ext_info = xnmalloc (scan->ei_count, sizeof (struct extent_info));
|
||||
|
||||
unsigned int i;
|
||||
for (i = 0; i < scan->ei_count; i++)
|
||||
{
|
||||
assert (fm_extents[i].fe_logical <= OFF_T_MAX);
|
||||
@@ -100,7 +98,7 @@ get_extents_info (struct extent_scan *scan)
|
||||
i--;
|
||||
if (scan->ext_info[i].ext_flags & FIEMAP_EXTENT_LAST)
|
||||
{
|
||||
scan->hit_last_extent = true;
|
||||
scan->hit_final_extent = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -109,5 +107,10 @@ get_extents_info (struct extent_scan *scan)
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
extern bool get_extents_info (ignored) { errno = ENOTSUP; return false; }
|
||||
extern bool
|
||||
extent_scan_read (struct extent_scan *scan ATTRIBUTE_UNUSED)
|
||||
{
|
||||
errno = ENOTSUP;
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
+13
-13
@@ -19,7 +19,7 @@
|
||||
#ifndef EXTENT_SCAN_H
|
||||
# define EXTENT_SCAN_H
|
||||
|
||||
/* Structure used to reserve information of each extent. */
|
||||
/* Structure used to store information of each extent. */
|
||||
struct extent_info
|
||||
{
|
||||
/* Logical offset of an extent. */
|
||||
@@ -44,25 +44,25 @@ struct extent_scan
|
||||
/* How many extent info returned for a scan. */
|
||||
uint32_t ei_count;
|
||||
|
||||
/* If true, fall back to a normal copy, either
|
||||
set by the failure of ioctl(2) for FIEMAP or
|
||||
lseek(2) with SEEK_DATA. */
|
||||
/* If true, fall back to a normal copy, either set by the
|
||||
failure of ioctl(2) for FIEMAP or lseek(2) with SEEK_DATA. */
|
||||
bool initial_scan_failed;
|
||||
|
||||
/* If ture, the total extent scan per file has been finished. */
|
||||
bool hit_last_extent;
|
||||
/* If true, the total extent scan per file has been finished. */
|
||||
bool hit_final_extent;
|
||||
|
||||
/* Extent information. */
|
||||
/* Extent information: a malloc'd array of ei_count structs. */
|
||||
struct extent_info *ext_info;
|
||||
};
|
||||
|
||||
void
|
||||
open_extent_scan (int src_fd, struct extent_scan *scan);
|
||||
void extent_scan_init (int src_fd, struct extent_scan *scan);
|
||||
|
||||
bool
|
||||
get_extents_info (struct extent_scan *scan);
|
||||
bool extent_scan_read (struct extent_scan *scan);
|
||||
|
||||
#define free_extents_info(ext_scan) free ((ext_scan)->ext_info)
|
||||
#define close_extent_scan(ext_scan) /* empty */
|
||||
static inline void
|
||||
extent_scan_free (struct extent_scan *scan)
|
||||
{
|
||||
free (scan->ext_info);
|
||||
}
|
||||
|
||||
#endif /* EXTENT_SCAN_H */
|
||||
|
||||
Reference in New Issue
Block a user