ReactOS  0.4.14-dev-115-g4576127
revoke.c File Reference
#include "jfs_user.h"
#include <linux/log2.h>
Include dependency graph for revoke.c:

Go to the source code of this file.

Classes

struct  jbd_revoke_record_s
 
struct  jbd_revoke_table_s
 

Functions

static int hash (journal_t *journal, unsigned long block)
 
static int insert_revoke_hash (journal_t *journal, unsigned long blocknr, tid_t seq)
 
static struct jbd_revoke_record_sfind_revoke_record (journal_t *journal, unsigned long blocknr)
 
int __init journal_init_revoke_caches (void)
 
void journal_destroy_revoke_caches (void)
 
int journal_init_revoke (journal_t *journal, int hash_size)
 
void journal_destroy_revoke (journal_t *journal)
 
int journal_set_revoke (journal_t *journal, unsigned long blocknr, tid_t sequence)
 
int journal_test_revoke (journal_t *journal, unsigned long blocknr, tid_t sequence)
 
void journal_clear_revoke (journal_t *journal)
 

Variables

static struct kmem_cacherevoke_record_cache = NULL
 
static struct kmem_cacherevoke_table_cache = NULL
 

Function Documentation

◆ find_revoke_record()

static struct jbd_revoke_record_s* find_revoke_record ( journal_t *  journal,
unsigned long  blocknr 
)
static

Definition at line 149 of file revoke.c.

151 {
152  struct list_head *hash_list;
153  struct jbd_revoke_record_s *record;
154 
155  hash_list = &journal->j_revoke->hash_table[hash(journal, blocknr)];
156 
157  jbd_lock(&journal->j_revoke_lock);
158  record = (struct jbd_revoke_record_s *) hash_list->next;
159  while (&(record->hash) != hash_list) {
160  if (record->blocknr == blocknr) {
161  jbd_unlock(&journal->j_revoke_lock);
162  return record;
163  }
164  record = (struct jbd_revoke_record_s *) record->hash.next;
165  }
166  jbd_unlock(&journal->j_revoke_lock);
167  return NULL;
168 }
struct list_head * next
Definition: list.h:16
Definition: list.h:15
while(1)
Definition: macro.lex.yy.c:740
static int hash(journal_t *journal, unsigned long block)
Definition: revoke.c:109
smooth NULL
Definition: ftsmooth.c:416
unsigned long blocknr
Definition: revoke.c:84

Referenced by journal_set_revoke(), and journal_test_revoke().

◆ hash()

static int hash ( journal_t *  journal,
unsigned long  block 
)
inlinestatic

Definition at line 109 of file revoke.c.

110 {
111  struct jbd_revoke_table_s *table = journal->j_revoke;
112  int hash_shift = table->hash_shift;
113 
114  return ((block << (hash_shift - 6)) ^
115  (block >> 13) ^
116  (block << (hash_shift - 12))) & (table->hash_size - 1);
117 }
static unsigned int block
Definition: xmlmemory.c:118

Referenced by find_revoke_record(), and insert_revoke_hash().

◆ insert_revoke_hash()

static int insert_revoke_hash ( journal_t *  journal,
unsigned long  blocknr,
tid_t  seq 
)
static

Definition at line 119 of file revoke.c.

121 {
122  struct list_head *hash_list;
123  struct jbd_revoke_record_s *record;
124 
125 repeat:
126  record = (struct jbd_revoke_record_s *)
128  if (!record)
129  goto oom;
130 
131  record->sequence = seq;
132  record->blocknr = blocknr;
133  hash_list = &journal->j_revoke->hash_table[hash(journal, blocknr)];
134  jbd_lock(&journal->j_revoke_lock);
135  list_add(&record->hash, hash_list);
136  jbd_unlock(&journal->j_revoke_lock);
137  return 0;
138 
139 oom:
140  if (!journal_oom_retry)
141  return -ENOMEM;
142  jbd_debug(1, "ENOMEM in %s, retrying\n", __FUNCTION__);
143  yield();
144  goto repeat;
145 }
static void list_add(struct list_entry *entry, struct list_entry *prev, struct list_entry *next)
Definition: list.h:64
#define GFP_NOFS
Definition: module.h:659
void * kmem_cache_alloc(kmem_cache_t *kc, int flags)
Definition: linux.c:92
Definition: arc.h:48
Definition: list.h:15
static int hash(journal_t *journal, unsigned long block)
Definition: revoke.c:109
static struct kmem_cache * revoke_record_cache
Definition: revoke.c:73
unsigned long blocknr
Definition: revoke.c:84
#define yield()
Definition: module.h:439
static int repeat
Definition: xmllint.c:143
#define __FUNCTION__
Definition: types.h:112

Referenced by journal_set_revoke().

◆ journal_clear_revoke()

void journal_clear_revoke ( journal_t *  journal)

Definition at line 689 of file revoke.c.

