source: rtems/cpukit/libblock/src/bdpart-register.c @ e682fffd

4.104.115
Last change on this file since e682fffd was 6780829, checked in by Sebastian Huber <sebastian.huber@…>, on 04/30/10 at 08:42:13

2010-04-30 Sebastian Huber <sebastian.huber@…>

  • libblock/src/bdpart.c: Removed file.
  • libblock/src/bdpart-create.c, libblock/src/bdpart-dump.c, libblock/src/bdpart-mount.c, libblock/src/bdpart-read.c, libblock/src/bdpart-register.c, libblock/src/bdpart-sort.c, libblock/src/bdpart-write.c: New files.
  • libblock/include/rtems/bdpart.h: Moved some definitions from bdpart.c.
  • libblock/Makefile.am: Update for file changes.
  • Property mode set to 100644
File size: 3.8 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup rtems_bdpart
5 *
6 * Block device partition management.
7 */
8
9/*
10 * Copyright (c) 2009, 2010
11 * embedded brains GmbH
12 * Obere Lagerstr. 30
13 * D-82178 Puchheim
14 * Germany
15 * <rtems@embedded-brains.de>
16 *
17 * The license and distribution terms for this file may be
18 * found in the file LICENSE in this distribution or at
19 * http://www.rtems.com/license/LICENSE.
20 */
21
22#ifdef HAVE_CONFIG_H
23#include "config.h"
24#endif
25
26#include <stdio.h>
27#include <stdlib.h>
28#include <string.h>
29
30#include <rtems.h>
31#include <rtems/bdpart.h>
32
33rtems_status_code rtems_bdpart_register(
34  const char *disk_name,
35  const rtems_bdpart_partition *pt,
36  size_t count
37)
38{
39  rtems_status_code sc = RTEMS_SUCCESSFUL;
40  rtems_status_code esc = RTEMS_SUCCESSFUL;
41  rtems_device_major_number major = 0;
42  rtems_device_minor_number minor = 0;
43  rtems_blkdev_bnum disk_end = 0;
44  dev_t disk = 0;
45  dev_t logical_disk = 0;
46  char *logical_disk_name = NULL;
47  char *logical_disk_marker = NULL;
48  size_t disk_name_size = strlen( disk_name);
49  size_t i = 0;
50
51  /* Get disk data */
52  sc = rtems_bdpart_get_disk_data( disk_name, &disk, &disk_end);
53  if (sc != RTEMS_SUCCESSFUL) {
54    return sc;
55  }
56
57  /* Get the disk device identifier */
58  rtems_filesystem_split_dev_t( disk, major, minor);
59
60  /* Create logical disk name */
61  logical_disk_name = malloc( disk_name_size + RTEMS_BDPART_NUMBER_SIZE);
62  if (logical_disk_name == NULL) {
63    return RTEMS_NO_MEMORY;
64  }
65  strncpy( logical_disk_name, disk_name, disk_name_size);
66  logical_disk_marker = logical_disk_name + disk_name_size;
67
68  /* Create a logical disk for each partition */
69  for (i = 0; i < count; ++i) {
70    const rtems_bdpart_partition *p = pt + i;
71    int rv = 0;
72
73    /* New minor number */
74    ++minor;
75
76    /* Create a new device identifier */
77    logical_disk = rtems_filesystem_make_dev_t( major, minor);
78
79    /* Set partition number for logical disk name */
80    rv = snprintf( logical_disk_marker, RTEMS_BDPART_NUMBER_SIZE, "%zu", i + 1);
81    if (rv >= RTEMS_BDPART_NUMBER_SIZE) {
82      esc = RTEMS_INVALID_NAME;
83      goto cleanup;
84    }
85
86    /* Create logical disk */
87    sc = rtems_disk_create_log(
88      logical_disk,
89      disk,
90      p->begin,
91      p->end - p->begin,
92      logical_disk_name
93    );
94    if (sc != RTEMS_SUCCESSFUL) {
95      esc = sc;
96      goto cleanup;
97    }
98  }
99
100cleanup:
101
102  free( logical_disk_name);
103
104  return esc;
105}
106
107rtems_status_code rtems_bdpart_register_from_disk( const char *disk_name)
108{
109  rtems_status_code sc = RTEMS_SUCCESSFUL;
110  rtems_bdpart_format format;
111  rtems_bdpart_partition pt [RTEMS_BDPART_PARTITION_NUMBER_HINT];
112  size_t count = RTEMS_BDPART_PARTITION_NUMBER_HINT;
113
114  /* Read partitions */
115  sc = rtems_bdpart_read( disk_name, &format, pt, &count);
116  if (sc != RTEMS_SUCCESSFUL) {
117    return sc;
118  }
119
120  /* Register partitions */
121  return rtems_bdpart_register( disk_name, pt, count);
122}
123
124rtems_status_code rtems_bdpart_unregister(
125  const char *disk_name,
126  const rtems_bdpart_partition *pt __attribute__((unused)),
127  size_t count
128)
129{
130  rtems_status_code sc = RTEMS_SUCCESSFUL;
131  rtems_device_major_number major = 0;
132  rtems_device_minor_number minor = 0;
133  rtems_blkdev_bnum disk_end = 0;
134  dev_t disk = 0;
135  dev_t logical_disk = 0;
136  size_t i = 0;
137
138  /* Get disk data */
139  sc = rtems_bdpart_get_disk_data( disk_name, &disk, &disk_end);
140  if (sc != RTEMS_SUCCESSFUL) {
141    return sc;
142  }
143
144  /* Get the disk device identifier */
145  rtems_filesystem_split_dev_t( disk, major, minor);
146
147  /* Create a logical disk for each partition */
148  for (i = 0; i < count; ++i) {
149    /* New minor number */
150    ++minor;
151
152    /* Get the device identifier */
153    logical_disk = rtems_filesystem_make_dev_t( major, minor);
154
155    /* Delete logical disk */
156    sc = rtems_disk_delete( logical_disk);
157    if (sc != RTEMS_SUCCESSFUL) {
158      return sc;
159    }
160  }
161
162  return RTEMS_SUCCESSFUL;
163}
Note: See TracBrowser for help on using the repository browser.