]> bbs.cooldavid.org Git - net-next-2.6.git/blame - fs/gfs2/dir.c
Merge branch 'tip/perf/jump-label-2' of git://git.kernel.org/pub/scm/linux/kernel...
[net-next-2.6.git] / fs / gfs2 / dir.c
CommitLineData
b3b94faa
DT
1/*
2 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
3a8a9a10 3 * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
b3b94faa
DT
4 *
5 * This copyrighted material is made available to anyone wishing to use,
6 * modify, copy, or redistribute it subject to the terms and conditions
e9fc2aa0 7 * of the GNU General Public License version 2.
b3b94faa
DT
8 */
9
10/*
61e085a8
SW
11 * Implements Extendible Hashing as described in:
12 * "Extendible Hashing" by Fagin, et al in
13 * __ACM Trans. on Database Systems__, Sept 1979.
14 *
15 *
16 * Here's the layout of dirents which is essentially the same as that of ext2
17 * within a single block. The field de_name_len is the number of bytes
18 * actually required for the name (no null terminator). The field de_rec_len
19 * is the number of bytes allocated to the dirent. The offset of the next
20 * dirent in the block is (dirent + dirent->de_rec_len). When a dirent is
21 * deleted, the preceding dirent inherits its allocated space, ie
22 * prev->de_rec_len += deleted->de_rec_len. Since the next dirent is obtained
23 * by adding de_rec_len to the current dirent, this essentially causes the
24 * deleted dirent to get jumped over when iterating through all the dirents.
25 *
26 * When deleting the first dirent in a block, there is no previous dirent so
27 * the field de_ino is set to zero to designate it as deleted. When allocating
28 * a dirent, gfs2_dirent_alloc iterates through the dirents in a block. If the
29 * first dirent has (de_ino == 0) and de_rec_len is large enough, this first
30 * dirent is allocated. Otherwise it must go through all the 'used' dirents
31 * searching for one in which the amount of total space minus the amount of
32 * used space will provide enough space for the new dirent.
33 *
34 * There are two types of blocks in which dirents reside. In a stuffed dinode,
35 * the dirents begin at offset sizeof(struct gfs2_dinode) from the beginning of
36 * the block. In leaves, they begin at offset sizeof(struct gfs2_leaf) from the
37 * beginning of the leaf block. The dirents reside in leaves when
38 *
383f01fb 39 * dip->i_diskflags & GFS2_DIF_EXHASH is true
61e085a8
SW
40 *
41 * Otherwise, the dirents are "linear", within a single stuffed dinode block.
42 *
43 * When the dirents are in leaves, the actual contents of the directory file are
44 * used as an array of 64-bit block pointers pointing to the leaf blocks. The
45 * dirents are NOT in the directory file itself. There can be more than one
46 * block pointer in the array that points to the same leaf. In fact, when a
47 * directory is first converted from linear to exhash, all of the pointers
48 * point to the same leaf.
49 *
50 * When a leaf is completely full, the size of the hash table can be
51 * doubled unless it is already at the maximum size which is hard coded into
52 * GFS2_DIR_MAX_DEPTH. After that, leaves are chained together in a linked list,
53 * but never before the maximum hash table size has been reached.
54 */
b3b94faa 55
b3b94faa
DT
56#include <linux/slab.h>
57#include <linux/spinlock.h>
b3b94faa
DT
58#include <linux/buffer_head.h>
59#include <linux/sort.h>
5c676f6d 60#include <linux/gfs2_ondisk.h>
71b86f56 61#include <linux/crc32.h>
fe1bdedc 62#include <linux/vmalloc.h>
b3b94faa
DT
63
64#include "gfs2.h"
5c676f6d 65#include "incore.h"
b3b94faa
DT
66#include "dir.h"
67#include "glock.h"
68#include "inode.h"
b3b94faa
DT
69#include "meta_io.h"
70#include "quota.h"
71#include "rgrp.h"
72#include "trans.h"
e13940ba 73#include "bmap.h"
5c676f6d 74#include "util.h"
b3b94faa
DT
75
76#define IS_LEAF 1 /* Hashed (leaf) directory */
77#define IS_DINODE 2 /* Linear (stuffed dinode block) directory */
78
cd915493
SW
79#define gfs2_disk_hash2offset(h) (((u64)(h)) >> 1)
80#define gfs2_dir_offset2hash(p) ((u32)(((u64)(p)) << 1))
b3b94faa 81
8d123585
SW
82struct qstr gfs2_qdot __read_mostly;
83struct qstr gfs2_qdotdot __read_mostly;
84
907b9bce 85typedef int (*leaf_call_t) (struct gfs2_inode *dip, u32 index, u32 len,
2bdbc5d7
SW
86 u64 leaf_no, void *data);
87typedef int (*gfs2_dscan_t)(const struct gfs2_dirent *dent,
88 const struct qstr *name, void *opaque);
b3b94faa 89
61e085a8 90
cd915493 91int gfs2_dir_get_new_buffer(struct gfs2_inode *ip, u64 block,
61e085a8 92 struct buffer_head **bhp)
e13940ba
SW
93{
94 struct buffer_head *bh;
e13940ba 95
61e085a8
SW
96 bh = gfs2_meta_new(ip->i_gl, block);
97 gfs2_trans_add_bh(ip->i_gl, bh, 1);
98 gfs2_metatype_set(bh, GFS2_METATYPE_JD, GFS2_FORMAT_JD);
99 gfs2_buffer_clear_tail(bh, sizeof(struct gfs2_meta_header));
e13940ba
SW
100 *bhp = bh;
101 return 0;
102}
103
cd915493 104static int gfs2_dir_get_existing_buffer(struct gfs2_inode *ip, u64 block,
61e085a8
SW
105 struct buffer_head **bhp)
106{
107 struct buffer_head *bh;
108 int error;
e13940ba 109
7276b3b0 110 error = gfs2_meta_read(ip->i_gl, block, DIO_WAIT, &bh);
61e085a8
SW
111 if (error)
112 return error;
feaa7bba 113 if (gfs2_metatype_check(GFS2_SB(&ip->i_inode), bh, GFS2_METATYPE_JD)) {
61e085a8
SW
114 brelse(bh);
115 return -EIO;
116 }
117 *bhp = bh;
118 return 0;
119}
e13940ba
SW
120
121static int gfs2_dir_write_stuffed(struct gfs2_inode *ip, const char *buf,
122 unsigned int offset, unsigned int size)
e13940ba
SW
123{
124 struct buffer_head *dibh;
125 int error;
126
127 error = gfs2_meta_inode_buffer(ip, &dibh);
128 if (error)
129 return error;
130
131 gfs2_trans_add_bh(ip->i_gl, dibh, 1);
c752666c 132 memcpy(dibh->b_data + offset + sizeof(struct gfs2_dinode), buf, size);
a2e0f799
SW
133 if (ip->i_inode.i_size < offset + size)
134 i_size_write(&ip->i_inode, offset + size);
4bd91ba1 135 ip->i_inode.i_mtime = ip->i_inode.i_ctime = CURRENT_TIME;
539e5d6b 136 gfs2_dinode_out(ip, dibh->b_data);
e13940ba
SW
137
138 brelse(dibh);
139
140 return size;
141}
142
143
144
145/**
146 * gfs2_dir_write_data - Write directory information to the inode
147 * @ip: The GFS2 inode
148 * @buf: The buffer containing information to be written
149 * @offset: The file offset to start writing at
150 * @size: The amount of data to write
151 *
152 * Returns: The number of bytes correctly written or error code
153 */
154static int gfs2_dir_write_data(struct gfs2_inode *ip, const char *buf,
cd915493 155 u64 offset, unsigned int size)
e13940ba 156{
feaa7bba 157 struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
e13940ba 158 struct buffer_head *dibh;
cd915493
SW
159 u64 lblock, dblock;
160 u32 extlen = 0;
e13940ba
SW
161 unsigned int o;
162 int copied = 0;
163 int error = 0;
9b8c81d1 164 int new = 0;
e13940ba
SW
165
166 if (!size)
167 return 0;
168
169 if (gfs2_is_stuffed(ip) &&
170 offset + size <= sdp->sd_sb.sb_bsize - sizeof(struct gfs2_dinode))
568f4c96
SW
171 return gfs2_dir_write_stuffed(ip, buf, (unsigned int)offset,
172 size);
e13940ba
SW
173
174 if (gfs2_assert_warn(sdp, gfs2_is_jdata(ip)))
175 return -EINVAL;
176
177 if (gfs2_is_stuffed(ip)) {
f25ef0c1 178 error = gfs2_unstuff_dinode(ip, NULL);
e13940ba 179 if (error)
c752666c 180 return error;
e13940ba
SW
181 }
182
183 lblock = offset;
184 o = do_div(lblock, sdp->sd_jbsize) + sizeof(struct gfs2_meta_header);
185
186 while (copied < size) {
187 unsigned int amount;
188 struct buffer_head *bh;
e13940ba
SW
189
190 amount = size - copied;
191 if (amount > sdp->sd_sb.sb_bsize - o)
192 amount = sdp->sd_sb.sb_bsize - o;
193
194 if (!extlen) {
195 new = 1;
feaa7bba 196 error = gfs2_extent_map(&ip->i_inode, lblock, &new,
fd88de56 197 &dblock, &extlen);
e13940ba
SW
198 if (error)
199 goto fail;
200 error = -EIO;
201 if (gfs2_assert_withdraw(sdp, dblock))
202 goto fail;
203 }
204
61e085a8
SW
205 if (amount == sdp->sd_jbsize || new)
206 error = gfs2_dir_get_new_buffer(ip, dblock, &bh);
207 else
208 error = gfs2_dir_get_existing_buffer(ip, dblock, &bh);
209
e13940ba
SW
210 if (error)
211 goto fail;
212
213 gfs2_trans_add_bh(ip->i_gl, bh, 1);
214 memcpy(bh->b_data + o, buf, amount);
215 brelse(bh);
e13940ba 216
899bb264 217 buf += amount;
e13940ba
SW
218 copied += amount;
219 lblock++;
220 dblock++;
221 extlen--;
222
223 o = sizeof(struct gfs2_meta_header);
224 }
225
226out:
227 error = gfs2_meta_inode_buffer(ip, &dibh);
228 if (error)
229 return error;
230
a2e0f799
SW
231 if (ip->i_inode.i_size < offset + copied)
232 i_size_write(&ip->i_inode, offset + copied);
4bd91ba1 233 ip->i_inode.i_mtime = ip->i_inode.i_ctime = CURRENT_TIME;
e13940ba
SW
234
235 gfs2_trans_add_bh(ip->i_gl, dibh, 1);
539e5d6b 236 gfs2_dinode_out(ip, dibh->b_data);
e13940ba
SW
237 brelse(dibh);
238
239 return copied;
240fail:
241 if (copied)
242 goto out;
243 return error;
244}
245
246static int gfs2_dir_read_stuffed(struct gfs2_inode *ip, char *buf,
7276b3b0 247 u64 offset, unsigned int size)
e13940ba
SW
248{
249 struct buffer_head *dibh;
250 int error;
251
252 error = gfs2_meta_inode_buffer(ip, &dibh);
253 if (!error) {
254 offset += sizeof(struct gfs2_dinode);
255 memcpy(buf, dibh->b_data + offset, size);
256 brelse(dibh);
257 }
258
259 return (error) ? error : size;
260}
261
262
263/**
264 * gfs2_dir_read_data - Read a data from a directory inode
265 * @ip: The GFS2 Inode
266 * @buf: The buffer to place result into
267 * @offset: File offset to begin jdata_readng from
268 * @size: Amount of data to transfer
269 *
270 * Returns: The amount of data actually copied or the error
271 */
7276b3b0
SW
272static int gfs2_dir_read_data(struct gfs2_inode *ip, char *buf, u64 offset,
273 unsigned int size, unsigned ra)
e13940ba 274{
feaa7bba 275 struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
cd915493
SW
276 u64 lblock, dblock;
277 u32 extlen = 0;
e13940ba
SW
278 unsigned int o;
279 int copied = 0;
280 int error = 0;
a2e0f799 281 u64 disksize = i_size_read(&ip->i_inode);
e13940ba 282
a2e0f799 283 if (offset >= disksize)
e13940ba
SW
284 return 0;
285
a2e0f799
SW
286 if (offset + size > disksize)
287 size = disksize - offset;
e13940ba
SW
288
289 if (!size)
290 return 0;
291
292 if (gfs2_is_stuffed(ip))
7276b3b0 293 return gfs2_dir_read_stuffed(ip, buf, offset, size);
e13940ba
SW
294
295 if (gfs2_assert_warn(sdp, gfs2_is_jdata(ip)))
296 return -EINVAL;
297
298 lblock = offset;
299 o = do_div(lblock, sdp->sd_jbsize) + sizeof(struct gfs2_meta_header);
300
301 while (copied < size) {
302 unsigned int amount;
303 struct buffer_head *bh;
304 int new;
305
306 amount = size - copied;
307 if (amount > sdp->sd_sb.sb_bsize - o)
308 amount = sdp->sd_sb.sb_bsize - o;
309
310 if (!extlen) {
311 new = 0;
feaa7bba 312 error = gfs2_extent_map(&ip->i_inode, lblock, &new,
fd88de56 313 &dblock, &extlen);
7276b3b0 314 if (error || !dblock)
e13940ba 315 goto fail;
7276b3b0
SW
316 BUG_ON(extlen < 1);
317 if (!ra)
318 extlen = 1;
319 bh = gfs2_meta_ra(ip->i_gl, dblock, extlen);
b7d8ac3e 320 } else {
7276b3b0 321 error = gfs2_meta_read(ip->i_gl, dblock, DIO_WAIT, &bh);
e13940ba
SW
322 if (error)
323 goto fail;
7276b3b0
SW
324 }
325 error = gfs2_metatype_check(sdp, bh, GFS2_METATYPE_JD);
326 if (error) {
327 brelse(bh);
328 goto fail;
329 }
330 dblock++;
331 extlen--;
e13940ba
SW
332 memcpy(buf, bh->b_data + o, amount);
333 brelse(bh);
899bb264 334 buf += amount;
e13940ba
SW
335 copied += amount;
336 lblock++;
e13940ba
SW
337 o = sizeof(struct gfs2_meta_header);
338 }
339
340 return copied;
341fail:
342 return (copied) ? copied : error;
343}
344
5e7d65cd
SW
345static inline int gfs2_dirent_sentinel(const struct gfs2_dirent *dent)
346{
347 return dent->de_inum.no_addr == 0 || dent->de_inum.no_formal_ino == 0;
348}
349
c752666c
SW
350static inline int __gfs2_dirent_find(const struct gfs2_dirent *dent,
351 const struct qstr *name, int ret)
352{
5e7d65cd 353 if (!gfs2_dirent_sentinel(dent) &&
c752666c
SW
354 be32_to_cpu(dent->de_hash) == name->hash &&
355 be16_to_cpu(dent->de_name_len) == name->len &&
2bdbc5d7 356 memcmp(dent+1, name->name, name->len) == 0)
c752666c
SW
357 return ret;
358 return 0;
359}
360
361static int gfs2_dirent_find(const struct gfs2_dirent *dent,
71b86f56
SW
362 const struct qstr *name,
363 void *opaque)
c752666c
SW
364{
365 return __gfs2_dirent_find(dent, name, 1);
366}
367
368static int gfs2_dirent_prev(const struct gfs2_dirent *dent,
71b86f56
SW
369 const struct qstr *name,
370 void *opaque)
c752666c
SW
371{
372 return __gfs2_dirent_find(dent, name, 2);
373}
374
375/*
376 * name->name holds ptr to start of block.
377 * name->len holds size of block.
b3b94faa 378 */
c752666c 379static int gfs2_dirent_last(const struct gfs2_dirent *dent,
71b86f56
SW
380 const struct qstr *name,
381 void *opaque)
c752666c
SW
382{
383 const char *start = name->name;
384 const char *end = (const char *)dent + be16_to_cpu(dent->de_rec_len);
385 if (name->len == (end - start))
386 return 1;
387 return 0;
388}
b3b94faa 389
c752666c 390static int gfs2_dirent_find_space(const struct gfs2_dirent *dent,
71b86f56
SW
391 const struct qstr *name,
392 void *opaque)
b3b94faa 393{
c752666c
SW
394 unsigned required = GFS2_DIRENT_SIZE(name->len);
395 unsigned actual = GFS2_DIRENT_SIZE(be16_to_cpu(dent->de_name_len));
396 unsigned totlen = be16_to_cpu(dent->de_rec_len);
397
5e7d65cd 398 if (gfs2_dirent_sentinel(dent))
728a756b 399 actual = 0;
c5392124 400 if (totlen - actual >= required)
c752666c
SW
401 return 1;
402 return 0;
403}
404
71b86f56
SW
405struct dirent_gather {
406 const struct gfs2_dirent **pdent;
407 unsigned offset;
408};
409
410static int gfs2_dirent_gather(const struct gfs2_dirent *dent,
411 const struct qstr *name,
412 void *opaque)
413{
414 struct dirent_gather *g = opaque;
5e7d65cd 415 if (!gfs2_dirent_sentinel(dent)) {
71b86f56
SW
416 g->pdent[g->offset++] = dent;
417 }
418 return 0;
419}
420
c752666c
SW
421/*
422 * Other possible things to check:
423 * - Inode located within filesystem size (and on valid block)
424 * - Valid directory entry type
425 * Not sure how heavy-weight we want to make this... could also check
426 * hash is correct for example, but that would take a lot of extra time.
427 * For now the most important thing is to check that the various sizes
428 * are correct.
429 */
430static int gfs2_check_dirent(struct gfs2_dirent *dent, unsigned int offset,
431 unsigned int size, unsigned int len, int first)
432{
433 const char *msg = "gfs2_dirent too small";
434 if (unlikely(size < sizeof(struct gfs2_dirent)))
435 goto error;
436 msg = "gfs2_dirent misaligned";
437 if (unlikely(offset & 0x7))
438 goto error;
439 msg = "gfs2_dirent points beyond end of block";
440 if (unlikely(offset + size > len))
441 goto error;
442 msg = "zero inode number";
5e7d65cd 443 if (unlikely(!first && gfs2_dirent_sentinel(dent)))
c752666c
SW
444 goto error;
445 msg = "name length is greater than space in dirent";
5e7d65cd 446 if (!gfs2_dirent_sentinel(dent) &&
c752666c
SW
447 unlikely(sizeof(struct gfs2_dirent)+be16_to_cpu(dent->de_name_len) >
448 size))
449 goto error;
450 return 0;
451error:
452 printk(KERN_WARNING "gfs2_check_dirent: %s (%s)\n", msg,
453 first ? "first in block" : "not first in block");
454 return -EIO;
b3b94faa
DT
455}
456
71b86f56 457static int gfs2_dirent_offset(const void *buf)
c752666c 458{
71b86f56
SW
459 const struct gfs2_meta_header *h = buf;
460 int offset;
c752666c
SW
461
462 BUG_ON(buf == NULL);
c752666c 463
e3167ded 464 switch(be32_to_cpu(h->mh_type)) {
c752666c
SW
465 case GFS2_METATYPE_LF:
466 offset = sizeof(struct gfs2_leaf);
467 break;
468 case GFS2_METATYPE_DI:
469 offset = sizeof(struct gfs2_dinode);
470 break;
471 default:
472 goto wrong_type;
473 }
71b86f56
SW
474 return offset;
475wrong_type:
476 printk(KERN_WARNING "gfs2_scan_dirent: wrong block type %u\n",
e3167ded 477 be32_to_cpu(h->mh_type));
71b86f56
SW
478 return -1;
479}
480
2bdbc5d7 481static struct gfs2_dirent *gfs2_dirent_scan(struct inode *inode, void *buf,
71b86f56
SW
482 unsigned int len, gfs2_dscan_t scan,
483 const struct qstr *name,
484 void *opaque)
485{
486 struct gfs2_dirent *dent, *prev;
487 unsigned offset;
488 unsigned size;
489 int ret = 0;
c752666c 490
71b86f56
SW
491 ret = gfs2_dirent_offset(buf);
492 if (ret < 0)
493 goto consist_inode;
494
495 offset = ret;
c752666c 496 prev = NULL;
2bdbc5d7 497 dent = buf + offset;
c752666c
SW
498 size = be16_to_cpu(dent->de_rec_len);
499 if (gfs2_check_dirent(dent, offset, size, len, 1))
500 goto consist_inode;
501 do {
71b86f56 502 ret = scan(dent, name, opaque);
c752666c
SW
503 if (ret)
504 break;
505 offset += size;
506 if (offset == len)
507 break;
508 prev = dent;
2bdbc5d7 509 dent = buf + offset;
c752666c
SW
510 size = be16_to_cpu(dent->de_rec_len);
511 if (gfs2_check_dirent(dent, offset, size, len, 0))
512 goto consist_inode;
513 } while(1);
514
515 switch(ret) {
516 case 0:
517 return NULL;
518 case 1:
519 return dent;
520 case 2:
521 return prev ? prev : dent;
522 default:
523 BUG_ON(ret > 0);
524 return ERR_PTR(ret);
525 }
526
c752666c 527consist_inode:
feaa7bba 528 gfs2_consist_inode(GFS2_I(inode));
c752666c
SW
529 return ERR_PTR(-EIO);
530}
531
2bdbc5d7
SW
532static int dirent_check_reclen(struct gfs2_inode *dip,
533 const struct gfs2_dirent *d, const void *end_p)
534{
535 const void *ptr = d;
536 u16 rec_len = be16_to_cpu(d->de_rec_len);
537
538 if (unlikely(rec_len < sizeof(struct gfs2_dirent)))
539 goto broken;
540 ptr += rec_len;
541 if (ptr < end_p)
542 return rec_len;
543 if (ptr == end_p)
544 return -ENOENT;
545broken:
546 gfs2_consist_inode(dip);
547 return -EIO;
548}
549
b3b94faa
DT
550/**
551 * dirent_next - Next dirent
552 * @dip: the directory
553 * @bh: The buffer
554 * @dent: Pointer to list of dirents
555 *
556 * Returns: 0 on success, error code otherwise
557 */
558
559static int dirent_next(struct gfs2_inode *dip, struct buffer_head *bh,
560 struct gfs2_dirent **dent)
561{
2bdbc5d7
SW
562 struct gfs2_dirent *cur = *dent, *tmp;
563 char *bh_end = bh->b_data + bh->b_size;
564 int ret;
b3b94faa 565
2bdbc5d7
SW
566 ret = dirent_check_reclen(dip, cur, bh_end);
567 if (ret < 0)
568 return ret;
4dd651ad 569
2bdbc5d7
SW
570 tmp = (void *)cur + ret;
571 ret = dirent_check_reclen(dip, tmp, bh_end);
572 if (ret == -EIO)
573 return ret;
4dd651ad 574
b3b94faa 575 /* Only the first dent could ever have de_inum.no_addr == 0 */
5e7d65cd 576 if (gfs2_dirent_sentinel(tmp)) {
b3b94faa
DT
577 gfs2_consist_inode(dip);
578 return -EIO;
579 }
580
581 *dent = tmp;
b3b94faa
DT
582 return 0;
583}
584
585/**
586 * dirent_del - Delete a dirent
587 * @dip: The GFS2 inode
588 * @bh: The buffer
589 * @prev: The previous dirent
590 * @cur: The current dirent
591 *
592 */
593
594static void dirent_del(struct gfs2_inode *dip, struct buffer_head *bh,
595 struct gfs2_dirent *prev, struct gfs2_dirent *cur)
596{
cd915493 597 u16 cur_rec_len, prev_rec_len;
b3b94faa 598
5e7d65cd 599 if (gfs2_dirent_sentinel(cur)) {
b3b94faa
DT
600 gfs2_consist_inode(dip);
601 return;
602 }
603
d4e9c4c3 604 gfs2_trans_add_bh(dip->i_gl, bh, 1);
b3b94faa
DT
605
606 /* If there is no prev entry, this is the first entry in the block.
607 The de_rec_len is already as big as it needs to be. Just zero
608 out the inode number and return. */
609
610 if (!prev) {
5e7d65cd
SW
611 cur->de_inum.no_addr = 0;
612 cur->de_inum.no_formal_ino = 0;
b3b94faa
DT
613 return;
614 }
615
616 /* Combine this dentry with the previous one. */
617
fc69d0d3
SW
618 prev_rec_len = be16_to_cpu(prev->de_rec_len);
619 cur_rec_len = be16_to_cpu(cur->de_rec_len);
b3b94faa
DT
620
621 if ((char *)prev + prev_rec_len != (char *)cur)
622 gfs2_consist_inode(dip);
623 if ((char *)cur + cur_rec_len > bh->b_data + bh->b_size)
624 gfs2_consist_inode(dip);
625
626 prev_rec_len += cur_rec_len;
fc69d0d3 627 prev->de_rec_len = cpu_to_be16(prev_rec_len);
b3b94faa
DT
628}
629
c752666c
SW
630/*
631 * Takes a dent from which to grab space as an argument. Returns the
632 * newly created dent.
b3b94faa 633 */
08bc2dbc
AB
634static struct gfs2_dirent *gfs2_init_dirent(struct inode *inode,
635 struct gfs2_dirent *dent,
636 const struct qstr *name,
637 struct buffer_head *bh)
b3b94faa 638{
feaa7bba 639 struct gfs2_inode *ip = GFS2_I(inode);
c752666c
SW
640 struct gfs2_dirent *ndent;
641 unsigned offset = 0, totlen;
642
5e7d65cd 643 if (!gfs2_dirent_sentinel(dent))
c752666c
SW
644 offset = GFS2_DIRENT_SIZE(be16_to_cpu(dent->de_name_len));
645 totlen = be16_to_cpu(dent->de_rec_len);
646 BUG_ON(offset + name->len > totlen);
647 gfs2_trans_add_bh(ip->i_gl, bh, 1);
648 ndent = (struct gfs2_dirent *)((char *)dent + offset);
649 dent->de_rec_len = cpu_to_be16(offset);
650 gfs2_qstr2dirent(name, totlen - offset, ndent);
651 return ndent;
b3b94faa
DT
652}
653
c752666c
SW
654static struct gfs2_dirent *gfs2_dirent_alloc(struct inode *inode,
655 struct buffer_head *bh,
656 const struct qstr *name)
b3b94faa
DT
657{
658 struct gfs2_dirent *dent;
907b9bce 659 dent = gfs2_dirent_scan(inode, bh->b_data, bh->b_size,
71b86f56 660 gfs2_dirent_find_space, name, NULL);
c752666c
SW
661 if (!dent || IS_ERR(dent))
662 return dent;
663 return gfs2_init_dirent(inode, dent, name, bh);
b3b94faa
DT
664}
665
cd915493 666static int get_leaf(struct gfs2_inode *dip, u64 leaf_no,
b3b94faa
DT
667 struct buffer_head **bhp)
668{
669 int error;
670
7276b3b0 671 error = gfs2_meta_read(dip->i_gl, leaf_no, DIO_WAIT, bhp);
feaa7bba
SW
672 if (!error && gfs2_metatype_check(GFS2_SB(&dip->i_inode), *bhp, GFS2_METATYPE_LF)) {
673 /* printk(KERN_INFO "block num=%llu\n", leaf_no); */
b3b94faa 674 error = -EIO;
feaa7bba 675 }
b3b94faa
DT
676
677 return error;
678}
679
680/**
681 * get_leaf_nr - Get a leaf number associated with the index
682 * @dip: The GFS2 inode
683 * @index:
684 * @leaf_out:
685 *
686 * Returns: 0 on success, error code otherwise
687 */
688
cd915493
SW
689static int get_leaf_nr(struct gfs2_inode *dip, u32 index,
690 u64 *leaf_out)
b3b94faa 691{
b44b84d7 692 __be64 leaf_no;
b3b94faa
DT
693 int error;
694
e13940ba 695 error = gfs2_dir_read_data(dip, (char *)&leaf_no,
b44b84d7
AV
696 index * sizeof(__be64),
697 sizeof(__be64), 0);
cd915493 698 if (error != sizeof(u64))
b3b94faa
DT
699 return (error < 0) ? error : -EIO;
700
701 *leaf_out = be64_to_cpu(leaf_no);
702
703 return 0;
704}
705
cd915493 706static int get_first_leaf(struct gfs2_inode *dip, u32 index,
b3b94faa
DT
707 struct buffer_head **bh_out)
708{
cd915493 709 u64 leaf_no;
b3b94faa
DT
710 int error;
711
712 error = get_leaf_nr(dip, index, &leaf_no);
713 if (!error)
714 error = get_leaf(dip, leaf_no, bh_out);
715
716 return error;
717}
718
c752666c
SW
719static struct gfs2_dirent *gfs2_dirent_search(struct inode *inode,
720 const struct qstr *name,
721 gfs2_dscan_t scan,
722 struct buffer_head **pbh)
b3b94faa 723{
c752666c
SW
724 struct buffer_head *bh;
725 struct gfs2_dirent *dent;
feaa7bba 726 struct gfs2_inode *ip = GFS2_I(inode);
b3b94faa
DT
727 int error;
728
383f01fb 729 if (ip->i_diskflags & GFS2_DIF_EXHASH) {
c752666c 730 struct gfs2_leaf *leaf;
9a004508 731 unsigned hsize = 1 << ip->i_depth;
c752666c
SW
732 unsigned index;
733 u64 ln;
a2e0f799 734 if (hsize * sizeof(u64) != i_size_read(inode)) {
c752666c
SW
735 gfs2_consist_inode(ip);
736 return ERR_PTR(-EIO);
737 }
907b9bce 738
9a004508 739 index = name->hash >> (32 - ip->i_depth);
c752666c
SW
740 error = get_first_leaf(ip, index, &bh);
741 if (error)
742 return ERR_PTR(error);
743 do {
744 dent = gfs2_dirent_scan(inode, bh->b_data, bh->b_size,
71b86f56 745 scan, name, NULL);
c752666c
SW
746 if (dent)
747 goto got_dent;
748 leaf = (struct gfs2_leaf *)bh->b_data;
749 ln = be64_to_cpu(leaf->lf_next);
f4154ea0 750 brelse(bh);
c752666c
SW
751 if (!ln)
752 break;
907b9bce 753
c752666c
SW
754 error = get_leaf(ip, ln, &bh);
755 } while(!error);
b3b94faa 756
c752666c 757 return error ? ERR_PTR(error) : NULL;
b3b94faa 758 }
b3b94faa 759
907b9bce 760
c752666c
SW
761 error = gfs2_meta_inode_buffer(ip, &bh);
762 if (error)
763 return ERR_PTR(error);
71b86f56 764 dent = gfs2_dirent_scan(inode, bh->b_data, bh->b_size, scan, name, NULL);
c752666c 765got_dent:
f4154ea0 766 if (unlikely(dent == NULL || IS_ERR(dent))) {
ed386507
SW
767 brelse(bh);
768 bh = NULL;
769 }
c752666c
SW
770 *pbh = bh;
771 return dent;
772}
b3b94faa 773
c752666c
SW
774static struct gfs2_leaf *new_leaf(struct inode *inode, struct buffer_head **pbh, u16 depth)
775{
feaa7bba 776 struct gfs2_inode *ip = GFS2_I(inode);
b45e41d7 777 unsigned int n = 1;
09010978
SW
778 u64 bn;
779 int error;
780 struct buffer_head *bh;
c752666c
SW
781 struct gfs2_leaf *leaf;
782 struct gfs2_dirent *dent;
71b86f56 783 struct qstr name = { .name = "", .len = 0, .hash = 0 };
09010978
SW
784
785 error = gfs2_alloc_block(ip, &bn, &n);
786 if (error)
787 return NULL;
788 bh = gfs2_meta_new(ip->i_gl, bn);
c752666c
SW
789 if (!bh)
790 return NULL;
09010978 791
5731be53 792 gfs2_trans_add_unrevoke(GFS2_SB(inode), bn, 1);
c752666c
SW
793 gfs2_trans_add_bh(ip->i_gl, bh, 1);
794 gfs2_metatype_set(bh, GFS2_METATYPE_LF, GFS2_FORMAT_LF);
795 leaf = (struct gfs2_leaf *)bh->b_data;
796 leaf->lf_depth = cpu_to_be16(depth);
2bdbc5d7 797 leaf->lf_entries = 0;
a2d7d021 798 leaf->lf_dirent_format = cpu_to_be32(GFS2_FORMAT_DE);
2bdbc5d7 799 leaf->lf_next = 0;
c752666c
SW
800 memset(leaf->lf_reserved, 0, sizeof(leaf->lf_reserved));
801 dent = (struct gfs2_dirent *)(leaf+1);
71b86f56 802 gfs2_qstr2dirent(&name, bh->b_size - sizeof(struct gfs2_leaf), dent);
c752666c
SW
803 *pbh = bh;
804 return leaf;
b3b94faa
DT
805}
806
807/**
808 * dir_make_exhash - Convert a stuffed directory into an ExHash directory
809 * @dip: The GFS2 inode
810 *
811 * Returns: 0 on success, error code otherwise
812 */
813
c752666c 814static int dir_make_exhash(struct inode *inode)
b3b94faa 815{
feaa7bba
SW
816 struct gfs2_inode *dip = GFS2_I(inode);
817 struct gfs2_sbd *sdp = GFS2_SB(inode);
b3b94faa 818 struct gfs2_dirent *dent;
c752666c 819 struct qstr args;
b3b94faa
DT
820 struct buffer_head *bh, *dibh;
821 struct gfs2_leaf *leaf;
822 int y;
cd915493 823 u32 x;
b44b84d7
AV
824 __be64 *lp;
825 u64 bn;
b3b94faa
DT
826 int error;
827
828 error = gfs2_meta_inode_buffer(dip, &dibh);
829 if (error)
830 return error;
831
b3b94faa
DT
832 /* Turn over a new leaf */
833
c752666c
SW
834 leaf = new_leaf(inode, &bh, 0);
835 if (!leaf)
836 return -ENOSPC;
837 bn = bh->b_blocknr;
b3b94faa 838
ad6203f2
SW
839 gfs2_assert(sdp, dip->i_entries < (1 << 16));
840 leaf->lf_entries = cpu_to_be16(dip->i_entries);
b3b94faa
DT
841
842 /* Copy dirents */
843
844 gfs2_buffer_copy_tail(bh, sizeof(struct gfs2_leaf), dibh,
845 sizeof(struct gfs2_dinode));
846
847 /* Find last entry */
848
849 x = 0;
c752666c
SW
850 args.len = bh->b_size - sizeof(struct gfs2_dinode) +
851 sizeof(struct gfs2_leaf);
852 args.name = bh->b_data;
feaa7bba 853 dent = gfs2_dirent_scan(&dip->i_inode, bh->b_data, bh->b_size,
71b86f56 854 gfs2_dirent_last, &args, NULL);
c752666c
SW
855 if (!dent) {
856 brelse(bh);
857 brelse(dibh);
858 return -EIO;
859 }
860 if (IS_ERR(dent)) {
861 brelse(bh);
862 brelse(dibh);
863 return PTR_ERR(dent);
b3b94faa 864 }
b3b94faa
DT
865
866 /* Adjust the last dirent's record length
867 (Remember that dent still points to the last entry.) */
868
4dd651ad 869 dent->de_rec_len = cpu_to_be16(be16_to_cpu(dent->de_rec_len) +
b3b94faa 870 sizeof(struct gfs2_dinode) -
4dd651ad 871 sizeof(struct gfs2_leaf));
b3b94faa
DT
872
873 brelse(bh);
874
875 /* We're done with the new leaf block, now setup the new
876 hash table. */
877
d4e9c4c3 878 gfs2_trans_add_bh(dip->i_gl, dibh, 1);
b3b94faa
DT
879 gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode));
880
b44b84d7 881 lp = (__be64 *)(dibh->b_data + sizeof(struct gfs2_dinode));
b3b94faa
DT
882
883 for (x = sdp->sd_hash_ptrs; x--; lp++)
884 *lp = cpu_to_be64(bn);
885
a2e0f799 886 i_size_write(inode, sdp->sd_sb.sb_bsize / 2);
77658aad 887 gfs2_add_inode_blocks(&dip->i_inode, 1);
383f01fb 888 dip->i_diskflags |= GFS2_DIF_EXHASH;
b3b94faa
DT
889
890 for (x = sdp->sd_hash_ptrs, y = -1; x; x >>= 1, y++) ;
9a004508 891 dip->i_depth = y;
b3b94faa 892
539e5d6b 893 gfs2_dinode_out(dip, dibh->b_data);
b3b94faa
DT
894
895 brelse(dibh);
896
897 return 0;
898}
899
900/**
901 * dir_split_leaf - Split a leaf block into two
902 * @dip: The GFS2 inode
903 * @index:
904 * @leaf_no:
905 *
906 * Returns: 0 on success, error code on failure
907 */
908
c752666c 909static int dir_split_leaf(struct inode *inode, const struct qstr *name)
b3b94faa 910{
feaa7bba 911 struct gfs2_inode *dip = GFS2_I(inode);
b3b94faa
DT
912 struct buffer_head *nbh, *obh, *dibh;
913 struct gfs2_leaf *nleaf, *oleaf;
4da3c646 914 struct gfs2_dirent *dent = NULL, *prev = NULL, *next = NULL, *new;
cd915493 915 u32 start, len, half_len, divider;
b44b84d7
AV
916 u64 bn, leaf_no;
917 __be64 *lp;
cd915493 918 u32 index;
b3b94faa
DT
919 int x, moved = 0;
920 int error;
921
9a004508 922 index = name->hash >> (32 - dip->i_depth);
c752666c
SW
923 error = get_leaf_nr(dip, index, &leaf_no);
924 if (error)
925 return error;
b3b94faa
DT
926
927 /* Get the old leaf block */
b3b94faa
DT
928 error = get_leaf(dip, leaf_no, &obh);
929 if (error)
e90deff5 930 return error;
b3b94faa 931
b3b94faa 932 oleaf = (struct gfs2_leaf *)obh->b_data;
9a004508 933 if (dip->i_depth == be16_to_cpu(oleaf->lf_depth)) {
e90deff5
SW
934 brelse(obh);
935 return 1; /* can't split */
936 }
937
938 gfs2_trans_add_bh(dip->i_gl, obh, 1);
b3b94faa 939
c752666c
SW
940 nleaf = new_leaf(inode, &nbh, be16_to_cpu(oleaf->lf_depth) + 1);
941 if (!nleaf) {
942 brelse(obh);
943 return -ENOSPC;
944 }
945 bn = nbh->b_blocknr;
b3b94faa 946
c752666c 947 /* Compute the start and len of leaf pointers in the hash table. */
9a004508 948 len = 1 << (dip->i_depth - be16_to_cpu(oleaf->lf_depth));
b3b94faa
DT
949 half_len = len >> 1;
950 if (!half_len) {
9a004508 951 printk(KERN_WARNING "i_depth %u lf_depth %u index %u\n", dip->i_depth, be16_to_cpu(oleaf->lf_depth), index);
b3b94faa
DT
952 gfs2_consist_inode(dip);
953 error = -EIO;
954 goto fail_brelse;
955 }
956
957 start = (index & ~(len - 1));
958
959 /* Change the pointers.
960 Don't bother distinguishing stuffed from non-stuffed.
961 This code is complicated enough already. */
4244b52e
DR
962 lp = kmalloc(half_len * sizeof(__be64), GFP_NOFS);
963 if (!lp) {
964 error = -ENOMEM;
965 goto fail_brelse;
966 }
967
b3b94faa 968 /* Change the pointers */
b3b94faa
DT
969 for (x = 0; x < half_len; x++)
970 lp[x] = cpu_to_be64(bn);
971
cd915493
SW
972 error = gfs2_dir_write_data(dip, (char *)lp, start * sizeof(u64),
973 half_len * sizeof(u64));
974 if (error != half_len * sizeof(u64)) {
b3b94faa
DT
975 if (error >= 0)
976 error = -EIO;
977 goto fail_lpfree;
978 }
979
980 kfree(lp);
981
982 /* Compute the divider */
9a004508 983 divider = (start + half_len) << (32 - dip->i_depth);
b3b94faa
DT
984
985 /* Copy the entries */
1579343a 986 dent = (struct gfs2_dirent *)(obh->b_data + sizeof(struct gfs2_leaf));
b3b94faa
DT
987
988 do {
989 next = dent;
990 if (dirent_next(dip, obh, &next))
991 next = NULL;
992
5e7d65cd 993 if (!gfs2_dirent_sentinel(dent) &&
b3b94faa 994 be32_to_cpu(dent->de_hash) < divider) {
c752666c
SW
995 struct qstr str;
996 str.name = (char*)(dent+1);
997 str.len = be16_to_cpu(dent->de_name_len);
998 str.hash = be32_to_cpu(dent->de_hash);
71b86f56 999 new = gfs2_dirent_alloc(inode, nbh, &str);
c752666c
SW
1000 if (IS_ERR(new)) {
1001 error = PTR_ERR(new);
1002 break;
1003 }
b3b94faa
DT
1004
1005 new->de_inum = dent->de_inum; /* No endian worries */
b3b94faa 1006 new->de_type = dent->de_type; /* No endian worries */
bb16b342 1007 be16_add_cpu(&nleaf->lf_entries, 1);
b3b94faa
DT
1008
1009 dirent_del(dip, obh, prev, dent);
1010
1011 if (!oleaf->lf_entries)
1012 gfs2_consist_inode(dip);
bb16b342 1013 be16_add_cpu(&oleaf->lf_entries, -1);
b3b94faa
DT
1014
1015 if (!prev)
1016 prev = dent;
1017
1018 moved = 1;
c752666c 1019 } else {
b3b94faa 1020 prev = dent;
c752666c 1021 }
b3b94faa 1022 dent = next;
c752666c 1023 } while (dent);
b3b94faa 1024
c752666c 1025 oleaf->lf_depth = nleaf->lf_depth;
b3b94faa
DT
1026
1027 error = gfs2_meta_inode_buffer(dip, &dibh);
feaa7bba 1028 if (!gfs2_assert_withdraw(GFS2_SB(&dip->i_inode), !error)) {
382e6e25 1029 gfs2_trans_add_bh(dip->i_gl, dibh, 1);
77658aad 1030 gfs2_add_inode_blocks(&dip->i_inode, 1);
539e5d6b 1031 gfs2_dinode_out(dip, dibh->b_data);
b3b94faa
DT
1032 brelse(dibh);
1033 }
1034
1035 brelse(obh);
1036 brelse(nbh);
1037
1038 return error;
1039
e90deff5 1040fail_lpfree:
b3b94faa
DT
1041 kfree(lp);
1042
e90deff5 1043fail_brelse:
b3b94faa 1044 brelse(obh);
b3b94faa
DT
1045 brelse(nbh);
1046 return error;
1047}
1048
1049/**
1050 * dir_double_exhash - Double size of ExHash table
1051 * @dip: The GFS2 dinode
1052 *
1053 * Returns: 0 on success, error code on failure
1054 */
1055
1056static int dir_double_exhash(struct gfs2_inode *dip)
1057{
feaa7bba 1058 struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
b3b94faa 1059 struct buffer_head *dibh;
cd915493
SW
1060 u32 hsize;
1061 u64 *buf;
1062 u64 *from, *to;
1063 u64 block;
a2e0f799 1064 u64 disksize = i_size_read(&dip->i_inode);
b3b94faa
DT
1065 int x;
1066 int error = 0;
1067
9a004508 1068 hsize = 1 << dip->i_depth;
a2e0f799 1069 if (hsize * sizeof(u64) != disksize) {
b3b94faa
DT
1070 gfs2_consist_inode(dip);
1071 return -EIO;
1072 }
1073
1074 /* Allocate both the "from" and "to" buffers in one big chunk */
1075
4244b52e
DR
1076 buf = kcalloc(3, sdp->sd_hash_bsize, GFP_NOFS);
1077 if (!buf)
1078 return -ENOMEM;
b3b94faa 1079
a2e0f799 1080 for (block = disksize >> sdp->sd_hash_bsize_shift; block--;) {
e13940ba 1081 error = gfs2_dir_read_data(dip, (char *)buf,
b3b94faa 1082 block * sdp->sd_hash_bsize,
7276b3b0 1083 sdp->sd_hash_bsize, 1);
b3b94faa
DT
1084 if (error != sdp->sd_hash_bsize) {
1085 if (error >= 0)
1086 error = -EIO;
1087 goto fail;
1088 }
1089
1090 from = buf;
cd915493 1091 to = (u64 *)((char *)buf + sdp->sd_hash_bsize);
b3b94faa
DT
1092
1093 for (x = sdp->sd_hash_ptrs; x--; from++) {
1094 *to++ = *from; /* No endianess worries */
1095 *to++ = *from;
1096 }
1097
e13940ba 1098 error = gfs2_dir_write_data(dip,
b3b94faa
DT
1099 (char *)buf + sdp->sd_hash_bsize,
1100 block * sdp->sd_sb.sb_bsize,
1101 sdp->sd_sb.sb_bsize);
1102 if (error != sdp->sd_sb.sb_bsize) {
1103 if (error >= 0)
1104 error = -EIO;
1105 goto fail;
1106 }
1107 }
1108
1109 kfree(buf);
1110
1111 error = gfs2_meta_inode_buffer(dip, &dibh);
1112 if (!gfs2_assert_withdraw(sdp, !error)) {
9a004508 1113 dip->i_depth++;
539e5d6b 1114 gfs2_dinode_out(dip, dibh->b_data);
b3b94faa
DT
1115 brelse(dibh);
1116 }
1117
1118 return error;
1119
a91ea69f 1120fail:
b3b94faa 1121 kfree(buf);
b3b94faa
DT
1122 return error;
1123}
1124
1125/**
1126 * compare_dents - compare directory entries by hash value
1127 * @a: first dent
1128 * @b: second dent
1129 *
1130 * When comparing the hash entries of @a to @b:
1131 * gt: returns 1
1132 * lt: returns -1
1133 * eq: returns 0
1134 */
1135
1136static int compare_dents(const void *a, const void *b)
1137{
2bdbc5d7 1138 const struct gfs2_dirent *dent_a, *dent_b;
cd915493 1139 u32 hash_a, hash_b;
b3b94faa
DT
1140 int ret = 0;
1141
2bdbc5d7 1142 dent_a = *(const struct gfs2_dirent **)a;
c752666c 1143 hash_a = be32_to_cpu(dent_a->de_hash);
b3b94faa 1144
2bdbc5d7 1145 dent_b = *(const struct gfs2_dirent **)b;
c752666c 1146 hash_b = be32_to_cpu(dent_b->de_hash);
b3b94faa
DT
1147
1148 if (hash_a > hash_b)
1149 ret = 1;
1150 else if (hash_a < hash_b)
1151 ret = -1;
1152 else {
4dd651ad
SW
1153 unsigned int len_a = be16_to_cpu(dent_a->de_name_len);
1154 unsigned int len_b = be16_to_cpu(dent_b->de_name_len);
b3b94faa
DT
1155
1156 if (len_a > len_b)
1157 ret = 1;
1158 else if (len_a < len_b)
1159 ret = -1;
1160 else
2bdbc5d7 1161 ret = memcmp(dent_a + 1, dent_b + 1, len_a);
b3b94faa
DT
1162 }
1163
1164 return ret;
1165}
1166
1167/**
1168 * do_filldir_main - read out directory entries
1169 * @dip: The GFS2 inode
1170 * @offset: The offset in the file to read from
1171 * @opaque: opaque data to pass to filldir
1172 * @filldir: The function to pass entries to
1173 * @darr: an array of struct gfs2_dirent pointers to read
1174 * @entries: the number of entries in darr
1175 * @copied: pointer to int that's non-zero if a entry has been copied out
1176 *
1177 * Jump through some hoops to make sure that if there are hash collsions,
1178 * they are read out at the beginning of a buffer. We want to minimize
1179 * the possibility that they will fall into different readdir buffers or
1180 * that someone will want to seek to that location.
1181 *
1182 * Returns: errno, >0 on exception from filldir
1183 */
1184
cd915493 1185static int do_filldir_main(struct gfs2_inode *dip, u64 *offset,
3699e3a4 1186 void *opaque, filldir_t filldir,
cd915493 1187 const struct gfs2_dirent **darr, u32 entries,
b3b94faa
DT
1188 int *copied)
1189{
71b86f56 1190 const struct gfs2_dirent *dent, *dent_next;
cd915493 1191 u64 off, off_next;
b3b94faa
DT
1192 unsigned int x, y;
1193 int run = 0;
1194 int error = 0;
1195
1196 sort(darr, entries, sizeof(struct gfs2_dirent *), compare_dents, NULL);
1197
1198 dent_next = darr[0];
1199 off_next = be32_to_cpu(dent_next->de_hash);
1200 off_next = gfs2_disk_hash2offset(off_next);
1201
1202 for (x = 0, y = 1; x < entries; x++, y++) {
1203 dent = dent_next;
1204 off = off_next;
1205
1206 if (y < entries) {
1207 dent_next = darr[y];
1208 off_next = be32_to_cpu(dent_next->de_hash);
1209 off_next = gfs2_disk_hash2offset(off_next);
1210
1211 if (off < *offset)
1212 continue;
1213 *offset = off;
1214
1215 if (off_next == off) {
1216 if (*copied && !run)
1217 return 1;
1218 run = 1;
1219 } else
1220 run = 0;
1221 } else {
1222 if (off < *offset)
1223 continue;
1224 *offset = off;
1225 }
1226
2bdbc5d7 1227 error = filldir(opaque, (const char *)(dent + 1),
4dd651ad 1228 be16_to_cpu(dent->de_name_len),
3699e3a4 1229 off, be64_to_cpu(dent->de_inum.no_addr),
4dd651ad 1230 be16_to_cpu(dent->de_type));
b3b94faa
DT
1231 if (error)
1232 return 1;
1233
1234 *copied = 1;
1235 }
1236
1237 /* Increment the *offset by one, so the next time we come into the
1238 do_filldir fxn, we get the next entry instead of the last one in the
1239 current leaf */
1240
1241 (*offset)++;
1242
1243 return 0;
1244}
1245
d2a97a4e
SW
1246static void *gfs2_alloc_sort_buffer(unsigned size)
1247{
1248 void *ptr = NULL;
1249
1250 if (size < KMALLOC_MAX_SIZE)
1251 ptr = kmalloc(size, GFP_NOFS | __GFP_NOWARN);
1252 if (!ptr)
1253 ptr = __vmalloc(size, GFP_NOFS, PAGE_KERNEL);
1254 return ptr;
1255}
1256
1257static void gfs2_free_sort_buffer(void *ptr)
1258{
1259 if (is_vmalloc_addr(ptr))
1260 vfree(ptr);
1261 else
1262 kfree(ptr);
1263}
1264
71b86f56 1265static int gfs2_dir_read_leaf(struct inode *inode, u64 *offset, void *opaque,
3699e3a4
SW
1266 filldir_t filldir, int *copied, unsigned *depth,
1267 u64 leaf_no)
b3b94faa 1268{
feaa7bba 1269 struct gfs2_inode *ip = GFS2_I(inode);
bdd19a22 1270 struct gfs2_sbd *sdp = GFS2_SB(inode);
71b86f56
SW
1271 struct buffer_head *bh;
1272 struct gfs2_leaf *lf;
bdd19a22 1273 unsigned entries = 0, entries2 = 0;
71b86f56
SW
1274 unsigned leaves = 0;
1275 const struct gfs2_dirent **darr, *dent;
1276 struct dirent_gather g;
1277 struct buffer_head **larr;
1278 int leaf = 0;
1279 int error, i;
1280 u64 lfn = leaf_no;
b3b94faa 1281
b3b94faa 1282 do {
71b86f56 1283 error = get_leaf(ip, lfn, &bh);
b3b94faa 1284 if (error)
71b86f56
SW
1285 goto out;
1286 lf = (struct gfs2_leaf *)bh->b_data;
1287 if (leaves == 0)
1288 *depth = be16_to_cpu(lf->lf_depth);
1289 entries += be16_to_cpu(lf->lf_entries);
1290 leaves++;
1291 lfn = be64_to_cpu(lf->lf_next);
1292 brelse(bh);
1293 } while(lfn);
b3b94faa
DT
1294
1295 if (!entries)
1296 return 0;
1297
71b86f56 1298 error = -ENOMEM;
bdd19a22
SW
1299 /*
1300 * The extra 99 entries are not normally used, but are a buffer
1301 * zone in case the number of entries in the leaf is corrupt.
1302 * 99 is the maximum number of entries that can fit in a single
1303 * leaf block.
1304 */
d2a97a4e 1305 larr = gfs2_alloc_sort_buffer((leaves + entries + 99) * sizeof(void *));
71b86f56
SW
1306 if (!larr)
1307 goto out;
1308 darr = (const struct gfs2_dirent **)(larr + leaves);
1309 g.pdent = darr;
1310 g.offset = 0;
1311 lfn = leaf_no;
b3b94faa 1312
71b86f56
SW
1313 do {
1314 error = get_leaf(ip, lfn, &bh);
b3b94faa 1315 if (error)
d2a97a4e 1316 goto out_free;
71b86f56
SW
1317 lf = (struct gfs2_leaf *)bh->b_data;
1318 lfn = be64_to_cpu(lf->lf_next);
1319 if (lf->lf_entries) {
bdd19a22 1320 entries2 += be16_to_cpu(lf->lf_entries);
71b86f56
SW
1321 dent = gfs2_dirent_scan(inode, bh->b_data, bh->b_size,
1322 gfs2_dirent_gather, NULL, &g);
1323 error = PTR_ERR(dent);
bdd19a22 1324 if (IS_ERR(dent))
d2a97a4e 1325 goto out_free;
bdd19a22 1326 if (entries2 != g.offset) {
f391a4ea 1327 fs_warn(sdp, "Number of entries corrupt in dir "
1328 "leaf %llu, entries2 (%u) != "
1329 "g.offset (%u)\n",
1330 (unsigned long long)bh->b_blocknr,
1331 entries2, g.offset);
bdd19a22
SW
1332
1333 error = -EIO;
d2a97a4e 1334 goto out_free;
71b86f56
SW
1335 }
1336 error = 0;
1337 larr[leaf++] = bh;
b3b94faa 1338 } else {
71b86f56 1339 brelse(bh);
b3b94faa 1340 }
71b86f56 1341 } while(lfn);
b3b94faa 1342
bdd19a22 1343 BUG_ON(entries2 != entries);
71b86f56 1344 error = do_filldir_main(ip, offset, opaque, filldir, darr,
b3b94faa 1345 entries, copied);
d2a97a4e 1346out_free:
71b86f56
SW
1347 for(i = 0; i < leaf; i++)
1348 brelse(larr[i]);
d2a97a4e 1349 gfs2_free_sort_buffer(larr);
71b86f56 1350out:
b3b94faa
DT
1351 return error;
1352}
1353
1354/**
c752666c
SW
1355 * dir_e_read - Reads the entries from a directory into a filldir buffer
1356 * @dip: dinode pointer
1357 * @offset: the hash of the last entry read shifted to the right once
1358 * @opaque: buffer for the filldir function to fill
1359 * @filldir: points to the filldir function to use
b3b94faa 1360 *
c752666c 1361 * Returns: errno
b3b94faa
DT
1362 */
1363
cd915493 1364static int dir_e_read(struct inode *inode, u64 *offset, void *opaque,
3699e3a4 1365 filldir_t filldir)
b3b94faa 1366{
feaa7bba
SW
1367 struct gfs2_inode *dip = GFS2_I(inode);
1368 struct gfs2_sbd *sdp = GFS2_SB(inode);
cd915493
SW
1369 u32 hsize, len = 0;
1370 u32 ht_offset, lp_offset, ht_offset_cur = -1;
1371 u32 hash, index;
b44b84d7 1372 __be64 *lp;
c752666c
SW
1373 int copied = 0;
1374 int error = 0;
4da3c646 1375 unsigned depth = 0;
b3b94faa 1376
9a004508 1377 hsize = 1 << dip->i_depth;
a2e0f799 1378 if (hsize * sizeof(u64) != i_size_read(inode)) {
b3b94faa
DT
1379 gfs2_consist_inode(dip);
1380 return -EIO;
1381 }
1382
1383 hash = gfs2_dir_offset2hash(*offset);
9a004508 1384 index = hash >> (32 - dip->i_depth);
b3b94faa 1385
16c5f06f 1386 lp = kmalloc(sdp->sd_hash_bsize, GFP_NOFS);
b3b94faa
DT
1387 if (!lp)
1388 return -ENOMEM;
1389
1390 while (index < hsize) {
1391 lp_offset = index & (sdp->sd_hash_ptrs - 1);
1392 ht_offset = index - lp_offset;
1393
1394 if (ht_offset_cur != ht_offset) {
e13940ba 1395 error = gfs2_dir_read_data(dip, (char *)lp,
b44b84d7 1396 ht_offset * sizeof(__be64),
7276b3b0 1397 sdp->sd_hash_bsize, 1);
b3b94faa
DT
1398 if (error != sdp->sd_hash_bsize) {
1399 if (error >= 0)
1400 error = -EIO;
1401 goto out;
1402 }
1403 ht_offset_cur = ht_offset;
1404 }
1405
71b86f56
SW
1406 error = gfs2_dir_read_leaf(inode, offset, opaque, filldir,
1407 &copied, &depth,
1408 be64_to_cpu(lp[lp_offset]));
b3b94faa 1409 if (error)
71b86f56 1410 break;
b3b94faa 1411
9a004508 1412 len = 1 << (dip->i_depth - depth);
b3b94faa
DT
1413 index = (index & ~(len - 1)) + len;
1414 }
1415
71b86f56 1416out:
b3b94faa 1417 kfree(lp);
71b86f56
SW
1418 if (error > 0)
1419 error = 0;
b3b94faa
DT
1420 return error;
1421}
1422
cd915493 1423int gfs2_dir_read(struct inode *inode, u64 *offset, void *opaque,
3699e3a4 1424 filldir_t filldir)
b3b94faa 1425{
feaa7bba 1426 struct gfs2_inode *dip = GFS2_I(inode);
bdd19a22 1427 struct gfs2_sbd *sdp = GFS2_SB(inode);
71b86f56
SW
1428 struct dirent_gather g;
1429 const struct gfs2_dirent **darr, *dent;
b3b94faa
DT
1430 struct buffer_head *dibh;
1431 int copied = 0;
1432 int error;
1433
ad6203f2 1434 if (!dip->i_entries)
71b86f56
SW
1435 return 0;
1436
383f01fb 1437 if (dip->i_diskflags & GFS2_DIF_EXHASH)
71b86f56
SW
1438 return dir_e_read(inode, offset, opaque, filldir);
1439
b3b94faa
DT
1440 if (!gfs2_is_stuffed(dip)) {
1441 gfs2_consist_inode(dip);
1442 return -EIO;
1443 }
1444
b3b94faa
DT
1445 error = gfs2_meta_inode_buffer(dip, &dibh);
1446 if (error)
1447 return error;
1448
71b86f56 1449 error = -ENOMEM;
bdd19a22 1450 /* 96 is max number of dirents which can be stuffed into an inode */
16c5f06f 1451 darr = kmalloc(96 * sizeof(struct gfs2_dirent *), GFP_NOFS);
71b86f56
SW
1452 if (darr) {
1453 g.pdent = darr;
1454 g.offset = 0;
1455 dent = gfs2_dirent_scan(inode, dibh->b_data, dibh->b_size,
1456 gfs2_dirent_gather, NULL, &g);
1457 if (IS_ERR(dent)) {
1458 error = PTR_ERR(dent);
1459 goto out;
1460 }
ad6203f2 1461 if (dip->i_entries != g.offset) {
bdd19a22 1462 fs_warn(sdp, "Number of entries corrupt in dir %llu, "
ad6203f2 1463 "ip->i_entries (%u) != g.offset (%u)\n",
dbb7cae2 1464 (unsigned long long)dip->i_no_addr,
ad6203f2 1465 dip->i_entries,
bdd19a22
SW
1466 g.offset);
1467 error = -EIO;
1468 goto out;
1469 }
71b86f56 1470 error = do_filldir_main(dip, offset, opaque, filldir, darr,
ad6203f2 1471 dip->i_entries, &copied);
71b86f56
SW
1472out:
1473 kfree(darr);
1474 }
1475
b3b94faa
DT
1476 if (error > 0)
1477 error = 0;
1478
1479 brelse(dibh);
1480
1481 return error;
1482}
1483
b3b94faa
DT
1484/**
1485 * gfs2_dir_search - Search a directory
1486 * @dip: The GFS2 inode
1487 * @filename:
1488 * @inode:
1489 *
1490 * This routine searches a directory for a file or another directory.
1491 * Assumes a glock is held on dip.
1492 *
1493 * Returns: errno
1494 */
1495
dbb7cae2 1496struct inode *gfs2_dir_search(struct inode *dir, const struct qstr *name)
b3b94faa 1497{
c752666c
SW
1498 struct buffer_head *bh;
1499 struct gfs2_dirent *dent;
dbb7cae2
SW
1500 struct inode *inode;
1501
1502 dent = gfs2_dirent_search(dir, name, gfs2_dirent_find, &bh);
1503 if (dent) {
1504 if (IS_ERR(dent))
e231c2ee 1505 return ERR_CAST(dent);
bb9bcf06
WC
1506 inode = gfs2_inode_lookup(dir->i_sb,
1507 be16_to_cpu(dent->de_type),
1508 be64_to_cpu(dent->de_inum.no_addr),
1a0eae88 1509 be64_to_cpu(dent->de_inum.no_formal_ino));
dbb7cae2
SW
1510 brelse(bh);
1511 return inode;
1512 }
1513 return ERR_PTR(-ENOENT);
1514}
1515
1516int gfs2_dir_check(struct inode *dir, const struct qstr *name,
1517 const struct gfs2_inode *ip)
1518{
1519 struct buffer_head *bh;
1520 struct gfs2_dirent *dent;
1521 int ret = -ENOENT;
c752666c
SW
1522
1523 dent = gfs2_dirent_search(dir, name, gfs2_dirent_find, &bh);
1524 if (dent) {
1525 if (IS_ERR(dent))
1526 return PTR_ERR(dent);
dbb7cae2
SW
1527 if (ip) {
1528 if (be64_to_cpu(dent->de_inum.no_addr) != ip->i_no_addr)
1529 goto out;
1530 if (be64_to_cpu(dent->de_inum.no_formal_ino) !=
1531 ip->i_no_formal_ino)
1532 goto out;
1533 if (unlikely(IF2DT(ip->i_inode.i_mode) !=
1534 be16_to_cpu(dent->de_type))) {
1535 gfs2_consist_inode(GFS2_I(dir));
1536 ret = -EIO;
1537 goto out;
1538 }
1539 }
1540 ret = 0;
1541out:
c752666c 1542 brelse(bh);
c752666c 1543 }
dbb7cae2 1544 return ret;
c752666c
SW
1545}
1546
1547static int dir_new_leaf(struct inode *inode, const struct qstr *name)
1548{
1549 struct buffer_head *bh, *obh;
feaa7bba 1550 struct gfs2_inode *ip = GFS2_I(inode);
c752666c 1551 struct gfs2_leaf *leaf, *oleaf;
b3b94faa 1552 int error;
c752666c
SW
1553 u32 index;
1554 u64 bn;
b3b94faa 1555
9a004508 1556 index = name->hash >> (32 - ip->i_depth);
c752666c
SW
1557 error = get_first_leaf(ip, index, &obh);
1558 if (error)
1559 return error;
1560 do {
1561 oleaf = (struct gfs2_leaf *)obh->b_data;
1562 bn = be64_to_cpu(oleaf->lf_next);
1563 if (!bn)
1564 break;
1565 brelse(obh);
1566 error = get_leaf(ip, bn, &obh);
1567 if (error)
1568 return error;
1569 } while(1);
b3b94faa 1570
c752666c
SW
1571 gfs2_trans_add_bh(ip->i_gl, obh, 1);
1572
1573 leaf = new_leaf(inode, &bh, be16_to_cpu(oleaf->lf_depth));
1574 if (!leaf) {
1575 brelse(obh);
1576 return -ENOSPC;
1577 }
4d8012b6 1578 oleaf->lf_next = cpu_to_be64(bh->b_blocknr);
c752666c
SW
1579 brelse(bh);
1580 brelse(obh);
1581
1582 error = gfs2_meta_inode_buffer(ip, &bh);
1583 if (error)
1584 return error;
1585 gfs2_trans_add_bh(ip->i_gl, bh, 1);
77658aad 1586 gfs2_add_inode_blocks(&ip->i_inode, 1);
539e5d6b 1587 gfs2_dinode_out(ip, bh->b_data);
c752666c
SW
1588 brelse(bh);
1589 return 0;
b3b94faa
DT
1590}
1591
1592/**
1593 * gfs2_dir_add - Add new filename into directory
1594 * @dip: The GFS2 inode
1595 * @filename: The new name
1596 * @inode: The inode number of the entry
1597 * @type: The type of the entry
1598 *
1599 * Returns: 0 on success, error code on failure
1600 */
1601
c752666c 1602int gfs2_dir_add(struct inode *inode, const struct qstr *name,
dbb7cae2 1603 const struct gfs2_inode *nip, unsigned type)
b3b94faa 1604{
feaa7bba 1605 struct gfs2_inode *ip = GFS2_I(inode);
c752666c
SW
1606 struct buffer_head *bh;
1607 struct gfs2_dirent *dent;
1608 struct gfs2_leaf *leaf;
b3b94faa
DT
1609 int error;
1610
c752666c
SW
1611 while(1) {
1612 dent = gfs2_dirent_search(inode, name, gfs2_dirent_find_space,
1613 &bh);
1614 if (dent) {
1615 if (IS_ERR(dent))
1616 return PTR_ERR(dent);
1617 dent = gfs2_init_dirent(inode, dent, name, bh);
dbb7cae2 1618 gfs2_inum_out(nip, dent);
c752666c 1619 dent->de_type = cpu_to_be16(type);
383f01fb 1620 if (ip->i_diskflags & GFS2_DIF_EXHASH) {
c752666c 1621 leaf = (struct gfs2_leaf *)bh->b_data;
bb16b342 1622 be16_add_cpu(&leaf->lf_entries, 1);
c752666c
SW
1623 }
1624 brelse(bh);
1625 error = gfs2_meta_inode_buffer(ip, &bh);
1626 if (error)
1627 break;
1628 gfs2_trans_add_bh(ip->i_gl, bh, 1);
ad6203f2 1629 ip->i_entries++;
4bd91ba1 1630 ip->i_inode.i_mtime = ip->i_inode.i_ctime = CURRENT_TIME;
539e5d6b 1631 gfs2_dinode_out(ip, bh->b_data);
c752666c
SW
1632 brelse(bh);
1633 error = 0;
1634 break;
1635 }
383f01fb 1636 if (!(ip->i_diskflags & GFS2_DIF_EXHASH)) {
c752666c
SW
1637 error = dir_make_exhash(inode);
1638 if (error)
1639 break;
1640 continue;
1641 }
1642 error = dir_split_leaf(inode, name);
1643 if (error == 0)
1644 continue;
e90deff5 1645 if (error < 0)
c752666c 1646 break;
9a004508 1647 if (ip->i_depth < GFS2_DIR_MAX_DEPTH) {
c752666c
SW
1648 error = dir_double_exhash(ip);
1649 if (error)
1650 break;
1651 error = dir_split_leaf(inode, name);
e90deff5 1652 if (error < 0)
c752666c 1653 break;
e90deff5
SW
1654 if (error == 0)
1655 continue;
c752666c
SW
1656 }
1657 error = dir_new_leaf(inode, name);
1658 if (!error)
1659 continue;
1660 error = -ENOSPC;
1661 break;
1662 }
b3b94faa
DT
1663 return error;
1664}
1665
c752666c 1666
b3b94faa
DT
1667/**
1668 * gfs2_dir_del - Delete a directory entry
1669 * @dip: The GFS2 inode
1670 * @filename: The filename
1671 *
1672 * Returns: 0 on success, error code on failure
1673 */
1674
c752666c 1675int gfs2_dir_del(struct gfs2_inode *dip, const struct qstr *name)
b3b94faa 1676{
c752666c
SW
1677 struct gfs2_dirent *dent, *prev = NULL;
1678 struct buffer_head *bh;
b3b94faa
DT
1679 int error;
1680
c752666c
SW
1681 /* Returns _either_ the entry (if its first in block) or the
1682 previous entry otherwise */
feaa7bba 1683 dent = gfs2_dirent_search(&dip->i_inode, name, gfs2_dirent_prev, &bh);
c752666c
SW
1684 if (!dent) {
1685 gfs2_consist_inode(dip);
1686 return -EIO;
1687 }
1688 if (IS_ERR(dent)) {
1689 gfs2_consist_inode(dip);
1690 return PTR_ERR(dent);
1691 }
1692 /* If not first in block, adjust pointers accordingly */
71b86f56 1693 if (gfs2_dirent_find(dent, name, NULL) == 0) {
c752666c
SW
1694 prev = dent;
1695 dent = (struct gfs2_dirent *)((char *)dent + be16_to_cpu(prev->de_rec_len));
1696 }
1697
1698 dirent_del(dip, bh, prev, dent);
383f01fb 1699 if (dip->i_diskflags & GFS2_DIF_EXHASH) {
c752666c
SW
1700 struct gfs2_leaf *leaf = (struct gfs2_leaf *)bh->b_data;
1701 u16 entries = be16_to_cpu(leaf->lf_entries);
1702 if (!entries)
1703 gfs2_consist_inode(dip);
1704 leaf->lf_entries = cpu_to_be16(--entries);
c752666c 1705 }
ed386507 1706 brelse(bh);
c752666c
SW
1707
1708 error = gfs2_meta_inode_buffer(dip, &bh);
1709 if (error)
1710 return error;
1711
ad6203f2 1712 if (!dip->i_entries)
c752666c
SW
1713 gfs2_consist_inode(dip);
1714 gfs2_trans_add_bh(dip->i_gl, bh, 1);
ad6203f2 1715 dip->i_entries--;
4bd91ba1 1716 dip->i_inode.i_mtime = dip->i_inode.i_ctime = CURRENT_TIME;
539e5d6b 1717 gfs2_dinode_out(dip, bh->b_data);
c752666c 1718 brelse(bh);
feaa7bba 1719 mark_inode_dirty(&dip->i_inode);
b3b94faa
DT
1720
1721 return error;
1722}
1723
b3b94faa
DT
1724/**
1725 * gfs2_dir_mvino - Change inode number of directory entry
1726 * @dip: The GFS2 inode
1727 * @filename:
1728 * @new_inode:
1729 *
1730 * This routine changes the inode number of a directory entry. It's used
1731 * by rename to change ".." when a directory is moved.
1732 * Assumes a glock is held on dvp.
1733 *
1734 * Returns: errno
1735 */
1736
c752666c 1737int gfs2_dir_mvino(struct gfs2_inode *dip, const struct qstr *filename,
dbb7cae2 1738 const struct gfs2_inode *nip, unsigned int new_type)
b3b94faa 1739{
c752666c
SW
1740 struct buffer_head *bh;
1741 struct gfs2_dirent *dent;
b3b94faa
DT
1742 int error;
1743
feaa7bba 1744 dent = gfs2_dirent_search(&dip->i_inode, filename, gfs2_dirent_find, &bh);
c752666c
SW
1745 if (!dent) {
1746 gfs2_consist_inode(dip);
1747 return -EIO;
1748 }
1749 if (IS_ERR(dent))
1750 return PTR_ERR(dent);
b3b94faa 1751
c752666c 1752 gfs2_trans_add_bh(dip->i_gl, bh, 1);
dbb7cae2 1753 gfs2_inum_out(nip, dent);
c752666c
SW
1754 dent->de_type = cpu_to_be16(new_type);
1755
383f01fb 1756 if (dip->i_diskflags & GFS2_DIF_EXHASH) {
c752666c
SW
1757 brelse(bh);
1758 error = gfs2_meta_inode_buffer(dip, &bh);
1759 if (error)
1760 return error;
1761 gfs2_trans_add_bh(dip->i_gl, bh, 1);
1762 }
1763
4bd91ba1 1764 dip->i_inode.i_mtime = dip->i_inode.i_ctime = CURRENT_TIME;
539e5d6b 1765 gfs2_dinode_out(dip, bh->b_data);
c752666c
SW
1766 brelse(bh);
1767 return 0;
b3b94faa
DT
1768}
1769
1770/**
1771 * foreach_leaf - call a function for each leaf in a directory
1772 * @dip: the directory
1773 * @lc: the function to call for each each
1774 * @data: private data to pass to it
1775 *
1776 * Returns: errno
1777 */
1778
1779static int foreach_leaf(struct gfs2_inode *dip, leaf_call_t lc, void *data)
1780{
feaa7bba 1781 struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
b3b94faa 1782 struct buffer_head *bh;
c752666c 1783 struct gfs2_leaf *leaf;
cd915493
SW
1784 u32 hsize, len;
1785 u32 ht_offset, lp_offset, ht_offset_cur = -1;
1786 u32 index = 0;
b44b84d7 1787 __be64 *lp;
cd915493 1788 u64 leaf_no;
b3b94faa
DT
1789 int error = 0;
1790
9a004508 1791 hsize = 1 << dip->i_depth;
a2e0f799 1792 if (hsize * sizeof(u64) != i_size_read(&dip->i_inode)) {
b3b94faa
DT
1793 gfs2_consist_inode(dip);
1794 return -EIO;
1795 }
1796
16c5f06f 1797 lp = kmalloc(sdp->sd_hash_bsize, GFP_NOFS);
b3b94faa
DT
1798 if (!lp)
1799 return -ENOMEM;
1800
1801 while (index < hsize) {
1802 lp_offset = index & (sdp->sd_hash_ptrs - 1);
1803 ht_offset = index - lp_offset;
1804
1805 if (ht_offset_cur != ht_offset) {
e13940ba 1806 error = gfs2_dir_read_data(dip, (char *)lp,
b44b84d7 1807 ht_offset * sizeof(__be64),
7276b3b0 1808 sdp->sd_hash_bsize, 1);
b3b94faa
DT
1809 if (error != sdp->sd_hash_bsize) {
1810 if (error >= 0)
1811 error = -EIO;
1812 goto out;
1813 }
1814 ht_offset_cur = ht_offset;
1815 }
1816
1817 leaf_no = be64_to_cpu(lp[lp_offset]);
1818 if (leaf_no) {
1819 error = get_leaf(dip, leaf_no, &bh);
1820 if (error)
1821 goto out;
c752666c 1822 leaf = (struct gfs2_leaf *)bh->b_data;
9a004508 1823 len = 1 << (dip->i_depth - be16_to_cpu(leaf->lf_depth));
634ee0b9 1824 brelse(bh);
b3b94faa
DT
1825
1826 error = lc(dip, index, len, leaf_no, data);
1827 if (error)
1828 goto out;
1829
1830 index = (index & ~(len - 1)) + len;
1831 } else
1832 index++;
1833 }
1834
1835 if (index != hsize) {
1836 gfs2_consist_inode(dip);
1837 error = -EIO;
1838 }
1839
634ee0b9 1840out:
b3b94faa
DT
1841 kfree(lp);
1842
1843 return error;
1844}
1845
1846/**
1847 * leaf_dealloc - Deallocate a directory leaf
1848 * @dip: the directory
1849 * @index: the hash table offset in the directory
1850 * @len: the number of pointers to this leaf
1851 * @leaf_no: the leaf number
1852 * @data: not used
1853 *
1854 * Returns: errno
1855 */
1856
cd915493
SW
1857static int leaf_dealloc(struct gfs2_inode *dip, u32 index, u32 len,
1858 u64 leaf_no, void *data)
b3b94faa 1859{
feaa7bba 1860 struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
c752666c 1861 struct gfs2_leaf *tmp_leaf;
b3b94faa
DT
1862 struct gfs2_rgrp_list rlist;
1863 struct buffer_head *bh, *dibh;
cd915493 1864 u64 blk, nblk;
b3b94faa
DT
1865 unsigned int rg_blocks = 0, l_blocks = 0;
1866 char *ht;
cd915493 1867 unsigned int x, size = len * sizeof(u64);
b3b94faa
DT
1868 int error;
1869
1870 memset(&rlist, 0, sizeof(struct gfs2_rgrp_list));
1871
16c5f06f 1872 ht = kzalloc(size, GFP_NOFS);
b3b94faa
DT
1873 if (!ht)
1874 return -ENOMEM;
1875
182fe5ab
CG
1876 if (!gfs2_alloc_get(dip)) {
1877 error = -ENOMEM;
1878 goto out;
1879 }
b3b94faa
DT
1880
1881 error = gfs2_quota_hold(dip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
1882 if (error)
182fe5ab 1883 goto out_put;
b3b94faa 1884
6dbd8224 1885 error = gfs2_rindex_hold(sdp, &dip->i_alloc->al_ri_gh);
b3b94faa
DT
1886 if (error)
1887 goto out_qs;
1888
1889 /* Count the number of leaves */
1890
c752666c 1891 for (blk = leaf_no; blk; blk = nblk) {
b3b94faa
DT
1892 error = get_leaf(dip, blk, &bh);
1893 if (error)
1894 goto out_rlist;
c752666c
SW
1895 tmp_leaf = (struct gfs2_leaf *)bh->b_data;
1896 nblk = be64_to_cpu(tmp_leaf->lf_next);
b3b94faa
DT
1897 brelse(bh);
1898
1899 gfs2_rlist_add(sdp, &rlist, blk);
1900 l_blocks++;
1901 }
1902
fe6c991c 1903 gfs2_rlist_alloc(&rlist, LM_ST_EXCLUSIVE);
b3b94faa
DT
1904
1905 for (x = 0; x < rlist.rl_rgrps; x++) {
1906 struct gfs2_rgrpd *rgd;
5c676f6d 1907 rgd = rlist.rl_ghs[x].gh_gl->gl_object;
bb8d8a6f 1908 rg_blocks += rgd->rd_length;
b3b94faa
DT
1909 }
1910
1911 error = gfs2_glock_nq_m(rlist.rl_rgrps, rlist.rl_ghs);
1912 if (error)
1913 goto out_rlist;
1914
1915 error = gfs2_trans_begin(sdp,
5c676f6d 1916 rg_blocks + (DIV_ROUND_UP(size, sdp->sd_jbsize) + 1) +
b3b94faa
DT
1917 RES_DINODE + RES_STATFS + RES_QUOTA, l_blocks);
1918 if (error)
1919 goto out_rg_gunlock;
1920
c752666c 1921 for (blk = leaf_no; blk; blk = nblk) {
b3b94faa
DT
1922 error = get_leaf(dip, blk, &bh);
1923 if (error)
1924 goto out_end_trans;
c752666c
SW
1925 tmp_leaf = (struct gfs2_leaf *)bh->b_data;
1926 nblk = be64_to_cpu(tmp_leaf->lf_next);
b3b94faa
DT
1927 brelse(bh);
1928
1929 gfs2_free_meta(dip, blk, 1);
77658aad 1930 gfs2_add_inode_blocks(&dip->i_inode, -1);
b3b94faa
DT
1931 }
1932
cd915493 1933 error = gfs2_dir_write_data(dip, ht, index * sizeof(u64), size);
b3b94faa
DT
1934 if (error != size) {
1935 if (error >= 0)
1936 error = -EIO;
1937 goto out_end_trans;
1938 }
1939
1940 error = gfs2_meta_inode_buffer(dip, &dibh);
1941 if (error)
1942 goto out_end_trans;
1943
d4e9c4c3 1944 gfs2_trans_add_bh(dip->i_gl, dibh, 1);
539e5d6b 1945 gfs2_dinode_out(dip, dibh->b_data);
b3b94faa
DT
1946 brelse(dibh);
1947
a91ea69f 1948out_end_trans:
b3b94faa 1949 gfs2_trans_end(sdp);
a91ea69f 1950out_rg_gunlock:
b3b94faa 1951 gfs2_glock_dq_m(rlist.rl_rgrps, rlist.rl_ghs);
a91ea69f 1952out_rlist:
b3b94faa 1953 gfs2_rlist_free(&rlist);
6dbd8224 1954 gfs2_glock_dq_uninit(&dip->i_alloc->al_ri_gh);
a91ea69f 1955out_qs:
b3b94faa 1956 gfs2_quota_unhold(dip);
182fe5ab 1957out_put:
b3b94faa 1958 gfs2_alloc_put(dip);
182fe5ab 1959out:
b3b94faa 1960 kfree(ht);
b3b94faa
DT
1961 return error;
1962}
1963
1964/**
1965 * gfs2_dir_exhash_dealloc - free all the leaf blocks in a directory
1966 * @dip: the directory
1967 *
1968 * Dealloc all on-disk directory leaves to FREEMETA state
1969 * Change on-disk inode type to "regular file"
1970 *
1971 * Returns: errno
1972 */
1973
1974int gfs2_dir_exhash_dealloc(struct gfs2_inode *dip)
1975{
feaa7bba 1976 struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
b3b94faa
DT
1977 struct buffer_head *bh;
1978 int error;
1979
1980 /* Dealloc on-disk leaves to FREEMETA state */
1981 error = foreach_leaf(dip, leaf_dealloc, NULL);
1982 if (error)
1983 return error;
1984
1985 /* Make this a regular file in case we crash.
1986 (We don't want to free these blocks a second time.) */
1987
1988 error = gfs2_trans_begin(sdp, RES_DINODE, 0);
1989 if (error)
1990 return error;
1991
1992 error = gfs2_meta_inode_buffer(dip, &bh);
1993 if (!error) {
d4e9c4c3 1994 gfs2_trans_add_bh(dip->i_gl, bh, 1);
568f4c96
SW
1995 ((struct gfs2_dinode *)bh->b_data)->di_mode =
1996 cpu_to_be32(S_IFREG);
b3b94faa
DT
1997 brelse(bh);
1998 }
1999
2000 gfs2_trans_end(sdp);
2001
2002 return error;
2003}
2004
2005/**
2006 * gfs2_diradd_alloc_required - find if adding entry will require an allocation
2007 * @ip: the file being written to
2008 * @filname: the filename that's going to be added
b3b94faa 2009 *
c752666c 2010 * Returns: 1 if alloc required, 0 if not, -ve on error
b3b94faa
DT
2011 */
2012
4d8012b6 2013int gfs2_diradd_alloc_required(struct inode *inode, const struct qstr *name)
b3b94faa 2014{
c752666c
SW
2015 struct gfs2_dirent *dent;
2016 struct buffer_head *bh;
b3b94faa 2017
c752666c 2018 dent = gfs2_dirent_search(inode, name, gfs2_dirent_find_space, &bh);
ed386507 2019 if (!dent) {
c752666c 2020 return 1;
ed386507 2021 }
c752666c
SW
2022 if (IS_ERR(dent))
2023 return PTR_ERR(dent);
2024 brelse(bh);
2025 return 0;
b3b94faa
DT
2026}
2027