cgget, cgput,
    cgread, cgread1,
    cgwrite, cgwrite1 —
    read/write cylinder groups of UFS disks
UFS File System Access Library (libufs,
    -lufs)
#include
    <sys/param.h>
  
  #include <sys/mount.h>
  
  #include <ufs/ufs/ufsmount.h>
  
  #include <ufs/ufs/dinode.h>
  
  #include <ufs/ffs/fs.h>
  
  #include <libufs.h>
int
  
  cgget(int
    devfd, struct fs
    *fs, int cg,
    struct cg *cgp);
int
  
  cgput(int
    devfd, struct fs
    *fs, struct cg
    *cgp);
int
  
  cgread(struct
    uufsd *disk);
int
  
  cgread1(struct
    uufsd *disk, int
    cg);
int
  
  cgwrite(struct
    uufsd *disk);
int
  
  cgwrite1(struct
    uufsd *disk, int
    cg);
The
    cgget(),
    cgread(), and cgread1()
    functions provide cylinder group reads for
    libufs(3)
    consumers. The cgput(),
    cgwrite(), and cgwrite1()
    functions provide cylinder group writes for
    libufs(3)
    consumers.
The
    cgget()
    function reads the cylinder group specified by cg into
    the buffer pointed to by cgp from the filesystem
    described by the fs superblock using the
    devfd file descriptor that references the filesystem
    disk. The cgget() function is the only cylinder
    group read function that is safe to use in threaded applications.
The
    cgput()
    function writes the cylinder group specified by cgp to
    the filesystem described by the fs superblock using
    the devfd file descriptor that references the
    filesystem disk. The cgput() function is the only
    cylinder group write function that is safe to use in threaded applications.
    Note that the cgput() function needs to be called
    only if the cylinder group has been modified and the on-disk copy needs to
    be updated.
The
    cgread1()
    function reads from the cylinder group specified by cg
    into the d_cg cylinder-group structure in a user-land
    UFS-disk structure. It sets the d_lcg field to the
    cylinder group number cg.
The
    cgread()
    function operates on sequential cylinder groups. Calling the
    cgread() function is equivalent to calling
    cgread1() with a cylinder group specifier equivalent
    to the value of the current d_ccg field, and then
    incrementing the d_ccg field.
The
    cgwrite()
    function stores on disk the cylinder group held in the
    d_cg cylinder-group structure in a user-land UFS-disk
    structure.
The
    cgwrite1()
    function provides no additional functionality over the
    cgwrite() function as there is only one place that a
    given cylinder group can correctly be written. If the caller gets the
    cg parameter wrong, the function fails with the error
    EDOOFUS. This function remains only to provide
    backward compatibility.
The cgread() function returns 0 if there
    are no more cylinder groups to read, 1 if there are more cylinder groups,
    and -1 on error. The cgread1() function returns 1 on
    success and -1 on error. The other functions return 0 on success and -1 on
    error.
The cgget(),
    cgread(), and cgread1()
    functions may fail and set errno for any of the errors
    specified for the library function
    bread(3).
The cgput(),
    cgwrite(), and cgwrite1()
    functions may fail and set errno for any of the errors
    specified for the library function
    bwrite(3).
    Additionally the cgwrite1() will return the
    EDOOFUS error if the cylinder group specified does
    not match the cylinder group that it is requesting to write.
These functions first appeared as part of
    libufs(3)
    in FreeBSD 5.1.