690 {
691  int i;
692  struct list_head *hash_list;
693  struct jbd_revoke_record_s *record;
694  struct jbd_revoke_table_s *revoke;
695 
696  revoke = journal->j_revoke;
697 
698  for (i = 0; i < revoke->hash_size; i++) {
699  hash_list = &revoke->hash_table[i];
700  while (!list_empty(hash_list)) {
701  record = (struct jbd_revoke_record_s*) hash_list->next;
702  list_del(&record->hash);
704  }
705  }
706 }
struct list_head * hash_table
Definition: revoke.c:95
static void list_del(struct list_head *entry)
Definition: list.h:89
struct list_head * next
Definition: list.h:16
Definition: list.h:15
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static struct kmem_cache * revoke_record_cache
Definition: revoke.c:73
void kmem_cache_free(kmem_cache_t *kc, void *p)
Definition: linux.c:103
__WINE_SERVER_LIST_INLINE int list_empty(const struct list *list)
Definition: list.h:143

Referenced by journal_recover().

◆ journal_destroy_revoke()

void journal_destroy_revoke ( journal_t *  journal)

Definition at line 271 of file revoke.c.

272 {
273  struct jbd_revoke_table_s *table;
274  struct list_head *hash_list;
275  int i;
276 
277  table = journal->j_revoke_table[0];
278  if (!table)
279  return;
280 
281  for (i=0; i<table->hash_size; i++) {
282  hash_list = &table->hash_table[i];
283  J_ASSERT (list_empty(hash_list));
284  }
285 
286  kfree(table->hash_table);
288  journal->j_revoke = NULL;
289 
290  table = journal->j_revoke_table[1];
291  if (!table)
292  return;
293 
294  for (i=0; i<table->hash_size; i++) {
295  hash_list = &table->hash_table[i];
296  J_ASSERT (list_empty(hash_list));
297  }
298 
299  kfree(table->hash_table);
301  journal->j_revoke = NULL;
302 }
GLenum GLsizei GLenum GLenum const GLvoid * table
Definition: glext.h:5644
Definition: list.h:15
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
smooth NULL
Definition: ftsmooth.c:416
void kmem_cache_free(kmem_cache_t *kc, void *p)
Definition: linux.c:103
__WINE_SERVER_LIST_INLINE int list_empty(const struct list *list)
Definition: list.h:143
static struct kmem_cache * revoke_table_cache
Definition: revoke.c:74
void kfree(const void *)

Referenced by journal_destroy(), and journal_init_inode().

◆ journal_destroy_revoke_caches()

void journal_destroy_revoke_caches ( void  )

Definition at line 191 of file revoke.c.

192 {
197 }
smooth NULL
Definition: ftsmooth.c:416
static struct kmem_cache * revoke_record_cache
Definition: revoke.c:73
int kmem_cache_destroy(kmem_cache_t *kc)
Definition: linux.c:82
static struct kmem_cache * revoke_table_cache
Definition: revoke.c:74

Referenced by journal_destroy_caches().

◆ journal_init_revoke()

int journal_init_revoke ( journal_t *  journal,
int  hash_size 
)

Definition at line 201 of file revoke.c.

202 {
203  int shift, tmp;
204 
205  J_ASSERT (journal->j_revoke_table[0] == NULL);
206 
207  shift = 0;
208  tmp = hash_size;
209  while ((tmp >>= 1UL) != 0UL)
210  shift++;
211 
212  journal->j_revoke_table[0] = kmem_cache_alloc(revoke_table_cache, GFP_KERNEL);
213  if (!journal->j_revoke_table[0])
214  return -ENOMEM;
215  journal->j_revoke = journal->j_revoke_table[0];
216 
217  /* Check that the hash_size is a power of two */
218  J_ASSERT(is_power_of_2(hash_size));
219 
220  journal->j_revoke->hash_size = hash_size;
221 
222  journal->j_revoke->hash_shift = shift;
223 
224  journal->j_revoke->hash_table =
225  kmalloc(hash_size * sizeof(struct list_head), GFP_KERNEL);
226  if (!journal->j_revoke->hash_table) {
227  kmem_cache_free(revoke_table_cache, journal->j_revoke_table[0]);
228  journal->j_revoke = NULL;
229  return -ENOMEM;
230  }
231 
232  for (tmp = 0; tmp < hash_size; tmp++)
233  INIT_LIST_HEAD(&journal->j_revoke->hash_table[tmp]);
234 
235  journal->j_revoke_table[1] = kmem_cache_alloc(revoke_table_cache, GFP_KERNEL);
236  if (!journal->j_revoke_table[1]) {
237  kfree(journal->j_revoke_table[0]->hash_table);
238  kmem_cache_free(revoke_table_cache, journal->j_revoke_table[0]);
239  return -ENOMEM;
240  }
241 
242  journal->j_revoke = journal->j_revoke_table[1];
243 
244  /* Check that the hash_size is a power of two */
245  J_ASSERT(is_power_of_2(hash_size));
246 
247  journal->j_revoke->hash_size = hash_size;
248 
249  journal->j_revoke->hash_shift = shift;
250 
251  journal->j_revoke->hash_table =
252  kmalloc(hash_size * sizeof(struct list_head), GFP_KERNEL);
253  if (!journal->j_revoke->hash_table) {
254  kfree(journal->j_revoke_table[0]->hash_table);
255  kmem_cache_free(revoke_table_cache, journal->j_revoke_table[0]);
256  kmem_cache_free(revoke_table_cache, journal->j_revoke_table[1]);
257  journal->j_revoke = NULL;
258  return -ENOMEM;
259  }
260 
261  for (tmp = 0; tmp < hash_size; tmp++)
262  INIT_LIST_HEAD(&journal->j_revoke->hash_table[tmp]);
263 
264  jbd_lock_init(&journal->j_revoke_lock);
265 
266  return 0;
267 }
#define is_power_of_2(x)
Definition: memory.c:2294
#define shift
Definition: input.c:1668
#define INIT_LIST_HEAD(ptr)
Definition: list.h:24
void * kmem_cache_alloc(kmem_cache_t *kc, int flags)
Definition: linux.c:92
#define GFP_KERNEL
Definition: module.h:658
Definition: arc.h:48
Definition: list.h:15
smooth NULL
Definition: ftsmooth.c:416
void kmem_cache_free(kmem_cache_t *kc, void *p)
Definition: linux.c:103
void * kmalloc(size_t, int)
#define UL
Definition: tui.h:83
static struct kmem_cache * revoke_table_cache
Definition: revoke.c:74
void kfree(const void *)

