• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /****************************************************************************
2  * drivers/bch/bchlib_teardown.c
3  *
4  * Licensed to the Apache Software Foundation (ASF) under one or more
5  * contributor license agreements.  See the NOTICE file distributed with
6  * this work for additional information regarding copyright ownership.  The
7  * ASF licenses this file to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance with the
9  * License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
16  * License for the specific language governing permissions and limitations
17  * under the License.
18  *
19  ****************************************************************************/
20 
21 /****************************************************************************
22  * Included Files
23  ****************************************************************************/
24 #include <stdlib.h>
25 #include <errno.h>
26 #include <assert.h>
27 #include "bch.h"
28 
29 /****************************************************************************
30  * Public Functions
31  ****************************************************************************/
32 
33 /****************************************************************************
34  * Name: bchlib_teardown
35  *
36  * Description:
37  *   Setup so that the block driver referenced by 'blkdev' can be accessed
38  *   similar to a character device.
39  *
40  ****************************************************************************/
41 
bchlib_teardown(void * handle)42 int bchlib_teardown(void *handle)
43 {
44   struct bchlib_s *bch = (struct bchlib_s *)handle;
45 
46   DEBUGASSERT(handle);
47 
48   /* Check that there are not outstanding reference counts on the object */
49 
50   if (bch->refs > 0)
51     {
52       return -EBUSY;
53     }
54 
55   /* Flush any pending data to the block driver */
56 
57   (void)bchlib_flushsector(bch);
58 
59   /* Close the block driver */
60 
61   (void)close_blockdriver(bch->vnode);
62 
63   /* Free the BCH state structure */
64 
65   if (bch->buffer)
66     {
67       free(bch->buffer);
68     }
69 
70   (void)sem_destroy(&bch->sem);
71   free(bch);
72   return OK;
73 }
74 
75