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

4.115
Last change on this file since 3d60c1b was 796967c, checked in by Sebastian Huber <sebastian.huber@…>, on 02/28/12 at 16:19:49

libblock: Change bdbuf API

The functions

o rtems_bdbuf_get(),
o rtems_bdbuf_read(),
o rtems_bdbuf_syncdev(), and
o rtems_bdbuf_purge_dev(),

use now the disk device instead of the device identifier. This makes
bdbuf independent of rtems_disk_obtain() and rtems_disk_release(). It
is the responsiblity of the file system to obtain the disk device. This
also reduces the overhead to get a buffer.

The key for the AVL tree uses now the disk device instead of the device
identifier. The pointer is interpreted as an unsigned integer. This
reduces the memory overhead and makes the comparison operation a bit
faster.

Removed function rtems_bdbuf_purge_major(). This function was too
destructive and could have unpredictable side effects.

  • Property mode set to 100644
File size: 4.0 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  int fd = -1;
51  const rtems_disk_device *dd = NULL;
52
53  /* Get disk data */
54  sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end);
55  if (sc != RTEMS_SUCCESSFUL) {
56    return sc;
57  }
58  disk = rtems_disk_get_device_identifier( dd);
59  close( fd);
60
61  /* Get the disk device identifier */
62  rtems_filesystem_split_dev_t( disk, major, minor);
63
64  /* Create logical disk name */
65  logical_disk_name = malloc( disk_name_size + RTEMS_BDPART_NUMBER_SIZE);
66  if (logical_disk_name == NULL) {
67    return RTEMS_NO_MEMORY;
68  }
69  strncpy( logical_disk_name, disk_name, disk_name_size);
70  logical_disk_marker = logical_disk_name + disk_name_size;
71
72  /* Create a logical disk for each partition */
73  for (i = 0; i < count; ++i) {
74    const rtems_bdpart_partition *p = pt + i;
75    int rv = 0;
76
77    /* New minor number */
78    ++minor;
79
80    /* Create a new device identifier */
81    logical_disk = rtems_filesystem_make_dev_t( major, minor);
82
83    /* Set partition number for logical disk name */
84    rv = snprintf( logical_disk_marker, RTEMS_BDPART_NUMBER_SIZE, "%zu", i + 1);
85    if (rv >= RTEMS_BDPART_NUMBER_SIZE) {
86      esc = RTEMS_INVALID_NAME;
87      goto cleanup;
88    }
89
90    /* Create logical disk */
91    sc = rtems_disk_create_log(
92      logical_disk,
93      disk,
94      p->begin,
95      p->end - p->begin,
96      logical_disk_name
97    );
98    if (sc != RTEMS_SUCCESSFUL) {
99      esc = sc;
100      goto cleanup;
101    }
102  }
103
104cleanup:
105
106  free( logical_disk_name);
107
108  return esc;
109}
110
111rtems_status_code rtems_bdpart_register_from_disk( const char *disk_name)
112{
113  rtems_status_code sc = RTEMS_SUCCESSFUL;
114  rtems_bdpart_format format;
115  rtems_bdpart_partition pt [RTEMS_BDPART_PARTITION_NUMBER_HINT];
116  size_t count = RTEMS_BDPART_PARTITION_NUMBER_HINT;
117
118  /* Read partitions */
119  sc = rtems_bdpart_read( disk_name, &format, pt, &count);
120  if (sc != RTEMS_SUCCESSFUL) {
121    return sc;
122  }
123
124  /* Register partitions */
125  return rtems_bdpart_register( disk_name, pt, count);
126}
127
128rtems_status_code rtems_bdpart_unregister(
129  const char *disk_name,
130  const rtems_bdpart_partition *pt __attribute__((unused)),
131  size_t count
132)
133{
134  rtems_status_code sc = RTEMS_SUCCESSFUL;
135  rtems_device_major_number major = 0;
136  rtems_device_minor_number minor = 0;
137  rtems_blkdev_bnum disk_end = 0;
138  dev_t disk = 0;
139  dev_t logical_disk = 0;
140  size_t i = 0;
141  int fd = -1;
142  const rtems_disk_device *dd = NULL;
143
144  /* Get disk data */
145  sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end);
146  if (sc != RTEMS_SUCCESSFUL) {
147    return sc;
148  }
149  disk = rtems_disk_get_device_identifier( dd);
150  close( fd);
151
152  /* Get the disk device identifier */
153  rtems_filesystem_split_dev_t( disk, major, minor);
154
155  /* Create a logical disk for each partition */
156  for (i = 0; i < count; ++i) {
157    /* New minor number */
158    ++minor;
159
160    /* Get the device identifier */
161    logical_disk = rtems_filesystem_make_dev_t( major, minor);
162
163    /* Delete logical disk */
164    sc = rtems_disk_delete( logical_disk);
165    if (sc != RTEMS_SUCCESSFUL) {
166      return sc;
167    }
168  }
169
170  return RTEMS_SUCCESSFUL;
171}
Note: See TracBrowser for help on using the repository browser.