linux-old/fs/jffs/jffs_fm.h
<<
>>
Prefs
   1/*
   2 * JFFS -- Journaling Flash File System, Linux implementation.
   3 *
   4 * Copyright (C) 1999, 2000  Axis Communications AB.
   5 *
   6 * Created by Finn Hakansson <finn@axis.com>.
   7 *
   8 * This is free software; you can redistribute it and/or modify it
   9 * under the terms of the GNU General Public License as published by
  10 * the Free Software Foundation; either version 2 of the License, or
  11 * (at your option) any later version.
  12 *
  13 * $Id: jffs_fm.h,v 1.13 2001/01/11 12:03:25 dwmw2 Exp $
  14 *
  15 * Ported to Linux 2.3.x and MTD:
  16 * Copyright (C) 2000  Alexander Larsson (alex@cendio.se), Cendio Systems AB
  17 *
  18 */
  19
  20#ifndef __LINUX_JFFS_FM_H__
  21#define __LINUX_JFFS_FM_H__
  22
  23#include <linux/types.h>
  24#include <linux/jffs.h>
  25#include <linux/mtd/mtd.h>
  26#include <linux/config.h>
  27
  28/* The alignment between two nodes in the flash memory.  */
  29#define JFFS_ALIGN_SIZE 4
  30
  31/* Mark the on-flash space as obsolete when appropriate.  */
  32#define JFFS_MARK_OBSOLETE 0
  33
  34#ifndef CONFIG_JFFS_FS_VERBOSE
  35#define CONFIG_JFFS_FS_VERBOSE 1
  36#endif
  37
  38#if CONFIG_JFFS_FS_VERBOSE > 0
  39#define D(x) x
  40#define D1(x) D(x)
  41#else
  42#define D(x)
  43#define D1(x)
  44#endif
  45
  46#if CONFIG_JFFS_FS_VERBOSE > 1
  47#define D2(x) D(x)
  48#else
  49#define D2(x)
  50#endif
  51
  52#if CONFIG_JFFS_FS_VERBOSE > 2
  53#define D3(x) D(x)
  54#else
  55#define D3(x)
  56#endif
  57
  58#define ASSERT(x) x
  59
  60/* How many padding bytes should be inserted between two chunks of data
  61   on the flash?  */
  62#define JFFS_GET_PAD_BYTES(size) ( (JFFS_ALIGN_SIZE-1) & -(__u32)(size) )
  63#define JFFS_PAD(size) ( (size + (JFFS_ALIGN_SIZE-1)) & ~(JFFS_ALIGN_SIZE-1) )
  64
  65
  66
  67void jffs_free_fm(struct jffs_fm *n);
  68struct jffs_fm *jffs_alloc_fm(void);
  69
  70
  71struct jffs_node_ref
  72{
  73        struct jffs_node *node;
  74        struct jffs_node_ref *next;
  75};
  76
  77
  78/* The struct jffs_fm represents a chunk of data in the flash memory.  */
  79struct jffs_fm
  80{
  81        __u32 offset;
  82        __u32 size;
  83        struct jffs_fm *prev;
  84        struct jffs_fm *next;
  85        struct jffs_node_ref *nodes; /* USED if != 0.  */
  86};
  87
  88struct jffs_fmcontrol
  89{
  90        __u32 flash_size;
  91        __u32 used_size;
  92        __u32 dirty_size;
  93        __u32 free_size;
  94        __u32 sector_size;
  95        __u32 min_free_size;  /* The minimum free space needed to be able
  96                                 to perform garbage collections.  */
  97        __u32 max_chunk_size; /* The maximum size of a chunk of data.  */
  98        struct mtd_info *mtd;
  99        struct jffs_control *c;
 100        struct jffs_fm *head;
 101        struct jffs_fm *tail;
 102        struct jffs_fm *head_extra;
 103        struct jffs_fm *tail_extra;
 104        struct semaphore biglock;
 105};
 106
 107/* Notice the two members head_extra and tail_extra in the jffs_control
 108   structure above. Those are only used during the scanning of the flash
 109   memory; while the file system is being built. If the data in the flash
 110   memory is organized like
 111
 112      +----------------+------------------+----------------+
 113      |  USED / DIRTY  |       FREE       |  USED / DIRTY  |
 114      +----------------+------------------+----------------+
 115
 116   then the scan is split in two parts. The first scanned part of the
 117   flash memory is organized through the members head and tail. The
 118   second scanned part is organized with head_extra and tail_extra. When
 119   the scan is completed, the two lists are merged together. The jffs_fm
 120   struct that head_extra references is the logical beginning of the
 121   flash memory so it will be referenced by the head member.  */
 122
 123
 124
 125struct jffs_fmcontrol *jffs_build_begin(struct jffs_control *c, kdev_t dev);
 126void jffs_build_end(struct jffs_fmcontrol *fmc);
 127void jffs_cleanup_fmcontrol(struct jffs_fmcontrol *fmc);
 128
 129int jffs_fmalloc(struct jffs_fmcontrol *fmc, __u32 size,
 130                 struct jffs_node *node, struct jffs_fm **result);
 131int jffs_fmfree(struct jffs_fmcontrol *fmc, struct jffs_fm *fm,
 132                struct jffs_node *node);
 133
 134__u32 jffs_free_size1(struct jffs_fmcontrol *fmc);
 135__u32 jffs_free_size2(struct jffs_fmcontrol *fmc);
 136void jffs_sync_erase(struct jffs_fmcontrol *fmc, int erased_size);
 137struct jffs_fm *jffs_cut_node(struct jffs_fmcontrol *fmc, __u32 size);
 138struct jffs_node *jffs_get_oldest_node(struct jffs_fmcontrol *fmc);
 139long jffs_erasable_size(struct jffs_fmcontrol *fmc);
 140struct jffs_fm *jffs_fmalloced(struct jffs_fmcontrol *fmc, __u32 offset,
 141                               __u32 size, struct jffs_node *node);
 142int jffs_add_node(struct jffs_node *node);
 143void jffs_fmfree_partly(struct jffs_fmcontrol *fmc, struct jffs_fm *fm,
 144                        __u32 size);
 145
 146void jffs_print_fmcontrol(struct jffs_fmcontrol *fmc);
 147void jffs_print_fm(struct jffs_fm *fm);
 148void jffs_print_node_ref(struct jffs_node_ref *ref);
 149
 150#endif /* __LINUX_JFFS_FM_H__  */
 151
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.