Rather than trying to shoehorn flags into the requested superblock address, create a separate flags parameter to the ffs_sbget() function in sys/ufs/ffs/ffs_subr.c. The ffs_sbget() function is used both in the kernel and in user-level utilities through export to the sbget() function in the libufs(3) library (see sbget(3) for details). The kernel uses ffs_sbget() when mounting UFS filesystems, in the glabel(8) and gjournal(8) GEOM utilities, and in the standalone library used when booting the system from a UFS root filesystem. The ffs_sbget() function reads the superblock located at the byte offset specified by its sblockloc parameter. The value UFS_STDSB may be specified for sblockloc to request that the standard location for the superblock be read. The two existing options are now flags: UFS_NOHASHFAIL will note if the check hash is wrong but will still return the superblock. This is used by the bootstrap code to give the system a chance to come up so that fsck can be run to correct the problem. UFS_NOMSG indicates that superblock inconsistency error messages should not be printed. It is used by programs like fsck that want to print their own error message and programs like glabel(8) that just want to know if a UFS filesystem exists on a partition. One additional flag is added: UFS_NOCSUM causes only the superblock itself to be returned, but does not read in any auxiliary data structures like the cylinder group summary information. It is used by clients like glabel(8) that just want to check for possible filesystem types. Using UFS_NOCSUM skips the superblock checks for csum data which allows superblocks that have corrupted csum data to be read and used. The validate_sblock() function checks that the superblock has not been corrupted in a way that can crash or hang the system. Unless the UFS_NOMSG flag is specified, it will print out any errors that it finds. Prior to this commit, validate_sblock() returned as soon as it found an inconsistency so would print at most one message. It now does all its checks so when UFS_NOMSG has not been specified will print out everything that it finds inconsistent. Sponsored by: The FreeBSD Foundation
169 lines
3.7 KiB
Groff
169 lines
3.7 KiB
Groff
.\" Author: Juli Mallett <jmallett@FreeBSD.org>
|
|
.\" Date: June 04, 2003
|
|
.\" Description:
|
|
.\" Manual page for libufs functions:
|
|
.\" sbget(3)
|
|
.\" sbput(3)
|
|
.\" sbread(3)
|
|
.\" sbwrite(3)
|
|
.\"
|
|
.\" This file is in the public domain.
|
|
.\"
|
|
.\" $FreeBSD$
|
|
.\"
|
|
.Dd September 2, 2020
|
|
.Dt SBREAD 3
|
|
.Os
|
|
.Sh NAME
|
|
.Nm sbget , sbput , sbread , sbwrite
|
|
.Nd read and write superblocks of a UFS file system
|
|
.Sh LIBRARY
|
|
.Lb libufs
|
|
.Sh SYNOPSIS
|
|
.In sys/param.h
|
|
.In sys/mount.h
|
|
.In ufs/ufs/ufsmount.h
|
|
.In ufs/ufs/dinode.h
|
|
.In ufs/ffs/fs.h
|
|
.In libufs.h
|
|
.Ft int
|
|
.Fn sbget "int devfd" "struct fs **fsp" "off_t sblockloc" "int flags"
|
|
.Ft int
|
|
.Fn sbput "int devfd" "struct fs *fs" "int numaltwrite"
|
|
.Ft int
|
|
.Fn sbread "struct uufsd *disk"
|
|
.Ft int
|
|
.Fn sbwrite "struct uufsd *disk" "int all"
|
|
.Sh DESCRIPTION
|
|
The
|
|
.Fn sbget
|
|
and
|
|
.Fn sbread
|
|
functions provide superblock reads for
|
|
.Xr libufs 3
|
|
consumers.
|
|
The
|
|
.Fn sbput
|
|
and
|
|
.Fn sbwrite
|
|
functions provide superblock writes for
|
|
.Xr libufs 3
|
|
consumers.
|
|
.Pp
|
|
The
|
|
.Fn sbget
|
|
function first allocates a buffer to hold the superblock.
|
|
Using the
|
|
.Va devfd
|
|
file descriptor that references the filesystem disk,
|
|
.Fn sbget
|
|
reads the superblock located at the byte offset specified by
|
|
.Va sblockloc
|
|
into the allocated buffer.
|
|
The value
|
|
.Cm UFS_STDSB
|
|
may be specified for
|
|
.Va sblockloc
|
|
to request that the standard location for the superblock be read.
|
|
Flags are specified by
|
|
.Em or Ns 'ing
|
|
the following values:
|
|
.Pp
|
|
.Bl -tag -width UFS_NOHASHFAIL
|
|
.It Cm UFS_NOHASHFAIL
|
|
Will note if the check hash is wrong but will still return the superblock.
|
|
.It Cm UFS_NOMSG
|
|
Indicates that superblock inconsistency error messages should not be printed.
|
|
.It Cm UFS_NOCSUM
|
|
Causes only the superblock itself to be returned, but does not read in any auxiliary data structures like the cylinder group summary information.
|
|
.El
|
|
.Pp
|
|
If successful,
|
|
.Fn sbget
|
|
returns a pointer to the buffer containing the superblock in
|
|
.Va fsp .
|
|
The
|
|
.Fn sbget
|
|
function is safe to use in threaded applications.
|
|
.Pp
|
|
The
|
|
.Fn sbput
|
|
function writes the superblock specified by
|
|
.Va fs
|
|
to the location from which it was read on the disk referenced by the
|
|
.Va devfd
|
|
file descriptor.
|
|
Additionally, the
|
|
.Fn sbput
|
|
function will update the first
|
|
.Va numaltwrite
|
|
alternate superblock locations.
|
|
To update all the alternate superblocks,
|
|
specify a
|
|
.Va numaltwrite
|
|
value of
|
|
.Va fs->fs_ncg .
|
|
The
|
|
.Fn sbput
|
|
function is safe to use in threaded applications.
|
|
Note that the
|
|
.Fn sbput
|
|
function needs to be called only if the superblock has been
|
|
modified and the on-disk copy needs to be updated.
|
|
.Pp
|
|
The
|
|
.Fn sbread
|
|
function reads the standard filesystem superblock into the
|
|
.Va d_sb ,
|
|
structure embedded in the given user-land UFS disk structure.
|
|
.Pp
|
|
The
|
|
.Fn sbwrite
|
|
function writes the superblock from the
|
|
.Va d_sb ,
|
|
structure embedded in the given user-land UFS disk structure
|
|
to the location from which it was read.
|
|
Additionally, the
|
|
.Fn sbwrite
|
|
function will write to all the alternate superblock locations if the
|
|
.Fa all
|
|
value is non-zero.
|
|
.Sh RETURN VALUES
|
|
.Rv -std sbread sbwrite
|
|
The
|
|
.Fn sbget
|
|
and
|
|
.Fn sbput
|
|
functions return the value 0 if successful;
|
|
otherwise they return one of the errors described below.
|
|
.Sh ERRORS
|
|
The errors returned by
|
|
.Fn sbget
|
|
and
|
|
.Fn sbread
|
|
include any of the errors specified for the library function
|
|
.Xr bread 3 .
|
|
Additionally, they may follow the
|
|
.Xr libufs 3
|
|
error methodologies in situations where no usable superblock could be
|
|
found.
|
|
.Pp
|
|
The errors returned by
|
|
.Fn sbput
|
|
and
|
|
.Fn sbwrite
|
|
include any of the errors specified for the library function
|
|
.Xr bwrite 3 .
|
|
.Sh SEE ALSO
|
|
.Xr bread 3 ,
|
|
.Xr bwrite 3 ,
|
|
.Xr libufs 3
|
|
.Sh HISTORY
|
|
These functions first appeared as part of
|
|
.Xr libufs 3
|
|
in
|
|
.Fx 5.0 .
|
|
.Sh AUTHORS
|
|
.An Juli Mallett Aq Mt jmallett@FreeBSD.org
|
|
.An Marshall Kirk McKusick Aq Mt mckusick@FreeBSD.org
|