Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F177564582
D59418.1794745046.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
4 KB
Referenced Files
None
Subscribers
None
D59418.1794745046.diff
View Options
diff --git a/stand/common/bootstrap.h b/stand/common/bootstrap.h
--- a/stand/common/bootstrap.h
+++ b/stand/common/bootstrap.h
@@ -382,6 +382,10 @@
void set_currdev(const char *devname);
/* md.c */
+#define MD_FLAG_KERNEL 0x01
+
+extern struct devsw md_dev;
+int md_register(void *image, size_t size, unsigned int flags);
void md_export_to_kernel(uint64_t start, uint64_t len);
#endif /* !_BOOTSTRAP_H_ */
diff --git a/stand/common/md.c b/stand/common/md.c
--- a/stand/common/md.c
+++ b/stand/common/md.c
@@ -33,6 +33,36 @@
#include "bootstrap.h"
#define MD_BLOCK_SIZE 512
+#define MD_FLAG_MASK MD_FLAG_KERNEL
+
+struct md_info {
+ STAILQ_ENTRY(md_info) md_link;
+ void *md_image;
+ size_t md_size;
+ unsigned int md_flags;
+ int md_unit;
+};
+
+static STAILQ_HEAD(, md_info) md_list = STAILQ_HEAD_INITIALIZER(md_list);
+static int md_next_unit;
+
+static int md_init(void);
+static int md_strategy(void *, int, daddr_t, size_t, char *, size_t *);
+static int md_open(struct open_file *, ...);
+static int md_close(struct open_file *);
+static int md_print(int);
+
+struct devsw md_dev = {
+ .dv_name = "md",
+ .dv_type = DEVT_DISK,
+ .dv_init = md_init,
+ .dv_strategy = md_strategy,
+ .dv_open = md_open,
+ .dv_close = md_close,
+ .dv_ioctl = noioctl,
+ .dv_print = md_print,
+ .dv_cleanup = nullsys,
+};
/*
* The kernel can accept a MD inline in the metadata, or out-of-line via
@@ -53,6 +83,44 @@
unit++;
}
+static struct md_info *
+md_get_info(int unit)
+{
+ struct md_info *md;
+
+ STAILQ_FOREACH(md, &md_list, md_link) {
+ if (md->md_unit == unit)
+ return (md);
+ }
+ return (NULL);
+}
+
+int
+md_register(void *image, size_t size, unsigned int flags)
+{
+ struct md_info *md;
+
+ if (image == NULL || size == 0 || size % MD_BLOCK_SIZE != 0 ||
+ (flags & ~MD_FLAG_MASK) != 0) {
+ errno = EINVAL;
+ return (-1);
+ }
+ md = malloc(sizeof(*md));
+ if (md == NULL) {
+ errno = ENOMEM;
+ return (-1);
+ }
+ md->md_image = image;
+ md->md_size = size;
+ md->md_flags = flags;
+ md->md_unit = md_next_unit++;
+ STAILQ_INSERT_TAIL(&md_list, md, md_link);
+
+ if ((flags & MD_FLAG_KERNEL) != 0)
+ md_export_to_kernel((uintptr_t)image, size);
+ return (md->md_unit);
+}
+
#ifdef MD_IMAGE_SIZE
#if (MD_IMAGE_SIZE == 0 || MD_IMAGE_SIZE % MD_BLOCK_SIZE)
@@ -72,30 +140,16 @@
.start = "MFS Filesystem goes here",
.end = "MFS Filesystem had better STOP here",
};
-
-/* devsw I/F */
-static int md_init(void);
-static int md_strategy(void *, int, daddr_t, size_t, char *, size_t *);
-static int md_open(struct open_file *, ...);
-static int md_close(struct open_file *);
-static int md_print(int);
-
-struct devsw md_dev = {
- .dv_name = "md",
- .dv_type = DEVT_DISK,
- .dv_init = md_init,
- .dv_strategy = md_strategy,
- .dv_open = md_open,
- .dv_close = md_close,
- .dv_ioctl = noioctl,
- .dv_print = md_print,
- .dv_cleanup = nullsys,
-};
+#endif
static int
md_init(void)
{
+#ifdef MD_IMAGE_SIZE
+ if (md_register(md_image.start, MD_IMAGE_SIZE, 0) < 0)
+ return (errno);
+#endif
return (0);
}
@@ -104,30 +158,32 @@
char *buf, size_t *rsize)
{
struct devdesc *dev = (struct devdesc *)devdata;
+ struct md_info *md;
size_t ofs;
- if (dev->d_unit != 0)
+ md = md_get_info(dev->d_unit);
+ if (md == NULL)
return (ENXIO);
- if (blk < 0 || blk >= (MD_IMAGE_SIZE / MD_BLOCK_SIZE))
+ if (blk < 0 || (uintmax_t)blk >= md->md_size / MD_BLOCK_SIZE)
return (EIO);
if (size % MD_BLOCK_SIZE)
return (EIO);
ofs = blk * MD_BLOCK_SIZE;
- if ((ofs + size) > MD_IMAGE_SIZE)
- size = MD_IMAGE_SIZE - ofs;
+ if (size > md->md_size - ofs)
+ size = md->md_size - ofs;
if (rsize != NULL)
*rsize = size;
switch (rw & F_MASK) {
case F_READ:
- bcopy(md_image.start + ofs, buf, size);
+ bcopy((char *)md->md_image + ofs, buf, size);
return (0);
case F_WRITE:
- bcopy(buf, md_image.start + ofs, size);
+ bcopy(buf, (char *)md->md_image + ofs, size);
return (0);
}
@@ -144,7 +200,7 @@
dev = va_arg(ap, struct devdesc *);
va_end(ap);
- if (dev->d_unit != 0)
+ if (md_get_info(dev->d_unit) == NULL)
return (ENXIO);
return (0);
@@ -156,18 +212,27 @@
struct devdesc *dev;
dev = (struct devdesc *)(f->f_devdata);
- return ((dev->d_unit != 0) ? ENXIO : 0);
+ return (md_get_info(dev->d_unit) == NULL ? ENXIO : 0);
}
static int
md_print(int verbose)
{
+ struct md_info *md;
+ int ret;
+ if (STAILQ_EMPTY(&md_list))
+ return (0);
printf("%s devices:", md_dev.dv_name);
- if (pager_output("\n") != 0)
- return (1);
-
- printf("MD (%u bytes)", MD_IMAGE_SIZE);
- return (pager_output("\n"));
+ if ((ret = pager_output("\n")) != 0)
+ return (ret);
+
+ STAILQ_FOREACH(md, &md_list, md_link) {
+ printf(" %s%d: %ju X %u blocks", md_dev.dv_name,
+ md->md_unit, (uintmax_t)(md->md_size / MD_BLOCK_SIZE),
+ MD_BLOCK_SIZE);
+ if ((ret = pager_output("\n")) != 0)
+ return (ret);
+ }
+ return (0);
}
-#endif
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Nov 15, 12:17 PM (13 h, 34 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
41742631
Default Alt Text
D59418.1794745046.diff (4 KB)
Attached To
Mode
D59418: loader: Allow dynmaic creation of MD disks
Attached
Detach File
Event Timeline