SCCS-vsn: libexec/lfs_cleanerd/library.c 5.8
-static char sccsid[] = "@(#)library.c 5.7 (Berkeley) %G%";
+static char sccsid[] = "@(#)library.c 5.8 (Berkeley) %G%";
#endif /* not lint */
#include <sys/param.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <sys/mount.h>
#endif /* not lint */
#include <sys/param.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <sys/mount.h>
+#include <sys/types.h>
+#include <sys/mman.h>
#include <ufs/ufs/dinode.h>
#include <ufs/lfs/lfs.h>
#include <ufs/ufs/dinode.h>
#include <ufs/lfs/lfs.h>
daddr_t));
int bi_compare __P((const void *, const void *));
int bi_toss __P((const void *, const void *, const void *));
daddr_t));
int bi_compare __P((const void *, const void *));
int bi_toss __P((const void *, const void *, const void *));
-void get_ifile __P((FS_INFO *));
+void get_ifile __P((FS_INFO *, int));
int get_superblock __P((FS_INFO *, struct lfs *));
int pseg_valid __P((FS_INFO *, SEGSUM *));
int get_superblock __P((FS_INFO *, struct lfs *));
int pseg_valid __P((FS_INFO *, SEGSUM *));
* Returns an array of FS_INFO structures, NULL on error.
*/
FS_INFO *
* Returns an array of FS_INFO structures, NULL on error.
*/
FS_INFO *
-get_fs_info (lstatfsp, count)
+get_fs_info (lstatfsp, count, use_mmap)
struct statfs *lstatfsp; /* IN: array of statfs structs */
int count; /* IN: number of file systems */
struct statfs *lstatfsp; /* IN: array of statfs structs */
int count; /* IN: number of file systems */
+ int use_mmap; /* IN: mmap or read */
{
FS_INFO *fp, *fsp;
int i;
{
FS_INFO *fp, *fsp;
int i;
- fsp = (FS_INFO *)malloc(count * sizeof(FS_INFO));
+ fsp = (FS_INFO *)calloc(count, sizeof(FS_INFO));
for (fp = fsp, i = 0; i < count; ++i, ++fp) {
fp->fi_statfsp = lstatfsp++;
for (fp = fsp, i = 0; i < count; ++i, ++fp) {
fp->fi_statfsp = lstatfsp++;
err(1, "get_fs_info: get_superblock failed");
fp->fi_daddr_shift =
fp->fi_lfs.lfs_bshift - fp->fi_lfs.lfs_fsbtodb;
err(1, "get_fs_info: get_superblock failed");
fp->fi_daddr_shift =
fp->fi_lfs.lfs_bshift - fp->fi_lfs.lfs_fsbtodb;
+ get_ifile (fp, use_mmap);
* refresh the file system information (statfs) info.
*/
void
* refresh the file system information (statfs) info.
*/
void
-reread_fs_info(fsp, count)
+reread_fs_info(fsp, count, use_mmap)
FS_INFO *fsp; /* IN: array of fs_infos to free */
int count; /* IN: number of file systems */
{
FS_INFO *fsp; /* IN: array of fs_infos to free */
int count; /* IN: number of file systems */
{
for (i = 0; i < count; ++i, ++fsp) {
if (statfs(fsp->fi_statfsp->f_mntonname, fsp->fi_statfsp))
err(0, "reread_fs_info: statfs failed");
for (i = 0; i < count; ++i, ++fsp) {
if (statfs(fsp->fi_statfsp->f_mntonname, fsp->fi_statfsp))
err(0, "reread_fs_info: statfs failed");
-#ifdef MMAP_WORKS
- if (munmap(fsp->fi_cip, fsp->fi_ifile_length) < 0)
- err(0, "reread_fs_info: munmap failed");
-#else
- free (fsp->fi_cip);
-#endif /* MMAP_WORKS */
- get_ifile (fsp);
+ get_ifile (fsp, use_mmap);
* fatal error on failure.
*/
void
* fatal error on failure.
*/
void
+get_ifile (fsp, use_mmap)
{
struct stat file_stat;
caddr_t ifp;
{
struct stat file_stat;
caddr_t ifp;
if (fstat (fid, &file_stat))
err(1, "get_ifile: fstat failed");
if (fstat (fid, &file_stat))
err(1, "get_ifile: fstat failed");
- fsp->fi_ifile_length = file_stat.st_size;
+ if (use_mmap && file_stat.st_size == fsp->fi_ifile_length) {
+ (void) close(fid);
+ return;
+ }
-#ifndef MMAP_WORKS
- if (!(ifp = malloc ((size_t)fsp->fi_ifile_length)))
- err (1, "get_ifile: malloc failed");
+ if (use_mmap) {
+ if (fsp->fi_cip)
+ munmap((caddr_t)fsp->fi_cip, fsp->fi_ifile_length);
+ ifp = mmap ((caddr_t)0, file_stat.st_size,
+ PROT_READ|PROT_WRITE, 0, fid, (off_t)0);
+ if (ifp == (caddr_t)(-1))
+ err(1, "get_ifile: mmap failed");
+ } else {
+ if (fsp->fi_cip)
+ free(fsp->fi_cip);
+ if (!(ifp = malloc (file_stat.st_size)))
+ err (1, "get_ifile: malloc failed");
- count = read (fid, ifp, (size_t) fsp->fi_ifile_length);
-
- if (count < 0)
- err(1, "get_ifile: bad ifile read");
- else if (count < (int)fsp->fi_ifile_length) {
- err(0, "get_ifile");
- if (lseek(fid, 0, SEEK_SET) < 0)
- err(1, "get_ifile: bad ifile lseek");
- goto redo_read;
+ count = read (fid, ifp, (size_t) file_stat.st_size);
+
+ if (count < 0)
+ err(1, "get_ifile: bad ifile read");
+ else if (count < file_stat.st_size) {
+ err(0, "get_ifile");
+ if (lseek(fid, 0, SEEK_SET) < 0)
+ err(1, "get_ifile: bad ifile lseek");
+ goto redo_read;
+ }
-#else /* MMAP_WORKS */
- ifp = mmap ((caddr_t)0, (size_t) fsp->fi_ifile_length, PROT_READ|PROT_WRITE,
- MAP_FILE|MAP_SHARED, fid, (off_t)0);
- if (ifp < 0)
- err(1, "get_ifile: mmap failed");
-#endif /* MMAP_WORKS */
-
+ fsp->fi_ifile_length = file_stat.st_size;
close (fid);
fsp->fi_cip = (CLEANERINFO *)ifp;
close (fid);
fsp->fi_cip = (CLEANERINFO *)ifp;
bp->bi_lbn = LFS_UNUSED_LBN;
bp->bi_inode = inum;
bp->bi_daddr = *daddrp;
bp->bi_lbn = LFS_UNUSED_LBN;
bp->bi_inode = inum;
bp->bi_daddr = *daddrp;
* read a segment into a memory buffer
*/
int
* read a segment into a memory buffer
*/
int
-mmap_segment (fsp, segment, segbuf)
+mmap_segment (fsp, segment, segbuf, use_mmap)
FS_INFO *fsp; /* file system information */
int segment; /* segment number */
caddr_t *segbuf; /* pointer to buffer area */
FS_INFO *fsp; /* file system information */
int segment; /* segment number */
caddr_t *segbuf; /* pointer to buffer area */
+ int use_mmap; /* mmap instead of read */
{
struct lfs *lfsp;
int fid; /* fildes for file system device */
{
struct lfs *lfsp;
int fid; /* fildes for file system device */
-#ifdef MMAP_SEGMENT
- *segbuf = mmap ((caddr_t)0, seg_size(lfsp), PROT_READ,
- MAP_FILE, fid, seg_byte);
- if (*(long *)segbuf < 0) {
- err(0, "mmap_segment: mmap failed");
- return (NULL);
- }
-#else /* MMAP_SEGMENT */
+ if (use_mmap) {
+ *segbuf = mmap ((caddr_t)0, seg_size(lfsp), PROT_READ,
+ 0, fid, seg_byte);
+ if (*(long *)segbuf < 0) {
+ err(0, "mmap_segment: mmap failed");
+ return (NULL);
+ }
+ } else {
- printf("mmap_segment\tseg_daddr: %lu\tseg_size: %lu\tseg_offset: %qu\n",
- seg_daddr, ssize, seg_byte);
+ printf("mmap_segment\tseg_daddr: %lu\tseg_size: %lu\tseg_offset: %qu\n",
+ seg_daddr, ssize, seg_byte);
- /* malloc the space for the buffer */
- *segbuf = malloc(ssize);
- if (!*segbuf) {
- err(0, "mmap_segment: malloc failed");
- return(NULL);
- }
+ /* malloc the space for the buffer */
+ *segbuf = malloc(ssize);
+ if (!*segbuf) {
+ err(0, "mmap_segment: malloc failed");
+ return(NULL);
+ }
- /* read the segment data into the buffer */
- if (lseek (fid, seg_byte, SEEK_SET) != seg_byte) {
- err (0, "mmap_segment: bad lseek");
- free(*segbuf);
- return (-1);
- }
-
- if (read (fid, *segbuf, ssize) != ssize) {
- err (0, "mmap_segment: bad read");
- free(*segbuf);
- return (-1);
+ /* read the segment data into the buffer */
+ if (lseek (fid, seg_byte, SEEK_SET) != seg_byte) {
+ err (0, "mmap_segment: bad lseek");
+ free(*segbuf);
+ return (-1);
+ }
+
+ if (read (fid, *segbuf, ssize) != ssize) {
+ err (0, "mmap_segment: bad read");
+ free(*segbuf);
+ return (-1);
+ }
-#endif /* MMAP_SEGMENT */
close (fid);
return (0);
}
void
close (fid);
return (0);
}
void
-munmap_segment (fsp, seg_buf)
+munmap_segment (fsp, seg_buf, use_mmap)
FS_INFO *fsp; /* file system information */
caddr_t seg_buf; /* pointer to buffer area */
FS_INFO *fsp; /* file system information */
caddr_t seg_buf; /* pointer to buffer area */
+ int use_mmap; /* mmap instead of read/write */
-#ifdef MMAP_SEGMENT
- munmap (seg_buf, seg_size(&fsp->fi_lfs));
-#else /* MMAP_SEGMENT */
- free (seg_buf);
-#endif /* MMAP_SEGMENT */
+ if (use_mmap)
+ munmap (seg_buf, seg_size(&fsp->fi_lfs));
+ else
+ free (seg_buf);