source: rtems/cpukit/libfs/src/jffs2/src/jffs2_fs_sb.h @ e315b460

5
Last change on this file since e315b460 was e315b460, checked in by Al Viro <viro@…>, on 08/01/14 at 19:13:40

kill wbuf_queued/wbuf_dwork_lock

schedule_delayed_work() happening when the work is already pending is
a cheap no-op. Don't bother with ->wbuf_queued logics - it's both
broken (cancelling ->wbuf_dwork leaves it set, as spotted by Jeff Harris)
and pointless. It's cheaper to let schedule_delayed_work() handle that
case.

Reported-by: Jeff Harris <jefftharris@…>
Tested-by: Jeff Harris <jefftharris@…>
Cc: stable@…
Signed-off-by: Al Viro <viro@…>

  • Property mode set to 100644
File size: 5.6 KB
Line 
1/*
2 * JFFS2 -- Journalling Flash File System, Version 2.
3 *
4 * Copyright © 2001-2007 Red Hat, Inc.
5 * Copyright © 2004-2010 David Woodhouse <dwmw2@infradead.org>
6 *
7 * Created by David Woodhouse <dwmw2@infradead.org>
8 *
9 * For licensing information, see the file 'LICENCE' in this directory.
10 *
11 */
12
13#ifndef _JFFS2_FS_SB
14#define _JFFS2_FS_SB
15
16#include <linux/types.h>
17#include <linux/spinlock.h>
18#include <linux/workqueue.h>
19#include <linux/completion.h>
20#include <linux/mutex.h>
21#include <linux/timer.h>
22#include <linux/wait.h>
23#include <linux/list.h>
24#include <linux/rwsem.h>
25
26#define JFFS2_SB_FLAG_RO 1
27#define JFFS2_SB_FLAG_SCANNING 2 /* Flash scanning is in progress */
28#define JFFS2_SB_FLAG_BUILDING 4 /* File system building is in progress */
29
30struct jffs2_inodirty;
31
32struct jffs2_mount_opts {
33        bool override_compr;
34        unsigned int compr;
35
36        /* The size of the reserved pool. The reserved pool is the JFFS2 flash
37         * space which may only be used by root cannot be used by the other
38         * users. This is implemented simply by means of not allowing the
39         * latter users to write to the file system if the amount if the
40         * available space is less then 'rp_size'. */
41        unsigned int rp_size;
42};
43
44/* A struct for the overall file system control.  Pointers to
45   jffs2_sb_info structs are named `c' in the source code.
46   Nee jffs_control
47*/
48struct jffs2_sb_info {
49        struct mtd_info *mtd;
50
51        uint32_t highest_ino;
52        uint32_t checked_ino;
53
54        unsigned int flags;
55
56        struct task_struct *gc_task;    /* GC task struct */
57        struct completion gc_thread_start; /* GC thread start completion */
58        struct completion gc_thread_exit; /* GC thread exit completion port */
59
60        struct mutex alloc_sem;         /* Used to protect all the following
61                                           fields, and also to protect against
62                                           out-of-order writing of nodes. And GC. */
63        uint32_t cleanmarker_size;      /* Size of an _inline_ CLEANMARKER
64                                         (i.e. zero for OOB CLEANMARKER */
65
66        uint32_t flash_size;
67        uint32_t used_size;
68        uint32_t dirty_size;
69        uint32_t wasted_size;
70        uint32_t free_size;
71        uint32_t erasing_size;
72        uint32_t bad_size;
73        uint32_t sector_size;
74        uint32_t unchecked_size;
75
76        uint32_t nr_free_blocks;
77        uint32_t nr_erasing_blocks;
78
79        /* Number of free blocks there must be before we... */
80        uint8_t resv_blocks_write;      /* ... allow a normal filesystem write */
81        uint8_t resv_blocks_deletion;   /* ... allow a normal filesystem deletion */
82        uint8_t resv_blocks_gctrigger;  /* ... wake up the GC thread */
83        uint8_t resv_blocks_gcbad;      /* ... pick a block from the bad_list to GC */
84        uint8_t resv_blocks_gcmerge;    /* ... merge pages when garbage collecting */
85        /* Number of 'very dirty' blocks before we trigger immediate GC */
86        uint8_t vdirty_blocks_gctrigger;
87
88        uint32_t nospc_dirty_size;
89
90        uint32_t nr_blocks;
91        struct jffs2_eraseblock *blocks;        /* The whole array of blocks. Used for getting blocks
92                                                 * from the offset (blocks[ofs / sector_size]) */
93        struct jffs2_eraseblock *nextblock;     /* The block we're currently filling */
94
95        struct jffs2_eraseblock *gcblock;       /* The block we're currently garbage-collecting */
96
97        struct list_head clean_list;            /* Blocks 100% full of clean data */
98        struct list_head very_dirty_list;       /* Blocks with lots of dirty space */
99        struct list_head dirty_list;            /* Blocks with some dirty space */
100        struct list_head erasable_list;         /* Blocks which are completely dirty, and need erasing */
101        struct list_head erasable_pending_wbuf_list;    /* Blocks which need erasing but only after the current wbuf is flushed */
102        struct list_head erasing_list;          /* Blocks which are currently erasing */
103        struct list_head erase_checking_list;   /* Blocks which are being checked and marked */
104        struct list_head erase_pending_list;    /* Blocks which need erasing now */
105        struct list_head erase_complete_list;   /* Blocks which are erased and need the clean marker written to them */
106        struct list_head free_list;             /* Blocks which are free and ready to be used */
107        struct list_head bad_list;              /* Bad blocks. */
108        struct list_head bad_used_list;         /* Bad blocks with valid data in. */
109
110        spinlock_t erase_completion_lock;       /* Protect free_list and erasing_list
111                                                   against erase completion handler */
112        wait_queue_head_t erase_wait;           /* For waiting for erases to complete */
113
114        wait_queue_head_t inocache_wq;
115        int inocache_hashsize;
116        struct jffs2_inode_cache **inocache_list;
117        spinlock_t inocache_lock;
118
119        /* Sem to allow jffs2_garbage_collect_deletion_dirent to
120           drop the erase_completion_lock while it's holding a pointer
121           to an obsoleted node. I don't like this. Alternatives welcomed. */
122        struct mutex erase_free_sem;
123
124        uint32_t wbuf_pagesize; /* 0 for NOR and other flashes with no wbuf */
125
126#ifdef CONFIG_JFFS2_FS_WBUF_VERIFY
127        unsigned char *wbuf_verify; /* read-back buffer for verification */
128#endif
129#ifdef CONFIG_JFFS2_FS_WRITEBUFFER
130        unsigned char *wbuf; /* Write-behind buffer for NAND flash */
131        uint32_t wbuf_ofs;
132        uint32_t wbuf_len;
133        struct jffs2_inodirty *wbuf_inodes;
134        struct rw_semaphore wbuf_sem;   /* Protects the write buffer */
135
136        struct delayed_work wbuf_dwork; /* write-buffer write-out work */
137
138        unsigned char *oobbuf;
139        int oobavail; /* How many bytes are available for JFFS2 in OOB */
140#endif
141
142        struct jffs2_summary *summary;          /* Summary information */
143        struct jffs2_mount_opts mount_opts;
144
145#ifdef CONFIG_JFFS2_FS_XATTR
146#define XATTRINDEX_HASHSIZE     (57)
147        uint32_t highest_xid;
148        uint32_t highest_xseqno;
149        struct list_head xattrindex[XATTRINDEX_HASHSIZE];
150        struct list_head xattr_unchecked;
151        struct list_head xattr_dead_list;
152        struct jffs2_xattr_ref *xref_dead_list;
153        struct jffs2_xattr_ref *xref_temp;
154        struct rw_semaphore xattr_sem;
155        uint32_t xdatum_mem_usage;
156        uint32_t xdatum_mem_threshold;
157#endif
158        /* OS-private pointer for getting back to master superblock info */
159        void *os_priv;
160};
161
162#endif /* _JFFS2_FS_SB */
Note: See TracBrowser for help on using the repository browser.