Referenced by journal_init_common().

◆ journal_init_revoke_caches()

int __init journal_init_revoke_caches ( void  )

Definition at line 170 of file revoke.c.

171 {
172  revoke_record_cache = kmem_cache_create("revoke_record",
173  sizeof(struct jbd_revoke_record_s),
174  0,
176  NULL);
177  if (revoke_record_cache == 0)
178  return -ENOMEM;
179 
180  revoke_table_cache = kmem_cache_create("revoke_table",
181  sizeof(struct jbd_revoke_table_s),
182  0, SLAB_TEMPORARY, NULL);
183  if (revoke_table_cache == 0) {
186  return -ENOMEM;
187  }
188  return 0;
189 }
kmem_cache_t * kmem_cache_create(const char *name, size_t size, size_t offset, unsigned long flags, kmem_cache_cb_t ctor)
Definition: linux.c:48
#define SLAB_HWCACHE_ALIGN
Definition: module.h:1121
Definition: arc.h:48
smooth NULL
Definition: ftsmooth.c:416
static struct kmem_cache * revoke_record_cache
Definition: revoke.c:73
int kmem_cache_destroy(kmem_cache_t *kc)
Definition: linux.c:82
#define SLAB_TEMPORARY
Definition: module.h:1123
static struct kmem_cache * revoke_table_cache
Definition: revoke.c:74

Referenced by journal_init_caches().

◆ journal_set_revoke()

int journal_set_revoke ( journal_t *  journal,
unsigned long  blocknr,
tid_t  sequence 
)

Definition at line 646 of file revoke.c.

649 {
650  struct jbd_revoke_record_s *record;
651 
652  record = find_revoke_record(journal, blocknr);
653  if (record) {
654  /* If we have multiple occurrences, only record the
655  * latest sequence number in the hashed record */
656  if (tid_gt(sequence, record->sequence))
657  record->sequence = sequence;
658  return 0;
659  }
660  return insert_revoke_hash(journal, blocknr, sequence);
661 }
static int insert_revoke_hash(journal_t *journal, unsigned long blocknr, tid_t seq)
Definition: revoke.c:119
static int tid_gt(tid_t x, tid_t y)
Definition: jbd.h:1085
unsigned long blocknr
Definition: revoke.c:84
static struct message * sequence
Definition: subclass.c:48
static struct jbd_revoke_record_s * find_revoke_record(journal_t *journal, unsigned long blocknr)
Definition: revoke.c:149

Referenced by scan_revoke_records().

◆ journal_test_revoke()

int journal_test_revoke ( journal_t *  journal,
unsigned long  blocknr,
tid_t  sequence 
)

Definition at line 670 of file revoke.c.

673 {
674  struct jbd_revoke_record_s *record;
675 
676  record = find_revoke_record(journal, blocknr);
677  if (!record)
678  return 0;
679  if (tid_gt(sequence, record->sequence))
680  return 0;
681  return 1;
682 }
static int tid_gt(tid_t x, tid_t y)
Definition: jbd.h:1085
unsigned long blocknr
Definition: revoke.c:84
static struct message * sequence
Definition: subclass.c:48
static struct jbd_revoke_record_s * find_revoke_record(journal_t *journal, unsigned long blocknr)
Definition: revoke.c:149

Referenced by do_one_pass().

Variable Documentation

◆ revoke_record_cache

struct kmem_cache* revoke_record_cache = NULL
static

◆ revoke_table_cache