aboutsummaryrefslogtreecommitdiff
path: root/sbin
diff options
context:
space:
mode:
Diffstat (limited to 'sbin')
-rw-r--r--sbin/Makefile2
-rw-r--r--sbin/camcontrol/camcontrol.c24
-rw-r--r--sbin/nandfs/Makefile10
-rw-r--r--sbin/nandfs/Makefile.depend18
-rw-r--r--sbin/nandfs/lssnap.c114
-rw-r--r--sbin/nandfs/mksnap.c82
-rw-r--r--sbin/nandfs/nandfs.879
-rw-r--r--sbin/nandfs/nandfs.c76
-rw-r--r--sbin/nandfs/nandfs.h42
-rw-r--r--sbin/nandfs/rmsnap.c89
-rw-r--r--sbin/newfs_nandfs/Makefile9
-rw-r--r--sbin/newfs_nandfs/Makefile.depend20
-rw-r--r--sbin/newfs_nandfs/newfs_nandfs.874
-rw-r--r--sbin/newfs_nandfs/newfs_nandfs.c1183
14 files changed, 21 insertions, 1801 deletions
diff --git a/sbin/Makefile b/sbin/Makefile
index 78c581e357a1..72da4c5bb058 100644
--- a/sbin/Makefile
+++ b/sbin/Makefile
@@ -79,8 +79,6 @@ SUBDIR.${MK_IPFILTER}+= ipf
SUBDIR.${MK_IPFW}+= ipfw
SUBDIR.${MK_IPFW}+= natd
SUBDIR.${MK_ISCSI}+= iscontrol
-SUBDIR.${MK_NAND}+= nandfs
-SUBDIR.${MK_NAND}+= newfs_nandfs
SUBDIR.${MK_NVME}+= nvmecontrol
SUBDIR.${MK_OPENSSL}+= decryptcore
SUBDIR.${MK_PF}+= pfctl
diff --git a/sbin/camcontrol/camcontrol.c b/sbin/camcontrol/camcontrol.c
index 99d59e59d86c..0784fab75a0e 100644
--- a/sbin/camcontrol/camcontrol.c
+++ b/sbin/camcontrol/camcontrol.c
@@ -2326,11 +2326,9 @@ ata_do_identify(struct cam_device *device, int retry_count, int timeout,
}
}
- ident_buf = (struct ata_params *)ptr;
- ata_param_fixup(ident_buf);
-
error = 1;
for (i = 0; i < sizeof(struct ata_params) / 2; i++) {
+ ptr[i] = le16toh(ptr[i]);
if (ptr[i] != 0)
error = 0;
}
@@ -2348,6 +2346,26 @@ ata_do_identify(struct cam_device *device, int retry_count, int timeout,
return (error);
}
+ ident_buf = (struct ata_params *)ptr;
+ if (strncmp(ident_buf->model, "FX", 2) &&
+ strncmp(ident_buf->model, "NEC", 3) &&
+ strncmp(ident_buf->model, "Pioneer", 7) &&
+ strncmp(ident_buf->model, "SHARP", 5)) {
+ ata_bswap(ident_buf->model, sizeof(ident_buf->model));
+ ata_bswap(ident_buf->revision, sizeof(ident_buf->revision));
+ ata_bswap(ident_buf->serial, sizeof(ident_buf->serial));
+ ata_bswap(ident_buf->media_serial, sizeof(ident_buf->media_serial));
+ }
+ ata_btrim(ident_buf->model, sizeof(ident_buf->model));
+ ata_bpack(ident_buf->model, ident_buf->model, sizeof(ident_buf->model));
+ ata_btrim(ident_buf->revision, sizeof(ident_buf->revision));
+ ata_bpack(ident_buf->revision, ident_buf->revision, sizeof(ident_buf->revision));
+ ata_btrim(ident_buf->serial, sizeof(ident_buf->serial));
+ ata_bpack(ident_buf->serial, ident_buf->serial, sizeof(ident_buf->serial));
+ ata_btrim(ident_buf->media_serial, sizeof(ident_buf->media_serial));
+ ata_bpack(ident_buf->media_serial, ident_buf->media_serial,
+ sizeof(ident_buf->media_serial));
+
*ident_bufp = ident_buf;
return (0);
diff --git a/sbin/nandfs/Makefile b/sbin/nandfs/Makefile
deleted file mode 100644
index 40af5775c510..000000000000
--- a/sbin/nandfs/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
-# $FreeBSD$
-
-PACKAGE=nandfs
-PROG= nandfs
-SRCS= nandfs.c lssnap.c mksnap.c rmsnap.c
-MAN= nandfs.8
-
-LIBADD= nandfs
-
-.include <bsd.prog.mk>
diff --git a/sbin/nandfs/Makefile.depend b/sbin/nandfs/Makefile.depend
deleted file mode 100644
index 1269878d50ef..000000000000
--- a/sbin/nandfs/Makefile.depend
+++ /dev/null
@@ -1,18 +0,0 @@
-# $FreeBSD$
-# Autogenerated - do NOT edit!
-
-DIRDEPS = \
- gnu/lib/csu \
- include \
- include/xlocale \
- lib/${CSU_DIR} \
- lib/libc \
- lib/libcompiler_rt \
- lib/libnandfs \
-
-
-.include <dirdeps.mk>
-
-.if ${DEP_RELDIR} == ${_DEP_RELDIR}
-# local dependencies - needed for -jN in clean tree
-.endif
diff --git a/sbin/nandfs/lssnap.c b/sbin/nandfs/lssnap.c
deleted file mode 100644
index cb240fb1da84..000000000000
--- a/sbin/nandfs/lssnap.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
- *
- * Copyright (c) 2012 The FreeBSD Foundation
- * All rights reserved.
- *
- * This software was developed by Semihalf under sponsorship
- * from the FreeBSD Foundation.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-#include <sys/types.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sysexits.h>
-#include <time.h>
-
-#include <fs/nandfs/nandfs_fs.h>
-#include <libnandfs.h>
-
-#include "nandfs.h"
-
-#define NCPINFO 512
-
-static void
-lssnap_usage(void)
-{
-
- fprintf(stderr, "usage:\n");
- fprintf(stderr, "\tlssnap node\n");
-}
-
-static void
-print_cpinfo(struct nandfs_cpinfo *cpinfo)
-{
- struct tm tm;
- time_t t;
- char timebuf[128];
-
- t = (time_t)cpinfo->nci_create;
- localtime_r(&t, &tm);
- strftime(timebuf, sizeof(timebuf), "%F %T", &tm);
-
- printf("%20llu %s\n", (unsigned long long)cpinfo->nci_cno, timebuf);
-}
-
-int
-nandfs_lssnap(int argc, char **argv)
-{
- struct nandfs_cpinfo *cpinfos;
- struct nandfs fs;
- uint64_t next;
- int error, nsnap, i;
-
- if (argc != 1) {
- lssnap_usage();
- return (EX_USAGE);
- }
-
- cpinfos = malloc(sizeof(*cpinfos) * NCPINFO);
- if (cpinfos == NULL) {
- fprintf(stderr, "cannot allocate memory\n");
- return (-1);
- }
-
- nandfs_init(&fs, argv[0]);
- error = nandfs_open(&fs);
- if (error == -1) {
- fprintf(stderr, "nandfs_open: %s\n", nandfs_errmsg(&fs));
- goto out;
- }
-
- for (next = 1; next != 0; next = cpinfos[nsnap - 1].nci_next) {
- nsnap = nandfs_get_snap(&fs, next, cpinfos, NCPINFO);
- if (nsnap < 1)
- break;
-
- for (i = 0; i < nsnap; i++)
- print_cpinfo(&cpinfos[i]);
- }
-
- if (nsnap == -1)
- fprintf(stderr, "nandfs_get_snap: %s\n", nandfs_errmsg(&fs));
-
-out:
- nandfs_close(&fs);
- nandfs_destroy(&fs);
- free(cpinfos);
- return (error);
-}
diff --git a/sbin/nandfs/mksnap.c b/sbin/nandfs/mksnap.c
deleted file mode 100644
index f75eda3834a9..000000000000
--- a/sbin/nandfs/mksnap.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
- *
- * Copyright (c) 2012 The FreeBSD Foundation
- * All rights reserved.
- *
- * This software was developed by Semihalf under sponsorship
- * from the FreeBSD Foundation.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-#include <sys/types.h>
-
-#include <stdio.h>
-#include <sysexits.h>
-
-#include <fs/nandfs/nandfs_fs.h>
-#include <libnandfs.h>
-
-#include "nandfs.h"
-
-static void
-mksnap_usage(void)
-{
-
- fprintf(stderr, "usage:\n");
- fprintf(stderr, "\tmksnap node\n");
-}
-
-int
-nandfs_mksnap(int argc, char **argv)
-{
- struct nandfs fs;
- uint64_t cpno;
- int error;
-
- if (argc != 1) {
- mksnap_usage();
- return (EX_USAGE);
- }
-
- nandfs_init(&fs, argv[0]);
- error = nandfs_open(&fs);
- if (error == -1) {
- fprintf(stderr, "nandfs_open: %s\n", nandfs_errmsg(&fs));
- goto out;
- }
-
- error = nandfs_make_snap(&fs, &cpno);
- if (error == -1)
- fprintf(stderr, "nandfs_make_snap: %s\n", nandfs_errmsg(&fs));
- else
- printf("%jd\n", cpno);
-
-out:
- nandfs_close(&fs);
- nandfs_destroy(&fs);
- return (error);
-}
diff --git a/sbin/nandfs/nandfs.8 b/sbin/nandfs/nandfs.8
deleted file mode 100644
index 9995905d3c68..000000000000
--- a/sbin/nandfs/nandfs.8
+++ /dev/null
@@ -1,79 +0,0 @@
-.\"
-.\" Copyright (c) 2012 The FreeBSD Foundation
-.\" All rights reserved.
-.\"
-.\" This software was developed by Semihalf under sponsorship
-.\" from the FreeBSD Foundation.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\"
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd September 10, 2016
-.Dt NANDFS 8
-.Os
-.Sh NAME
-.Nm nandfs
-.Nd manage mounted NAND FS
-.Sh SYNOPSIS
-.Nm
-.Cm lssnap
-.Ar node
-.Nm
-.Cm mksnap
-.Ar node
-.Nm
-.Cm rmsnap
-.Ar snapshot node
-.Sh DESCRIPTION
-The
-.Nm
-utility allows the management of snapshots on a mounted NAND FS.
-.Sh EXAMPLES
-Create a snapshot of filesystem mounted on
-.Em /nand .
-.Bd -literal -offset 2n
-.Li # Ic nandfs mksnap /nand
-1
-.Ed
-.Pp
-List snapshots of filesystem mounted on
-.Em /nand .
-.Bd -literal -offset 2n
-.Li # Ic nandfs lssnap /nand
-1 2012-02-28 18:49:45 ss 138 2
-.Ed
-.Pp
-Remove snapshot 1 of filesystem mounted on
-.Em /nand .
-.Bd -literal -offset 2n
-.Li # Ic nandfs rmsnap 1 /nand
-.Ed
-.Sh HISTORY
-The
-.Nm
-utility appeared in
-.Fx 10.0 .
-.Sh AUTHORS
-This utility and manual page were written by
-.An Mateusz Guzik .
diff --git a/sbin/nandfs/nandfs.c b/sbin/nandfs/nandfs.c
deleted file mode 100644
index b319b58bc5c1..000000000000
--- a/sbin/nandfs/nandfs.c
+++ /dev/null
@@ -1,76 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
- *
- * Copyright (c) 2012 The FreeBSD Foundation
- * All rights reserved.
- *
- * This software was developed by Semihalf under sponsorship
- * from the FreeBSD Foundation.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sysexits.h>
-
-#include "nandfs.h"
-
-static void
-usage(void)
-{
-
- fprintf(stderr, "usage: nandfs [lssnap | mksnap | rmsnap <snap>] "
- "node\n");
- exit(1);
-}
-
-int
-main(int argc, char **argv)
-{
- int error = 0;
- char *cmd;
-
- if (argc < 2)
- usage();
-
- cmd = argv[1];
- argc -= 2;
- argv += 2;
-
- if (strcmp(cmd, "lssnap") == 0)
- error = nandfs_lssnap(argc, argv);
- else if (strcmp(cmd, "mksnap") == 0)
- error = nandfs_mksnap(argc, argv);
- else if (strcmp(cmd, "rmsnap") == 0)
- error = nandfs_rmsnap(argc, argv);
- else
- usage();
-
- return (error);
-}
diff --git a/sbin/nandfs/nandfs.h b/sbin/nandfs/nandfs.h
deleted file mode 100644
index 993d9338e904..000000000000
--- a/sbin/nandfs/nandfs.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
- *
- * Copyright (c) 2012 The FreeBSD Foundation
- * All rights reserved.
- *
- * This software was developed by Semihalf under sponsorship
- * from the FreeBSD Foundation.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef NANDFS_H
-#define NANDFS_H
-
-int nandfs_lssnap(int, char **);
-int nandfs_mksnap(int, char **);
-int nandfs_rmsnap(int, char **);
-
-#endif /* !NANDFS_H */
diff --git a/sbin/nandfs/rmsnap.c b/sbin/nandfs/rmsnap.c
deleted file mode 100644
index c07439d694ef..000000000000
--- a/sbin/nandfs/rmsnap.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
- *
- * Copyright (c) 2012 The FreeBSD Foundation
- * All rights reserved.
- *
- * This software was developed by Semihalf under sponsorship
- * from the FreeBSD Foundation.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-#include <sys/types.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <limits.h>
-#include <sysexits.h>
-
-#include <fs/nandfs/nandfs_fs.h>
-#include <libnandfs.h>
-
-#include "nandfs.h"
-
-static void
-rmsnap_usage(void)
-{
-
- fprintf(stderr, "usage:\n");
- fprintf(stderr, "\trmsnap snap node\n");
-}
-
-int
-nandfs_rmsnap(int argc, char **argv)
-{
- struct nandfs fs;
- uint64_t cpno;
- int error;
-
- if (argc != 2) {
- rmsnap_usage();
- return (EX_USAGE);
- }
-
- cpno = strtoll(argv[0], (char **)NULL, 10);
- if (cpno == 0) {
- fprintf(stderr, "%s must be a number greater than 0\n",
- argv[0]);
- return (EX_USAGE);
- }
-
- nandfs_init(&fs, argv[1]);
- error = nandfs_open(&fs);
- if (error == -1) {
- fprintf(stderr, "nandfs_open: %s\n", nandfs_errmsg(&fs));
- goto out;
- }
-
- error = nandfs_delete_snap(&fs, cpno);
- if (error == -1)
- fprintf(stderr, "nandfs_delete_snap: %s\n", nandfs_errmsg(&fs));
-
-out:
- nandfs_close(&fs);
- nandfs_destroy(&fs);
- return (error);
-}
diff --git a/sbin/newfs_nandfs/Makefile b/sbin/newfs_nandfs/Makefile
deleted file mode 100644
index 9b1b3009c400..000000000000
--- a/sbin/newfs_nandfs/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# $FreeBSD$
-
-PACKAGE=nandfs
-PROG= newfs_nandfs
-MAN= newfs_nandfs.8
-
-LIBADD= geom
-
-.include <bsd.prog.mk>
diff --git a/sbin/newfs_nandfs/Makefile.depend b/sbin/newfs_nandfs/Makefile.depend
deleted file mode 100644
index 0220673c9076..000000000000
--- a/sbin/newfs_nandfs/Makefile.depend
+++ /dev/null
@@ -1,20 +0,0 @@
-# $FreeBSD$
-# Autogenerated - do NOT edit!
-
-DIRDEPS = \
- gnu/lib/csu \
- include \
- include/xlocale \
- lib/${CSU_DIR} \
- lib/libc \
- lib/libcompiler_rt \
- lib/libexpat \
- lib/libgeom \
- lib/libsbuf \
-
-
-.include <dirdeps.mk>
-
-.if ${DEP_RELDIR} == ${_DEP_RELDIR}
-# local dependencies - needed for -jN in clean tree
-.endif
diff --git a/sbin/newfs_nandfs/newfs_nandfs.8 b/sbin/newfs_nandfs/newfs_nandfs.8
deleted file mode 100644
index fe3216394109..000000000000
--- a/sbin/newfs_nandfs/newfs_nandfs.8
+++ /dev/null
@@ -1,74 +0,0 @@
-.\"
-.\" Copyright (c) 2010 Semihalf
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd October 1, 2013
-.Dt NEWFS_NANDFS 8
-.Os
-.Sh NAME
-.Nm newfs_nandfs
-.Nd construct a new NAND FS file system
-.Sh SYNOPSIS
-.Nm
-.Op Fl b Ar blocsize
-.Op Fl B Ar blocks-per-segment
-.Op Fl L Ar label
-.Op Fl m Ar reserved-segment-percent
-.Ar device
-.Sh DESCRIPTION
-The
-.Nm
-utility creates a NAND FS file system on device.
-.Pp
-The options are as follow:
-.Bl -tag -width indent
-.It Fl b Ar blocksize
-Size of block (1024 if not specified).
-.It Fl B Ar blocks_per_segment
-Number of blocks per segment (2048 if not specified).
-.It Fl L Ar label
-Volume label (up to 16 characters).
-.It Fl m Ar reserved_block_percent
-Percentage of reserved blocks (5 if not specified).
-.El
-.Sh EXIT STATUS
-Exit status is 0 on success and 1 on error.
-.Sh EXAMPLES
-Create a file system, using default parameters, on
-.Pa /dev/ada0s1 :
-.Bd -literal -offset indent
-newfs_nandfs /dev/ada0s1
-.Ed
-.Sh SEE ALSO
-.Xr gpart 8 ,
-.Xr newfs 8
-.Sh HISTORY
-The
-.Nm
-utility first appeared in
-.Fx 10.0 .
-.Sh AUTHORS
-.An Grzegorz Bernacki
diff --git a/sbin/newfs_nandfs/newfs_nandfs.c b/sbin/newfs_nandfs/newfs_nandfs.c
deleted file mode 100644
index e432cc6e6420..000000000000
--- a/sbin/newfs_nandfs/newfs_nandfs.c
+++ /dev/null
@@ -1,1183 +0,0 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
- *
- * Copyright (c) 2010-2012 Semihalf.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/fdcio.h>
-#include <sys/disk.h>
-#include <sys/disklabel.h>
-#include <sys/mount.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <sys/endian.h>
-#include <sys/stddef.h>
-#include <sys/uuid.h>
-#include <sys/dirent.h>
-#include <sys/stat.h>
-
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <inttypes.h>
-#include <libgeom.h>
-#include <paths.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-#include <fs/nandfs/nandfs_fs.h>
-#include <dev/nand/nand_dev.h>
-
-#define DEBUG
-#undef DEBUG
-#ifdef DEBUG
-#define debug(fmt, args...) do { \
- printf("nandfs:" fmt "\n", ##args); } while (0)
-#else
-#define debug(fmt, args...)
-#endif
-
-#define NANDFS_FIRST_BLOCK nandfs_first_block()
-#define NANDFS_FIRST_CNO 1
-#define NANDFS_BLOCK_BAD 1
-#define NANDFS_BLOCK_GOOD 0
-
-struct file_info {
- uint64_t ino;
- const char *name;
- uint32_t mode;
- uint64_t size;
- uint8_t nblocks;
- uint32_t *blocks;
- struct nandfs_inode *inode;
-};
-
-static struct file_info user_files[] = {
- { NANDFS_ROOT_INO, NULL, S_IFDIR | 0755, 0, 1, NULL, NULL },
-};
-
-static struct file_info ifile =
- { NANDFS_IFILE_INO, NULL, 0, 0, -1, NULL, NULL };
-static struct file_info sufile =
- { NANDFS_SUFILE_INO, NULL, 0, 0, -1, NULL, NULL };
-static struct file_info cpfile =
- { NANDFS_CPFILE_INO, NULL, 0, 0, -1, NULL, NULL };
-static struct file_info datfile =
- { NANDFS_DAT_INO, NULL, 0, 0, -1, NULL, NULL };
-
-struct nandfs_block {
- LIST_ENTRY(nandfs_block) block_link;
- uint32_t number;
- uint64_t offset;
- void *data;
-};
-
-static LIST_HEAD(, nandfs_block) block_head =
- LIST_HEAD_INITIALIZER(&block_head);
-
-/* Storage geometry */
-static off_t mediasize;
-static ssize_t sectorsize;
-static uint64_t nsegments;
-static uint64_t erasesize;
-static uint64_t segsize;
-
-static struct nandfs_fsdata fsdata;
-static struct nandfs_super_block super_block;
-
-static int is_nand;
-
-/* Nandfs parameters */
-static size_t blocksize = NANDFS_DEF_BLOCKSIZE;
-static long blocks_per_segment;
-static long rsv_segment_percent = 5;
-static time_t nandfs_time;
-static uint32_t bad_segments_count = 0;
-static uint32_t *bad_segments = NULL;
-static uint8_t fsdata_blocks_state[NANDFS_NFSAREAS];
-
-static u_char *volumelabel = NULL;
-
-static struct nandfs_super_root *sr;
-
-static uint32_t nuserfiles;
-static uint32_t seg_nblocks;
-static uint32_t seg_endblock;
-
-#define SIZE_TO_BLOCK(size) howmany(size, blocksize)
-
-static uint32_t
-nandfs_first_block(void)
-{
- uint32_t i, first_free, start_bad_segments = 0;
-
- for (i = 0; i < bad_segments_count; i++) {
- if (i == bad_segments[i])
- start_bad_segments++;
- else
- break;
- }
-
- first_free = SIZE_TO_BLOCK(NANDFS_DATA_OFFSET_BYTES(erasesize) +
- (start_bad_segments * segsize));
-
- if (first_free < (uint32_t)blocks_per_segment)
- return (blocks_per_segment);
- else
- return (first_free);
-}
-
-static void
-usage(void)
-{
-
- fprintf(stderr,
- "usage: newfs_nandfs [ -options ] device\n"
- "where the options are:\n"
- "\t-b block-size\n"
- "\t-B blocks-per-segment\n"
- "\t-L volume label\n"
- "\t-m reserved-segments-percentage\n");
- exit(1);
-}
-
-static int
-nandfs_log2(unsigned n)
-{
- unsigned count;
-
- /*
- * N.B. this function will return 0 if supplied 0.
- */
- for (count = 0; n/2; count++)
- n /= 2;
- return count;
-}
-
-/* from NetBSD's src/sys/net/if_ethersubr.c */
-static uint32_t
-crc32_le(uint32_t crc, const uint8_t *buf, size_t len)
-{
- static const uint32_t crctab[] = {
- 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac,
- 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
- 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,
- 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
- };
- size_t i;
-
- crc = crc ^ ~0U;
-
- for (i = 0; i < len; i++) {
- crc ^= buf[i];
- crc = (crc >> 4) ^ crctab[crc & 0xf];
- crc = (crc >> 4) ^ crctab[crc & 0xf];
- }
-
- return (crc ^ ~0U);
-}
-
-static void *
-get_block(uint32_t block_nr, uint64_t offset)
-{
- struct nandfs_block *block, *new_block;
-
- LIST_FOREACH(block, &block_head, block_link) {
- if (block->number == block_nr)
- return block->data;
- }
-
- debug("allocating block %x\n", block_nr);
-
- new_block = malloc(sizeof(*block));
- if (!new_block)
- err(1, "cannot allocate block");
-
- new_block->number = block_nr;
- new_block->offset = offset;
- new_block->data = malloc(blocksize);
- if (!new_block->data)
- err(1, "cannot allocate block data");
-
- memset(new_block->data, 0, blocksize);
-
- LIST_INSERT_HEAD(&block_head, new_block, block_link);
-
- return (new_block->data);
-}
-
-static int
-nandfs_seg_usage_blk_offset(uint64_t seg, uint64_t *blk, uint64_t *offset)
-{
- uint64_t off;
- uint16_t seg_size;
-
- seg_size = sizeof(struct nandfs_segment_usage);
-
- off = roundup(sizeof(struct nandfs_sufile_header), seg_size);
- off += (seg * seg_size);
-
- *blk = off / blocksize;
- *offset = (off % blocksize) / seg_size;
- return (0);
-}
-
-static uint32_t
-segment_size(void)
-{
- u_int size;
-
- size = sizeof(struct nandfs_segment_summary );
- size += seg_nblocks * sizeof(struct nandfs_binfo_v);
-
- if (size > blocksize)
- err(1, "segsum info bigger that blocksize");
-
- return (size);
-}
-
-
-static void
-prepare_blockgrouped_file(uint32_t block)
-{
- struct nandfs_block_group_desc *desc;
- uint32_t i, entries;
-
- desc = (struct nandfs_block_group_desc *)get_block(block, 0);
- entries = blocksize / sizeof(struct nandfs_block_group_desc);
- for (i = 0; i < entries; i++)
- desc[i].bg_nfrees = blocksize * 8;
-}
-
-static void
-alloc_blockgrouped_file(uint32_t block, uint32_t entry)
-{
- struct nandfs_block_group_desc *desc;
- uint32_t desc_nr;
- uint32_t *bitmap;
-
- desc = (struct nandfs_block_group_desc *)get_block(block, 0);
- bitmap = (uint32_t *)get_block(block + 1, 1);
-
- bitmap += (entry >> 5);
- if (*bitmap & (1 << (entry % 32))) {
- printf("nandfs: blockgrouped entry %d already allocated\n",
- entry);
- }
- *bitmap |= (1 << (entry % 32));
-
- desc_nr = entry / (blocksize * 8);
- desc[desc_nr].bg_nfrees--;
-}
-
-
-static uint64_t
-count_su_blocks(void)
-{
- uint64_t maxblk, blk, offset, i;
-
- maxblk = blk = 0;
-
- for (i = 0; i < bad_segments_count; i++) {
- nandfs_seg_usage_blk_offset(bad_segments[i], &blk, &offset);
- debug("bad segment at block:%jx off: %jx", blk, offset);
- if (blk > maxblk)
- maxblk = blk;
- }
-
- debug("bad segment needs %#jx", blk);
- if (blk >= NANDFS_NDADDR) {
- printf("nandfs: file too big (%jd > %d)\n", blk, NANDFS_NDADDR);
- exit(2);
- }
-
- sufile.size = (blk + 1) * blocksize;
- return (blk + 1);
-}
-
-static void
-count_seg_blocks(void)
-{
- uint32_t i;
-
- for (i = 0; i < nuserfiles; i++)
- if (user_files[i].nblocks) {
- seg_nblocks += user_files[i].nblocks;
- user_files[i].blocks = malloc(user_files[i].nblocks * sizeof(uint32_t));
- }
-
- ifile.nblocks = 2 +
- SIZE_TO_BLOCK(sizeof(struct nandfs_inode) * (NANDFS_USER_INO + 1));
- ifile.blocks = malloc(ifile.nblocks * sizeof(uint32_t));
- seg_nblocks += ifile.nblocks;
-
- cpfile.nblocks =
- SIZE_TO_BLOCK((NANDFS_CPFILE_FIRST_CHECKPOINT_OFFSET + 1) *
- sizeof(struct nandfs_checkpoint));
- cpfile.blocks = malloc(cpfile.nblocks * sizeof(uint32_t));
- seg_nblocks += cpfile.nblocks;
-
- if (!bad_segments) {
- sufile.nblocks =
- SIZE_TO_BLOCK((NANDFS_SUFILE_FIRST_SEGMENT_USAGE_OFFSET + 1) *
- sizeof(struct nandfs_segment_usage));
- } else {
- debug("bad blocks found: extra space for sufile");
- sufile.nblocks = count_su_blocks();
- }
-
- sufile.blocks = malloc(sufile.nblocks * sizeof(uint32_t));
- seg_nblocks += sufile.nblocks;
-
- datfile.nblocks = 2 +
- SIZE_TO_BLOCK((seg_nblocks) * sizeof(struct nandfs_dat_entry));
- datfile.blocks = malloc(datfile.nblocks * sizeof(uint32_t));
- seg_nblocks += datfile.nblocks;
-}
-
-static void
-assign_file_blocks(uint64_t start_block)
-{
- uint32_t i, j;
-
- for (i = 0; i < nuserfiles; i++)
- for (j = 0; j < user_files[i].nblocks; j++) {
- debug("user file %d at block %d at %#jx",
- i, j, (uintmax_t)start_block);
- user_files[i].blocks[j] = start_block++;
- }
-
- for (j = 0; j < ifile.nblocks; j++) {
- debug("ifile block %d at %#jx", j, (uintmax_t)start_block);
- ifile.blocks[j] = start_block++;
- }
-
- for (j = 0; j < cpfile.nblocks; j++) {
- debug("cpfile block %d at %#jx", j, (uintmax_t)start_block);
- cpfile.blocks[j] = start_block++;
- }
-
- for (j = 0; j < sufile.nblocks; j++) {
- debug("sufile block %d at %#jx", j, (uintmax_t)start_block);
- sufile.blocks[j] = start_block++;
- }
-
- for (j = 0; j < datfile.nblocks; j++) {
- debug("datfile block %d at %#jx", j, (uintmax_t)start_block);
- datfile.blocks[j] = start_block++;
- }
-
- /* add one for superroot */
- debug("sr at block %#jx", (uintmax_t)start_block);
- sr = (struct nandfs_super_root *)get_block(start_block++, 0);
- seg_endblock = start_block;
-}
-
-static void
-save_datfile(void)
-{
-
- prepare_blockgrouped_file(datfile.blocks[0]);
-}
-
-static uint64_t
-update_datfile(uint64_t block)
-{
- struct nandfs_dat_entry *dat;
- static uint64_t vblock = 0;
- uint64_t allocated, i, off;
-
- if (vblock == 0) {
- alloc_blockgrouped_file(datfile.blocks[0], vblock);
- vblock++;
- }
- allocated = vblock;
- i = vblock / (blocksize / sizeof(*dat));
- off = vblock % (blocksize / sizeof(*dat));
- vblock++;
-
- dat = (struct nandfs_dat_entry *)get_block(datfile.blocks[2 + i], 2 + i);
-
- alloc_blockgrouped_file(datfile.blocks[0], allocated);
- dat[off].de_blocknr = block;
- dat[off].de_start = NANDFS_FIRST_CNO;
- dat[off].de_end = UINTMAX_MAX;
-
- return (allocated);
-}
-
-static union nandfs_binfo *
-update_block_info(union nandfs_binfo *binfo, struct file_info *file)
-{
- nandfs_daddr_t vblock;
- uint32_t i;
-
- for (i = 0; i < file->nblocks; i++) {
- debug("%s: blk %x", __func__, i);
- if (file->ino != NANDFS_DAT_INO) {
- vblock = update_datfile(file->blocks[i]);
- binfo->bi_v.bi_vblocknr = vblock;
- binfo->bi_v.bi_blkoff = i;
- binfo->bi_v.bi_ino = file->ino;
- file->inode->i_db[i] = vblock;
- } else {
- binfo->bi_dat.bi_blkoff = i;
- binfo->bi_dat.bi_ino = file->ino;
- file->inode->i_db[i] = datfile.blocks[i];
- }
- binfo++;
- }
-
- return (binfo);
-}
-
-static void
-save_segsum(struct nandfs_segment_summary *ss)
-{
- union nandfs_binfo *binfo;
- struct nandfs_block *block;
- uint32_t sum_bytes, i;
- uint8_t crc_data, crc_skip;
-
- sum_bytes = segment_size();
- ss->ss_magic = NANDFS_SEGSUM_MAGIC;
- ss->ss_bytes = sizeof(struct nandfs_segment_summary);
- ss->ss_flags = NANDFS_SS_LOGBGN | NANDFS_SS_LOGEND | NANDFS_SS_SR;
- ss->ss_seq = 1;
- ss->ss_create = nandfs_time;
-
- ss->ss_next = nandfs_first_block() + blocks_per_segment;
- /* nblocks = segment blocks + segsum block + superroot */
- ss->ss_nblocks = seg_nblocks + 2;
- ss->ss_nbinfos = seg_nblocks;
- ss->ss_sumbytes = sum_bytes;
-
- crc_skip = sizeof(ss->ss_datasum) + sizeof(ss->ss_sumsum);
- ss->ss_sumsum = crc32_le(0, (uint8_t *)ss + crc_skip,
- sum_bytes - crc_skip);
- crc_data = 0;
-
- binfo = (union nandfs_binfo *)(ss + 1);
- for (i = 0; i < nuserfiles; i++) {
- if (user_files[i].nblocks)
- binfo = update_block_info(binfo, &user_files[i]);
- }
-
- binfo = update_block_info(binfo, &ifile);
- binfo = update_block_info(binfo, &cpfile);
- binfo = update_block_info(binfo, &sufile);
- update_block_info(binfo, &datfile);
-
- /* save superroot crc */
- crc_skip = sizeof(sr->sr_sum);
- sr->sr_sum = crc32_le(0, (uint8_t *)sr + crc_skip,
- NANDFS_SR_BYTES - crc_skip);
-
- /* segment checksup */
- crc_skip = sizeof(ss->ss_datasum);
- LIST_FOREACH(block, &block_head, block_link) {
- if (block->number < NANDFS_FIRST_BLOCK)
- continue;
- if (block->number == NANDFS_FIRST_BLOCK)
- crc_data = crc32_le(0,
- (uint8_t *)block->data + crc_skip,
- blocksize - crc_skip);
- else
- crc_data = crc32_le(crc_data, (uint8_t *)block->data,
- blocksize);
- }
- ss->ss_datasum = crc_data;
-}
-
-static void
-create_fsdata(void)
-{
- struct uuid tmp;
-
- memset(&fsdata, 0, sizeof(struct nandfs_fsdata));
-
- fsdata.f_magic = NANDFS_FSDATA_MAGIC;
- fsdata.f_nsegments = nsegments;
- fsdata.f_erasesize = erasesize;
- fsdata.f_first_data_block = NANDFS_FIRST_BLOCK;
- fsdata.f_blocks_per_segment = blocks_per_segment;
- fsdata.f_r_segments_percentage = rsv_segment_percent;
- fsdata.f_rev_level = NANDFS_CURRENT_REV;
- fsdata.f_sbbytes = NANDFS_SB_BYTES;
- fsdata.f_bytes = NANDFS_FSDATA_CRC_BYTES;
- fsdata.f_ctime = nandfs_time;
- fsdata.f_log_block_size = nandfs_log2(blocksize) - 10;
- fsdata.f_errors = 1;
- fsdata.f_inode_size = sizeof(struct nandfs_inode);
- fsdata.f_dat_entry_size = sizeof(struct nandfs_dat_entry);
- fsdata.f_checkpoint_size = sizeof(struct nandfs_checkpoint);
- fsdata.f_segment_usage_size = sizeof(struct nandfs_segment_usage);
-
- uuidgen(&tmp, 1);
- fsdata.f_uuid = tmp;
-
- if (volumelabel)
- memcpy(fsdata.f_volume_name, volumelabel, 16);
-
- fsdata.f_sum = crc32_le(0, (const uint8_t *)&fsdata,
- NANDFS_FSDATA_CRC_BYTES);
-}
-
-static void
-save_fsdata(void *data)
-{
-
- memcpy(data, &fsdata, sizeof(fsdata));
-}
-
-static void
-create_super_block(void)
-{
-
- memset(&super_block, 0, sizeof(struct nandfs_super_block));
-
- super_block.s_magic = NANDFS_SUPER_MAGIC;
- super_block.s_last_cno = NANDFS_FIRST_CNO;
- super_block.s_last_pseg = NANDFS_FIRST_BLOCK;
- super_block.s_last_seq = 1;
- super_block.s_free_blocks_count =
- (nsegments - bad_segments_count) * blocks_per_segment;
- super_block.s_mtime = 0;
- super_block.s_wtime = nandfs_time;
- super_block.s_state = NANDFS_VALID_FS;
-
- super_block.s_sum = crc32_le(0, (const uint8_t *)&super_block,
- NANDFS_SB_BYTES);
-}
-
-static void
-save_super_block(void *data)
-{
-
- memcpy(data, &super_block, sizeof(super_block));
-}
-
-static void
-save_super_root(void)
-{
-
- sr->sr_bytes = NANDFS_SR_BYTES;
- sr->sr_flags = 0;
- sr->sr_nongc_ctime = nandfs_time;
- datfile.inode = &sr->sr_dat;
- cpfile.inode = &sr->sr_cpfile;
- sufile.inode = &sr->sr_sufile;
-}
-
-static struct nandfs_dir_entry *
-add_de(void *block, struct nandfs_dir_entry *de, uint64_t ino,
- const char *name, uint8_t type)
-{
- uint16_t reclen;
-
- /* modify last de */
- de->rec_len = NANDFS_DIR_REC_LEN(de->name_len);
- de = (void *)((uint8_t *)de + de->rec_len);
-
- reclen = blocksize - ((uintptr_t)de - (uintptr_t)block);
- if (reclen < NANDFS_DIR_REC_LEN(strlen(name))) {
- printf("nandfs: too many dir entries for one block\n");
- return (NULL);
- }
-
- de->inode = ino;
- de->rec_len = reclen;
- de->name_len = strlen(name);
- de->file_type = type;
- memset(de->name, 0,
- (strlen(name) + NANDFS_DIR_PAD - 1) & ~NANDFS_DIR_ROUND);
- memcpy(de->name, name, strlen(name));
-
- return (de);
-}
-
-static struct nandfs_dir_entry *
-make_dir(void *block, uint64_t ino, uint64_t parent_ino)
-{
- struct nandfs_dir_entry *de = (struct nandfs_dir_entry *)block;
-
- /* create '..' entry */
- de->inode = parent_ino;
- de->rec_len = NANDFS_DIR_REC_LEN(2);
- de->name_len = 2;
- de->file_type = DT_DIR;
- memset(de->name, 0, NANDFS_DIR_NAME_LEN(2));
- memcpy(de->name, "..", 2);
-
- /* create '.' entry */
- de = (void *)((uint8_t *)block + NANDFS_DIR_REC_LEN(2));
- de->inode = ino;
- de->rec_len = blocksize - NANDFS_DIR_REC_LEN(2);
- de->name_len = 1;
- de->file_type = DT_DIR;
- memset(de->name, 0, NANDFS_DIR_NAME_LEN(1));
- memcpy(de->name, ".", 1);
-
- return (de);
-}
-
-static void
-save_root_dir(void)
-{
- struct file_info *root = &user_files[0];
- struct nandfs_dir_entry *de;
- uint32_t i;
- void *block;
-
- block = get_block(root->blocks[0], 0);
-
- de = make_dir(block, root->ino, root->ino);
- for (i = 1; i < nuserfiles; i++)
- de = add_de(block, de, user_files[i].ino, user_files[i].name,
- IFTODT(user_files[i].mode));
-
- root->size = ((uintptr_t)de - (uintptr_t)block) +
- NANDFS_DIR_REC_LEN(de->name_len);
-}
-
-static void
-save_sufile(void)
-{
- struct nandfs_sufile_header *header;
- struct nandfs_segment_usage *su;
- uint64_t blk, i, off;
- void *block;
- int start;
-
- /*
- * At the beginning just zero-out everything
- */
- for (i = 0; i < sufile.nblocks; i++)
- get_block(sufile.blocks[i], 0);
-
- start = 0;
-
- block = get_block(sufile.blocks[start], 0);
- header = (struct nandfs_sufile_header *)block;
- header->sh_ncleansegs = nsegments - bad_segments_count - 1;
- header->sh_ndirtysegs = 1;
- header->sh_last_alloc = 1;
-
- su = (struct nandfs_segment_usage *)header;
- off = NANDFS_SUFILE_FIRST_SEGMENT_USAGE_OFFSET;
- /* Allocate data segment */
- su[off].su_lastmod = nandfs_time;
- /* nblocks = segment blocks + segsum block + superroot */
- su[off].su_nblocks = seg_nblocks + 2;
- su[off].su_flags = NANDFS_SEGMENT_USAGE_DIRTY;
- off++;
- /* Allocate next segment */
- su[off].su_lastmod = nandfs_time;
- su[off].su_nblocks = 0;
- su[off].su_flags = NANDFS_SEGMENT_USAGE_DIRTY;
- for (i = 0; i < bad_segments_count; i++) {
- nandfs_seg_usage_blk_offset(bad_segments[i], &blk, &off);
- debug("storing bad_segments[%jd]=%x at %jx off %jx\n", i,
- bad_segments[i], blk, off);
- block = get_block(sufile.blocks[blk],
- off * sizeof(struct nandfs_segment_usage *));
- su = (struct nandfs_segment_usage *)block;
- su[off].su_lastmod = nandfs_time;
- su[off].su_nblocks = 0;
- su[off].su_flags = NANDFS_SEGMENT_USAGE_ERROR;
- }
-}
-
-static void
-save_cpfile(void)
-{
- struct nandfs_cpfile_header *header;
- struct nandfs_checkpoint *cp, *initial_cp;
- int i, entries = blocksize / sizeof(struct nandfs_checkpoint);
- uint64_t cno;
-
- header = (struct nandfs_cpfile_header *)get_block(cpfile.blocks[0], 0);
- header->ch_ncheckpoints = 1;
- header->ch_nsnapshots = 0;
-
- cp = (struct nandfs_checkpoint *)header;
-
- /* fill first checkpoint data*/
- initial_cp = &cp[NANDFS_CPFILE_FIRST_CHECKPOINT_OFFSET];
- initial_cp->cp_flags = 0;
- initial_cp->cp_checkpoints_count = 0;
- initial_cp->cp_cno = NANDFS_FIRST_CNO;
- initial_cp->cp_create = nandfs_time;
- initial_cp->cp_nblk_inc = seg_endblock - 1;
- initial_cp->cp_blocks_count = seg_nblocks;
- memset(&initial_cp->cp_snapshot_list, 0,
- sizeof(struct nandfs_snapshot_list));
-
- ifile.inode = &initial_cp->cp_ifile_inode;
-
- /* mark rest of cp as invalid */
- cno = NANDFS_FIRST_CNO + 1;
- i = NANDFS_CPFILE_FIRST_CHECKPOINT_OFFSET + 1;
- for (; i < entries; i++) {
- cp[i].cp_cno = cno++;
- cp[i].cp_flags = NANDFS_CHECKPOINT_INVALID;
- }
-}
-
-static void
-init_inode(struct nandfs_inode *inode, struct file_info *file)
-{
-
- inode->i_blocks = file->nblocks;
- inode->i_ctime = nandfs_time;
- inode->i_mtime = nandfs_time;
- inode->i_mode = file->mode & 0xffff;
- inode->i_links_count = 1;
-
- if (file->size > 0)
- inode->i_size = file->size;
- else
- inode->i_size = 0;
-
- if (file->ino == NANDFS_USER_INO)
- inode->i_flags = SF_NOUNLINK|UF_NOUNLINK;
- else
- inode->i_flags = 0;
-}
-
-static void
-save_ifile(void)
-{
- struct nandfs_inode *inode;
- struct file_info *file;
- uint64_t ino, blk, off;
- uint32_t i;
-
- prepare_blockgrouped_file(ifile.blocks[0]);
- for (i = 0; i <= NANDFS_USER_INO; i++)
- alloc_blockgrouped_file(ifile.blocks[0], i);
-
- for (i = 0; i < nuserfiles; i++) {
- file = &user_files[i];
- ino = file->ino;
- blk = ino / (blocksize / sizeof(*inode));
- off = ino % (blocksize / sizeof(*inode));
- inode =
- (struct nandfs_inode *)get_block(ifile.blocks[2 + blk], 2 + blk);
- file->inode = &inode[off];
- init_inode(file->inode, file);
- }
-
- init_inode(ifile.inode, &ifile);
- init_inode(cpfile.inode, &cpfile);
- init_inode(sufile.inode, &sufile);
- init_inode(datfile.inode, &datfile);
-}
-
-static int
-create_fs(void)
-{
- uint64_t start_block;
- uint32_t segsum_size;
- char *data;
- int i;
-
- nuserfiles = nitems(user_files);
-
- /* Count and assign blocks */
- count_seg_blocks();
- segsum_size = segment_size();
- start_block = NANDFS_FIRST_BLOCK + SIZE_TO_BLOCK(segsum_size);
- assign_file_blocks(start_block);
-
- /* Create super root structure */
- save_super_root();
-
- /* Create root directory */
- save_root_dir();
-
- /* Fill in file contents */
- save_sufile();
- save_cpfile();
- save_ifile();
- save_datfile();
-
- /* Save fsdata and superblocks */
- create_fsdata();
- create_super_block();
-
- for (i = 0; i < NANDFS_NFSAREAS; i++) {
- if (fsdata_blocks_state[i] != NANDFS_BLOCK_GOOD)
- continue;
-
- data = get_block((i * erasesize)/blocksize, 0);
- save_fsdata(data);
-
- data = get_block((i * erasesize + NANDFS_SBLOCK_OFFSET_BYTES) /
- blocksize, 0);
- if (blocksize > NANDFS_SBLOCK_OFFSET_BYTES)
- data += NANDFS_SBLOCK_OFFSET_BYTES;
- save_super_block(data);
- memset(data + sizeof(struct nandfs_super_block), 0xff,
- (blocksize - sizeof(struct nandfs_super_block) -
- NANDFS_SBLOCK_OFFSET_BYTES));
- }
-
- /* Save segment summary and CRCs */
- save_segsum(get_block(NANDFS_FIRST_BLOCK, 0));
-
- return (0);
-}
-
-static void
-write_fs(int fda)
-{
- struct nandfs_block *block;
- char *data;
- u_int ret;
-
- /* Overwrite next block with ff if not nand device */
- if (!is_nand) {
- data = get_block(seg_endblock, 0);
- memset(data, 0xff, blocksize);
- }
-
- LIST_FOREACH(block, &block_head, block_link) {
- lseek(fda, block->number * blocksize, SEEK_SET);
- ret = write(fda, block->data, blocksize);
- if (ret != blocksize)
- err(1, "cannot write filesystem data");
- }
-}
-
-static void
-check_parameters(void)
-{
- int i;
-
- /* check blocksize */
- if ((blocksize < NANDFS_MIN_BLOCKSIZE) || (blocksize > MAXBSIZE) ||
- ((blocksize - 1) & blocksize)) {
- errx(1, "Bad blocksize (%zu). Must be in range [%u-%u] "
- "and a power of two.", blocksize, NANDFS_MIN_BLOCKSIZE,
- MAXBSIZE);
- }
-
- /* check blocks per segments */
- if ((blocks_per_segment < NANDFS_SEG_MIN_BLOCKS) ||
- ((blocksize - 1) & blocksize))
- errx(1, "Bad blocks per segment (%lu). Must be greater than "
- "%u and a power of two.", blocks_per_segment,
- NANDFS_SEG_MIN_BLOCKS);
-
- /* check reserved segment percentage */
- if ((rsv_segment_percent < 1) || (rsv_segment_percent > 99))
- errx(1, "Bad reserved segment percentage. "
- "Must in range 1..99.");
-
- /* check volume label */
- i = 0;
- if (volumelabel) {
- while (isalnum(volumelabel[++i]))
- ;
-
- if (volumelabel[i] != '\0') {
- errx(1, "bad volume label. "
- "Valid characters are alphanumerics.");
- }
-
- if (strlen(volumelabel) >= 16)
- errx(1, "Bad volume label. Length is longer than %d.",
- 16);
- }
-
- nandfs_time = time(NULL);
-}
-
-static void
-print_parameters(void)
-{
-
- printf("filesystem parameters:\n");
- printf("blocksize: %#zx sectorsize: %#zx\n", blocksize, sectorsize);
- printf("erasesize: %#jx mediasize: %#jx\n", erasesize, mediasize);
- printf("segment size: %#jx blocks per segment: %#x\n", segsize,
- (uint32_t)blocks_per_segment);
-}
-
-/*
- * Exit with error if file system is mounted.
- */
-static void
-check_mounted(const char *fname, mode_t mode)
-{
- struct statfs *mp;
- const char *s1, *s2;
- size_t len;
- int n, r;
-
- if (!(n = getmntinfo(&mp, MNT_NOWAIT)))
- err(1, "getmntinfo");
-
- len = strlen(_PATH_DEV);
- s1 = fname;
- if (!strncmp(s1, _PATH_DEV, len))
- s1 += len;
-
- r = S_ISCHR(mode) && s1 != fname && *s1 == 'r';
-
- for (; n--; mp++) {
- s2 = mp->f_mntfromname;
-
- if (!strncmp(s2, _PATH_DEV, len))
- s2 += len;
- if ((r && s2 != mp->f_mntfromname && !strcmp(s1 + 1, s2)) ||
- !strcmp(s1, s2))
- errx(1, "%s is mounted on %s", fname, mp->f_mntonname);
- }
-}
-
-static void
-calculate_geometry(int fd)
-{
- struct chip_param_io chip_params;
- char ident[DISK_IDENT_SIZE];
- char medianame[MAXPATHLEN];
-
- /* Check storage type */
- g_get_ident(fd, ident, DISK_IDENT_SIZE);
- g_get_name(ident, medianame, MAXPATHLEN);
- debug("device name: %s", medianame);
-
- is_nand = (strstr(medianame, "gnand") != NULL);
- debug("is_nand = %d", is_nand);
-
- sectorsize = g_sectorsize(fd);
- debug("sectorsize: %#zx", sectorsize);
-
- /* Get storage size */
- mediasize = g_mediasize(fd);
- debug("mediasize: %#jx", mediasize);
-
- /* Get storage erase unit size */
- if (!is_nand)
- erasesize = NANDFS_DEF_ERASESIZE;
- else if (ioctl(fd, NAND_IO_GET_CHIP_PARAM, &chip_params) != -1)
- erasesize = chip_params.page_size * chip_params.pages_per_block;
- else
- errx(1, "Cannot ioctl(NAND_IO_GET_CHIP_PARAM)");
-
- debug("erasesize: %#jx", (uintmax_t)erasesize);
-
- if (blocks_per_segment == 0) {
- if (erasesize >= NANDFS_MIN_SEGSIZE)
- blocks_per_segment = erasesize / blocksize;
- else
- blocks_per_segment = NANDFS_MIN_SEGSIZE / blocksize;
- }
-
- /* Calculate number of segments */
- segsize = blocksize * blocks_per_segment;
- nsegments = ((mediasize - NANDFS_NFSAREAS * erasesize) / segsize) - 2;
- debug("segsize: %#jx", segsize);
- debug("nsegments: %#jx", nsegments);
-}
-
-static void
-erase_device(int fd)
-{
- int rest, failed;
- uint64_t i, nblocks;
- off_t offset;
-
- failed = 0;
- for (i = 0; i < NANDFS_NFSAREAS; i++) {
- debug("Deleting %jx\n", i * erasesize);
- if (g_delete(fd, i * erasesize, erasesize)) {
- printf("cannot delete %jx\n", i * erasesize);
- fsdata_blocks_state[i] = NANDFS_BLOCK_BAD;
- failed++;
- } else
- fsdata_blocks_state[i] = NANDFS_BLOCK_GOOD;
- }
-
- if (failed == NANDFS_NFSAREAS) {
- printf("%d first blocks not usable. Unable to create "
- "filesystem.\n", failed);
- exit(1);
- }
-
- for (i = 0; i < nsegments; i++) {
- offset = NANDFS_NFSAREAS * erasesize + i * segsize;
- if (g_delete(fd, offset, segsize)) {
- printf("cannot delete segment %jx (offset %jd)\n",
- i, offset);
- bad_segments_count++;
- bad_segments = realloc(bad_segments,
- bad_segments_count * sizeof(uint32_t));
- bad_segments[bad_segments_count - 1] = i;
- }
- }
-
- if (bad_segments_count == nsegments) {
- printf("no valid segments\n");
- exit(1);
- }
-
- /* Delete remaining blocks at the end of device */
- rest = mediasize % segsize;
- nblocks = rest / erasesize;
- for (i = 0; i < nblocks; i++) {
- offset = (segsize * nsegments) + (i * erasesize);
- if (g_delete(fd, offset, erasesize)) {
- printf("cannot delete space after last segment "
- "- probably a bad block\n");
- }
- }
-}
-
-static void
-erase_initial(int fd)
-{
- char buf[512];
- u_int i;
-
- memset(buf, 0xff, sizeof(buf));
-
- lseek(fd, 0, SEEK_SET);
- for (i = 0; i < NANDFS_NFSAREAS * erasesize; i += sizeof(buf))
- write(fd, buf, sizeof(buf));
-}
-
-static void
-create_nandfs(int fd)
-{
-
- create_fs();
-
- write_fs(fd);
-}
-
-static void
-print_summary(void)
-{
-
- printf("filesystem was created successfully\n");
- printf("total segments: %#jx valid segments: %#jx\n", nsegments,
- nsegments - bad_segments_count);
- printf("total space: %ju MB free: %ju MB\n",
- (nsegments *
- blocks_per_segment * blocksize) / (1024 * 1024),
- ((nsegments - bad_segments_count) *
- blocks_per_segment * blocksize) / (1024 * 1024));
-}
-
-int
-main(int argc, char *argv[])
-{
- struct stat sb;
- char buf[MAXPATHLEN];
- const char opts[] = "b:B:L:m:";
- const char *fname;
- int ch, fd;
-
- while ((ch = getopt(argc, argv, opts)) != -1) {
- switch (ch) {
- case 'b':
- blocksize = strtol(optarg, (char **)NULL, 10);
- if (blocksize == 0)
- usage();
- break;
- case 'B':
- blocks_per_segment = strtol(optarg, (char **)NULL, 10);
- if (blocks_per_segment == 0)
- usage();
- break;
- case 'L':
- volumelabel = optarg;
- break;
- case 'm':
- rsv_segment_percent = strtol(optarg, (char **)NULL, 10);
- if (rsv_segment_percent == 0)
- usage();
- break;
- default:
- usage();
- }
- }
-
- argc -= optind;
- argv += optind;
- if (argc < 1 || argc > 2)
- usage();
-
- /* construct proper device path */
- fname = *argv++;
- if (!strchr(fname, '/')) {
- snprintf(buf, sizeof(buf), "%s%s", _PATH_DEV, fname);
- if (!(fname = strdup(buf)))
- err(1, NULL);
- }
-
- fd = g_open(fname, 1);
- if (fd == -1)
- err(1, "Cannot open %s", fname);
-
- if (fstat(fd, &sb) == -1)
- err(1, "Cannot stat %s", fname);
- if (!S_ISCHR(sb.st_mode))
- warnx("%s is not a character device", fname);
-
- check_mounted(fname, sb.st_mode);
-
- calculate_geometry(fd);
-
- check_parameters();
-
- print_parameters();
-
- if (is_nand)
- erase_device(fd);
- else
- erase_initial(fd);
-
- create_nandfs(fd);
-
- print_summary();
-
- g_close(fd);
-
- return (0);
-}
-
-