OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [fs/] [ext3/] [namei.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 *  linux/fs/ext3/namei.c
3
 *
4
 * Copyright (C) 1992, 1993, 1994, 1995
5
 * Remy Card (card@masi.ibp.fr)
6
 * Laboratoire MASI - Institut Blaise Pascal
7
 * Universite Pierre et Marie Curie (Paris VI)
8
 *
9
 *  from
10
 *
11
 *  linux/fs/minix/namei.c
12
 *
13
 *  Copyright (C) 1991, 1992  Linus Torvalds
14
 *
15
 *  Big-endian to little-endian byte-swapping/bitmaps by
16
 *        David S. Miller (davem@caip.rutgers.edu), 1995
17
 *  Directory entry file type support and forward compatibility hooks
18
 *      for B-tree directories by Theodore Ts'o (tytso@mit.edu), 1998
19
 *  Hash Tree Directory indexing (c)
20
 *      Daniel Phillips, 2001
21
 *  Hash Tree Directory indexing porting
22
 *      Christopher Li, 2002
23
 *  Hash Tree Directory indexing cleanup
24
 *      Theodore Ts'o, 2002
25
 */
26
 
27
#include <linux/fs.h>
28
#include <linux/pagemap.h>
29
#include <linux/jbd.h>
30
#include <linux/time.h>
31
#include <linux/ext3_fs.h>
32
#include <linux/ext3_jbd.h>
33
#include <linux/fcntl.h>
34
#include <linux/stat.h>
35
#include <linux/string.h>
36
#include <linux/quotaops.h>
37
#include <linux/buffer_head.h>
38
#include <linux/bio.h>
39
 
40
#include "namei.h"
41
#include "xattr.h"
42
#include "acl.h"
43
 
44
/*
45
 * define how far ahead to read directories while searching them.
46
 */
47
#define NAMEI_RA_CHUNKS  2
48
#define NAMEI_RA_BLOCKS  4
49
#define NAMEI_RA_SIZE        (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS)
50
#define NAMEI_RA_INDEX(c,b)  (((c) * NAMEI_RA_BLOCKS) + (b))
51
 
52
static struct buffer_head *ext3_append(handle_t *handle,
53
                                        struct inode *inode,
54
                                        u32 *block, int *err)
55
{
56
        struct buffer_head *bh;
57
 
58
        *block = inode->i_size >> inode->i_sb->s_blocksize_bits;
59
 
60
        if ((bh = ext3_bread(handle, inode, *block, 1, err))) {
61
                inode->i_size += inode->i_sb->s_blocksize;
62
                EXT3_I(inode)->i_disksize = inode->i_size;
63
                ext3_journal_get_write_access(handle,bh);
64
        }
65
        return bh;
66
}
67
 
68
#ifndef assert
69
#define assert(test) J_ASSERT(test)
70
#endif
71
 
72
#ifndef swap
73
#define swap(x, y) do { typeof(x) z = x; x = y; y = z; } while (0)
74
#endif
75
 
76
#ifdef DX_DEBUG
77
#define dxtrace(command) command
78
#else
79
#define dxtrace(command)
80
#endif
81
 
82
struct fake_dirent
83
{
84
        __le32 inode;
85
        __le16 rec_len;
86
        u8 name_len;
87
        u8 file_type;
88
};
89
 
90
struct dx_countlimit
91
{
92
        __le16 limit;
93
        __le16 count;
94
};
95
 
96
struct dx_entry
97
{
98
        __le32 hash;
99
        __le32 block;
100
};
101
 
102
/*
103
 * dx_root_info is laid out so that if it should somehow get overlaid by a
104
 * dirent the two low bits of the hash version will be zero.  Therefore, the
105
 * hash version mod 4 should never be 0.  Sincerely, the paranoia department.
106
 */
107
 
108
struct dx_root
109
{
110
        struct fake_dirent dot;
111
        char dot_name[4];
112
        struct fake_dirent dotdot;
113
        char dotdot_name[4];
114
        struct dx_root_info
115
        {
116
                __le32 reserved_zero;
117
                u8 hash_version;
118
                u8 info_length; /* 8 */
119
                u8 indirect_levels;
120
                u8 unused_flags;
121
        }
122
        info;
123
        struct dx_entry entries[0];
124
};
125
 
126
struct dx_node
127
{
128
        struct fake_dirent fake;
129
        struct dx_entry entries[0];
130
};
131
 
132
 
133
struct dx_frame
134
{
135
        struct buffer_head *bh;
136
        struct dx_entry *entries;
137
        struct dx_entry *at;
138
};
139
 
140
struct dx_map_entry
141
{
142
        u32 hash;
143
        u16 offs;
144
        u16 size;
145
};
146
 
147
static inline unsigned dx_get_block (struct dx_entry *entry);
148
static void dx_set_block (struct dx_entry *entry, unsigned value);
149
static inline unsigned dx_get_hash (struct dx_entry *entry);
150
static void dx_set_hash (struct dx_entry *entry, unsigned value);
151
static unsigned dx_get_count (struct dx_entry *entries);
152
static unsigned dx_get_limit (struct dx_entry *entries);
153
static void dx_set_count (struct dx_entry *entries, unsigned value);
154
static void dx_set_limit (struct dx_entry *entries, unsigned value);
155
static unsigned dx_root_limit (struct inode *dir, unsigned infosize);
156
static unsigned dx_node_limit (struct inode *dir);
157
static struct dx_frame *dx_probe(struct dentry *dentry,
158
                                 struct inode *dir,
159
                                 struct dx_hash_info *hinfo,
160
                                 struct dx_frame *frame,
161
                                 int *err);
162
static void dx_release (struct dx_frame *frames);
163
static int dx_make_map (struct ext3_dir_entry_2 *de, int size,
164
                        struct dx_hash_info *hinfo, struct dx_map_entry map[]);
165
static void dx_sort_map(struct dx_map_entry *map, unsigned count);
166
static struct ext3_dir_entry_2 *dx_move_dirents (char *from, char *to,
167
                struct dx_map_entry *offsets, int count);
168
static struct ext3_dir_entry_2* dx_pack_dirents (char *base, int size);
169
static void dx_insert_block (struct dx_frame *frame, u32 hash, u32 block);
170
static int ext3_htree_next_block(struct inode *dir, __u32 hash,
171
                                 struct dx_frame *frame,
172
                                 struct dx_frame *frames,
173
                                 __u32 *start_hash);
174
static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry,
175
                       struct ext3_dir_entry_2 **res_dir, int *err);
176
static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry,
177
                             struct inode *inode);
178
 
179
/*
180
 * p is at least 6 bytes before the end of page
181
 */
182
static inline struct ext3_dir_entry_2 *
183
ext3_next_entry(struct ext3_dir_entry_2 *p)
184
{
185
        return (struct ext3_dir_entry_2 *)((char *)p +
186
                ext3_rec_len_from_disk(p->rec_len));
187
}
188
 
189
/*
190
 * Future: use high four bits of block for coalesce-on-delete flags
191
 * Mask them off for now.
192
 */
193
 
194
static inline unsigned dx_get_block (struct dx_entry *entry)
195
{
196
        return le32_to_cpu(entry->block) & 0x00ffffff;
197
}
198
 
199
static inline void dx_set_block (struct dx_entry *entry, unsigned value)
200
{
201
        entry->block = cpu_to_le32(value);
202
}
203
 
204
static inline unsigned dx_get_hash (struct dx_entry *entry)
205
{
206
        return le32_to_cpu(entry->hash);
207
}
208
 
209
static inline void dx_set_hash (struct dx_entry *entry, unsigned value)
210
{
211
        entry->hash = cpu_to_le32(value);
212
}
213
 
214
static inline unsigned dx_get_count (struct dx_entry *entries)
215
{
216
        return le16_to_cpu(((struct dx_countlimit *) entries)->count);
217
}
218
 
219
static inline unsigned dx_get_limit (struct dx_entry *entries)
220
{
221
        return le16_to_cpu(((struct dx_countlimit *) entries)->limit);
222
}
223
 
224
static inline void dx_set_count (struct dx_entry *entries, unsigned value)
225
{
226
        ((struct dx_countlimit *) entries)->count = cpu_to_le16(value);
227
}
228
 
229
static inline void dx_set_limit (struct dx_entry *entries, unsigned value)
230
{
231
        ((struct dx_countlimit *) entries)->limit = cpu_to_le16(value);
232
}
233
 
234
static inline unsigned dx_root_limit (struct inode *dir, unsigned infosize)
235
{
236
        unsigned entry_space = dir->i_sb->s_blocksize - EXT3_DIR_REC_LEN(1) -
237
                EXT3_DIR_REC_LEN(2) - infosize;
238
        return 0? 20: entry_space / sizeof(struct dx_entry);
239
}
240
 
241
static inline unsigned dx_node_limit (struct inode *dir)
242
{
243
        unsigned entry_space = dir->i_sb->s_blocksize - EXT3_DIR_REC_LEN(0);
244
        return 0? 22: entry_space / sizeof(struct dx_entry);
245
}
246
 
247
/*
248
 * Debug
249
 */
250
#ifdef DX_DEBUG
251
static void dx_show_index (char * label, struct dx_entry *entries)
252
{
253
        int i, n = dx_get_count (entries);
254
        printk("%s index ", label);
255
        for (i = 0; i < n; i++)
256
        {
257
                printk("%x->%u ", i? dx_get_hash(entries + i): 0, dx_get_block(entries + i));
258
        }
259
        printk("\n");
260
}
261
 
262
struct stats
263
{
264
        unsigned names;
265
        unsigned space;
266
        unsigned bcount;
267
};
268
 
269
static struct stats dx_show_leaf(struct dx_hash_info *hinfo, struct ext3_dir_entry_2 *de,
270
                                 int size, int show_names)
271
{
272
        unsigned names = 0, space = 0;
273
        char *base = (char *) de;
274
        struct dx_hash_info h = *hinfo;
275
 
276
        printk("names: ");
277
        while ((char *) de < base + size)
278
        {
279
                if (de->inode)
280
                {
281
                        if (show_names)
282
                        {
283
                                int len = de->name_len;
284
                                char *name = de->name;
285
                                while (len--) printk("%c", *name++);
286
                                ext3fs_dirhash(de->name, de->name_len, &h);
287
                                printk(":%x.%u ", h.hash,
288
                                       ((char *) de - base));
289
                        }
290
                        space += EXT3_DIR_REC_LEN(de->name_len);
291
                        names++;
292
                }
293
                de = ext3_next_entry(de);
294
        }
295
        printk("(%i)\n", names);
296
        return (struct stats) { names, space, 1 };
297
}
298
 
299
struct stats dx_show_entries(struct dx_hash_info *hinfo, struct inode *dir,
300
                             struct dx_entry *entries, int levels)
301
{
302
        unsigned blocksize = dir->i_sb->s_blocksize;
303
        unsigned count = dx_get_count (entries), names = 0, space = 0, i;
304
        unsigned bcount = 0;
305
        struct buffer_head *bh;
306
        int err;
307
        printk("%i indexed blocks...\n", count);
308
        for (i = 0; i < count; i++, entries++)
309
        {
310
                u32 block = dx_get_block(entries), hash = i? dx_get_hash(entries): 0;
311
                u32 range = i < count - 1? (dx_get_hash(entries + 1) - hash): ~hash;
312
                struct stats stats;
313
                printk("%s%3u:%03u hash %8x/%8x ",levels?"":"   ", i, block, hash, range);
314
                if (!(bh = ext3_bread (NULL,dir, block, 0,&err))) continue;
315
                stats = levels?
316
                   dx_show_entries(hinfo, dir, ((struct dx_node *) bh->b_data)->entries, levels - 1):
317
                   dx_show_leaf(hinfo, (struct ext3_dir_entry_2 *) bh->b_data, blocksize, 0);
318
                names += stats.names;
319
                space += stats.space;
320
                bcount += stats.bcount;
321
                brelse (bh);
322
        }
323
        if (bcount)
324
                printk("%snames %u, fullness %u (%u%%)\n", levels?"":"   ",
325
                        names, space/bcount,(space/bcount)*100/blocksize);
326
        return (struct stats) { names, space, bcount};
327
}
328
#endif /* DX_DEBUG */
329
 
330
/*
331
 * Probe for a directory leaf block to search.
332
 *
333
 * dx_probe can return ERR_BAD_DX_DIR, which means there was a format
334
 * error in the directory index, and the caller should fall back to
335
 * searching the directory normally.  The callers of dx_probe **MUST**
336
 * check for this error code, and make sure it never gets reflected
337
 * back to userspace.
338
 */
339
static struct dx_frame *
340
dx_probe(struct dentry *dentry, struct inode *dir,
341
         struct dx_hash_info *hinfo, struct dx_frame *frame_in, int *err)
342
{
343
        unsigned count, indirect;
344
        struct dx_entry *at, *entries, *p, *q, *m;
345
        struct dx_root *root;
346
        struct buffer_head *bh;
347
        struct dx_frame *frame = frame_in;
348
        u32 hash;
349
 
350
        frame->bh = NULL;
351
        if (dentry)
352
                dir = dentry->d_parent->d_inode;
353
        if (!(bh = ext3_bread (NULL,dir, 0, 0, err)))
354
                goto fail;
355
        root = (struct dx_root *) bh->b_data;
356
        if (root->info.hash_version != DX_HASH_TEA &&
357
            root->info.hash_version != DX_HASH_HALF_MD4 &&
358
            root->info.hash_version != DX_HASH_LEGACY) {
359
                ext3_warning(dir->i_sb, __FUNCTION__,
360
                             "Unrecognised inode hash code %d",
361
                             root->info.hash_version);
362
                brelse(bh);
363
                *err = ERR_BAD_DX_DIR;
364
                goto fail;
365
        }
366
        hinfo->hash_version = root->info.hash_version;
367
        hinfo->seed = EXT3_SB(dir->i_sb)->s_hash_seed;
368
        if (dentry)
369
                ext3fs_dirhash(dentry->d_name.name, dentry->d_name.len, hinfo);
370
        hash = hinfo->hash;
371
 
372
        if (root->info.unused_flags & 1) {
373
                ext3_warning(dir->i_sb, __FUNCTION__,
374
                             "Unimplemented inode hash flags: %#06x",
375
                             root->info.unused_flags);
376
                brelse(bh);
377
                *err = ERR_BAD_DX_DIR;
378
                goto fail;
379
        }
380
 
381
        if ((indirect = root->info.indirect_levels) > 1) {
382
                ext3_warning(dir->i_sb, __FUNCTION__,
383
                             "Unimplemented inode hash depth: %#06x",
384
                             root->info.indirect_levels);
385
                brelse(bh);
386
                *err = ERR_BAD_DX_DIR;
387
                goto fail;
388
        }
389
 
390
        entries = (struct dx_entry *) (((char *)&root->info) +
391
                                       root->info.info_length);
392
 
393
        if (dx_get_limit(entries) != dx_root_limit(dir,
394
                                                   root->info.info_length)) {
395
                ext3_warning(dir->i_sb, __FUNCTION__,
396
                             "dx entry: limit != root limit");
397
                brelse(bh);
398
                *err = ERR_BAD_DX_DIR;
399
                goto fail;
400
        }
401
 
402
        dxtrace (printk("Look up %x", hash));
403
        while (1)
404
        {
405
                count = dx_get_count(entries);
406
                if (!count || count > dx_get_limit(entries)) {
407
                        ext3_warning(dir->i_sb, __FUNCTION__,
408
                                     "dx entry: no count or count > limit");
409
                        brelse(bh);
410
                        *err = ERR_BAD_DX_DIR;
411
                        goto fail2;
412
                }
413
 
414
                p = entries + 1;
415
                q = entries + count - 1;
416
                while (p <= q)
417
                {
418
                        m = p + (q - p)/2;
419
                        dxtrace(printk("."));
420
                        if (dx_get_hash(m) > hash)
421
                                q = m - 1;
422
                        else
423
                                p = m + 1;
424
                }
425
 
426
                if (0) // linear search cross check
427
                {
428
                        unsigned n = count - 1;
429
                        at = entries;
430
                        while (n--)
431
                        {
432
                                dxtrace(printk(","));
433
                                if (dx_get_hash(++at) > hash)
434
                                {
435
                                        at--;
436
                                        break;
437
                                }
438
                        }
439
                        assert (at == p - 1);
440
                }
441
 
442
                at = p - 1;
443
                dxtrace(printk(" %x->%u\n", at == entries? 0: dx_get_hash(at), dx_get_block(at)));
444
                frame->bh = bh;
445
                frame->entries = entries;
446
                frame->at = at;
447
                if (!indirect--) return frame;
448
                if (!(bh = ext3_bread (NULL,dir, dx_get_block(at), 0, err)))
449
                        goto fail2;
450
                at = entries = ((struct dx_node *) bh->b_data)->entries;
451
                if (dx_get_limit(entries) != dx_node_limit (dir)) {
452
                        ext3_warning(dir->i_sb, __FUNCTION__,
453
                                     "dx entry: limit != node limit");
454
                        brelse(bh);
455
                        *err = ERR_BAD_DX_DIR;
456
                        goto fail2;
457
                }
458
                frame++;
459
                frame->bh = NULL;
460
        }
461
fail2:
462
        while (frame >= frame_in) {
463
                brelse(frame->bh);
464
                frame--;
465
        }
466
fail:
467
        if (*err == ERR_BAD_DX_DIR)
468
                ext3_warning(dir->i_sb, __FUNCTION__,
469
                             "Corrupt dir inode %ld, running e2fsck is "
470
                             "recommended.", dir->i_ino);
471
        return NULL;
472
}
473
 
474
static void dx_release (struct dx_frame *frames)
475
{
476
        if (frames[0].bh == NULL)
477
                return;
478
 
479
        if (((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels)
480
                brelse(frames[1].bh);
481
        brelse(frames[0].bh);
482
}
483
 
484
/*
485
 * This function increments the frame pointer to search the next leaf
486
 * block, and reads in the necessary intervening nodes if the search
487
 * should be necessary.  Whether or not the search is necessary is
488
 * controlled by the hash parameter.  If the hash value is even, then
489
 * the search is only continued if the next block starts with that
490
 * hash value.  This is used if we are searching for a specific file.
491
 *
492
 * If the hash value is HASH_NB_ALWAYS, then always go to the next block.
493
 *
494
 * This function returns 1 if the caller should continue to search,
495
 * or 0 if it should not.  If there is an error reading one of the
496
 * index blocks, it will a negative error code.
497
 *
498
 * If start_hash is non-null, it will be filled in with the starting
499
 * hash of the next page.
500
 */
501
static int ext3_htree_next_block(struct inode *dir, __u32 hash,
502
                                 struct dx_frame *frame,
503
                                 struct dx_frame *frames,
504
                                 __u32 *start_hash)
505
{
506
        struct dx_frame *p;
507
        struct buffer_head *bh;
508
        int err, num_frames = 0;
509
        __u32 bhash;
510
 
511
        p = frame;
512
        /*
513
         * Find the next leaf page by incrementing the frame pointer.
514
         * If we run out of entries in the interior node, loop around and
515
         * increment pointer in the parent node.  When we break out of
516
         * this loop, num_frames indicates the number of interior
517
         * nodes need to be read.
518
         */
519
        while (1) {
520
                if (++(p->at) < p->entries + dx_get_count(p->entries))
521
                        break;
522
                if (p == frames)
523
                        return 0;
524
                num_frames++;
525
                p--;
526
        }
527
 
528
        /*
529
         * If the hash is 1, then continue only if the next page has a
530
         * continuation hash of any value.  This is used for readdir
531
         * handling.  Otherwise, check to see if the hash matches the
532
         * desired contiuation hash.  If it doesn't, return since
533
         * there's no point to read in the successive index pages.
534
         */
535
        bhash = dx_get_hash(p->at);
536
        if (start_hash)
537
                *start_hash = bhash;
538
        if ((hash & 1) == 0) {
539
                if ((bhash & ~1) != hash)
540
                        return 0;
541
        }
542
        /*
543
         * If the hash is HASH_NB_ALWAYS, we always go to the next
544
         * block so no check is necessary
545
         */
546
        while (num_frames--) {
547
                if (!(bh = ext3_bread(NULL, dir, dx_get_block(p->at),
548
                                      0, &err)))
549
                        return err; /* Failure */
550
                p++;
551
                brelse (p->bh);
552
                p->bh = bh;
553
                p->at = p->entries = ((struct dx_node *) bh->b_data)->entries;
554
        }
555
        return 1;
556
}
557
 
558
 
559
/*
560
 * This function fills a red-black tree with information from a
561
 * directory block.  It returns the number directory entries loaded
562
 * into the tree.  If there is an error it is returned in err.
563
 */
564
static int htree_dirblock_to_tree(struct file *dir_file,
565
                                  struct inode *dir, int block,
566
                                  struct dx_hash_info *hinfo,
567
                                  __u32 start_hash, __u32 start_minor_hash)
568
{
569
        struct buffer_head *bh;
570
        struct ext3_dir_entry_2 *de, *top;
571
        int err, count = 0;
572
 
573
        dxtrace(printk("In htree dirblock_to_tree: block %d\n", block));
574
        if (!(bh = ext3_bread (NULL, dir, block, 0, &err)))
575
                return err;
576
 
577
        de = (struct ext3_dir_entry_2 *) bh->b_data;
578
        top = (struct ext3_dir_entry_2 *) ((char *) de +
579
                                           dir->i_sb->s_blocksize -
580
                                           EXT3_DIR_REC_LEN(0));
581
        for (; de < top; de = ext3_next_entry(de)) {
582
                if (!ext3_check_dir_entry("htree_dirblock_to_tree", dir, de, bh,
583
                                        (block<<EXT3_BLOCK_SIZE_BITS(dir->i_sb))
584
                                                +((char *)de - bh->b_data))) {
585
                        /* On error, skip the f_pos to the next block. */
586
                        dir_file->f_pos = (dir_file->f_pos |
587
                                        (dir->i_sb->s_blocksize - 1)) + 1;
588
                        brelse (bh);
589
                        return count;
590
                }
591
                ext3fs_dirhash(de->name, de->name_len, hinfo);
592
                if ((hinfo->hash < start_hash) ||
593
                    ((hinfo->hash == start_hash) &&
594
                     (hinfo->minor_hash < start_minor_hash)))
595
                        continue;
596
                if (de->inode == 0)
597
                        continue;
598
                if ((err = ext3_htree_store_dirent(dir_file,
599
                                   hinfo->hash, hinfo->minor_hash, de)) != 0) {
600
                        brelse(bh);
601
                        return err;
602
                }
603
                count++;
604
        }
605
        brelse(bh);
606
        return count;
607
}
608
 
609
 
610
/*
611
 * This function fills a red-black tree with information from a
612
 * directory.  We start scanning the directory in hash order, starting
613
 * at start_hash and start_minor_hash.
614
 *
615
 * This function returns the number of entries inserted into the tree,
616
 * or a negative error code.
617
 */
618
int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash,
619
                         __u32 start_minor_hash, __u32 *next_hash)
620
{
621
        struct dx_hash_info hinfo;
622
        struct ext3_dir_entry_2 *de;
623
        struct dx_frame frames[2], *frame;
624
        struct inode *dir;
625
        int block, err;
626
        int count = 0;
627
        int ret;
628
        __u32 hashval;
629
 
630
        dxtrace(printk("In htree_fill_tree, start hash: %x:%x\n", start_hash,
631
                       start_minor_hash));
632
        dir = dir_file->f_path.dentry->d_inode;
633
        if (!(EXT3_I(dir)->i_flags & EXT3_INDEX_FL)) {
634
                hinfo.hash_version = EXT3_SB(dir->i_sb)->s_def_hash_version;
635
                hinfo.seed = EXT3_SB(dir->i_sb)->s_hash_seed;
636
                count = htree_dirblock_to_tree(dir_file, dir, 0, &hinfo,
637
                                               start_hash, start_minor_hash);
638
                *next_hash = ~0;
639
                return count;
640
        }
641
        hinfo.hash = start_hash;
642
        hinfo.minor_hash = 0;
643
        frame = dx_probe(NULL, dir_file->f_path.dentry->d_inode, &hinfo, frames, &err);
644
        if (!frame)
645
                return err;
646
 
647
        /* Add '.' and '..' from the htree header */
648
        if (!start_hash && !start_minor_hash) {
649
                de = (struct ext3_dir_entry_2 *) frames[0].bh->b_data;
650
                if ((err = ext3_htree_store_dirent(dir_file, 0, 0, de)) != 0)
651
                        goto errout;
652
                count++;
653
        }
654
        if (start_hash < 2 || (start_hash ==2 && start_minor_hash==0)) {
655
                de = (struct ext3_dir_entry_2 *) frames[0].bh->b_data;
656
                de = ext3_next_entry(de);
657
                if ((err = ext3_htree_store_dirent(dir_file, 2, 0, de)) != 0)
658
                        goto errout;
659
                count++;
660
        }
661
 
662
        while (1) {
663
                block = dx_get_block(frame->at);
664
                ret = htree_dirblock_to_tree(dir_file, dir, block, &hinfo,
665
                                             start_hash, start_minor_hash);
666
                if (ret < 0) {
667
                        err = ret;
668
                        goto errout;
669
                }
670
                count += ret;
671
                hashval = ~0;
672
                ret = ext3_htree_next_block(dir, HASH_NB_ALWAYS,
673
                                            frame, frames, &hashval);
674
                *next_hash = hashval;
675
                if (ret < 0) {
676
                        err = ret;
677
                        goto errout;
678
                }
679
                /*
680
                 * Stop if:  (a) there are no more entries, or
681
                 * (b) we have inserted at least one entry and the
682
                 * next hash value is not a continuation
683
                 */
684
                if ((ret == 0) ||
685
                    (count && ((hashval & 1) == 0)))
686
                        break;
687
        }
688
        dx_release(frames);
689
        dxtrace(printk("Fill tree: returned %d entries, next hash: %x\n",
690
                       count, *next_hash));
691
        return count;
692
errout:
693
        dx_release(frames);
694
        return (err);
695
}
696
 
697
 
698
/*
699
 * Directory block splitting, compacting
700
 */
701
 
702
/*
703
 * Create map of hash values, offsets, and sizes, stored at end of block.
704
 * Returns number of entries mapped.
705
 */
706
static int dx_make_map (struct ext3_dir_entry_2 *de, int size,
707
                        struct dx_hash_info *hinfo, struct dx_map_entry *map_tail)
708
{
709
        int count = 0;
710
        char *base = (char *) de;
711
        struct dx_hash_info h = *hinfo;
712
 
713
        while ((char *) de < base + size)
714
        {
715
                if (de->name_len && de->inode) {
716
                        ext3fs_dirhash(de->name, de->name_len, &h);
717
                        map_tail--;
718
                        map_tail->hash = h.hash;
719
                        map_tail->offs = (u16) ((char *) de - base);
720
                        map_tail->size = le16_to_cpu(de->rec_len);
721
                        count++;
722
                        cond_resched();
723
                }
724
                /* XXX: do we need to check rec_len == 0 case? -Chris */
725
                de = ext3_next_entry(de);
726
        }
727
        return count;
728
}
729
 
730
/* Sort map by hash value */
731
static void dx_sort_map (struct dx_map_entry *map, unsigned count)
732
{
733
        struct dx_map_entry *p, *q, *top = map + count - 1;
734
        int more;
735
        /* Combsort until bubble sort doesn't suck */
736
        while (count > 2)
737
        {
738
                count = count*10/13;
739
                if (count - 9 < 2) /* 9, 10 -> 11 */
740
                        count = 11;
741
                for (p = top, q = p - count; q >= map; p--, q--)
742
                        if (p->hash < q->hash)
743
                                swap(*p, *q);
744
        }
745
        /* Garden variety bubble sort */
746
        do {
747
                more = 0;
748
                q = top;
749
                while (q-- > map)
750
                {
751
                        if (q[1].hash >= q[0].hash)
752
                                continue;
753
                        swap(*(q+1), *q);
754
                        more = 1;
755
                }
756
        } while(more);
757
}
758
 
759
static void dx_insert_block(struct dx_frame *frame, u32 hash, u32 block)
760
{
761
        struct dx_entry *entries = frame->entries;
762
        struct dx_entry *old = frame->at, *new = old + 1;
763
        int count = dx_get_count(entries);
764
 
765
        assert(count < dx_get_limit(entries));
766
        assert(old < entries + count);
767
        memmove(new + 1, new, (char *)(entries + count) - (char *)(new));
768
        dx_set_hash(new, hash);
769
        dx_set_block(new, block);
770
        dx_set_count(entries, count + 1);
771
}
772
 
773
static void ext3_update_dx_flag(struct inode *inode)
774
{
775
        if (!EXT3_HAS_COMPAT_FEATURE(inode->i_sb,
776
                                     EXT3_FEATURE_COMPAT_DIR_INDEX))
777
                EXT3_I(inode)->i_flags &= ~EXT3_INDEX_FL;
778
}
779
 
780
/*
781
 * NOTE! unlike strncmp, ext3_match returns 1 for success, 0 for failure.
782
 *
783
 * `len <= EXT3_NAME_LEN' is guaranteed by caller.
784
 * `de != NULL' is guaranteed by caller.
785
 */
786
static inline int ext3_match (int len, const char * const name,
787
                              struct ext3_dir_entry_2 * de)
788
{
789
        if (len != de->name_len)
790
                return 0;
791
        if (!de->inode)
792
                return 0;
793
        return !memcmp(name, de->name, len);
794
}
795
 
796
/*
797
 * Returns 0 if not found, -1 on failure, and 1 on success
798
 */
799
static inline int search_dirblock(struct buffer_head * bh,
800
                                  struct inode *dir,
801
                                  struct dentry *dentry,
802
                                  unsigned long offset,
803
                                  struct ext3_dir_entry_2 ** res_dir)
804
{
805
        struct ext3_dir_entry_2 * de;
806
        char * dlimit;
807
        int de_len;
808
        const char *name = dentry->d_name.name;
809
        int namelen = dentry->d_name.len;
810
 
811
        de = (struct ext3_dir_entry_2 *) bh->b_data;
812
        dlimit = bh->b_data + dir->i_sb->s_blocksize;
813
        while ((char *) de < dlimit) {
814
                /* this code is executed quadratically often */
815
                /* do minimal checking `by hand' */
816
 
817
                if ((char *) de + namelen <= dlimit &&
818
                    ext3_match (namelen, name, de)) {
819
                        /* found a match - just to be sure, do a full check */
820
                        if (!ext3_check_dir_entry("ext3_find_entry",
821
                                                  dir, de, bh, offset))
822
                                return -1;
823
                        *res_dir = de;
824
                        return 1;
825
                }
826
                /* prevent looping on a bad block */
827
                de_len = ext3_rec_len_from_disk(de->rec_len);
828
                if (de_len <= 0)
829
                        return -1;
830
                offset += de_len;
831
                de = (struct ext3_dir_entry_2 *) ((char *) de + de_len);
832
        }
833
        return 0;
834
}
835
 
836
 
837
/*
838
 *      ext3_find_entry()
839
 *
840
 * finds an entry in the specified directory with the wanted name. It
841
 * returns the cache buffer in which the entry was found, and the entry
842
 * itself (as a parameter - res_dir). It does NOT read the inode of the
843
 * entry - you'll have to do that yourself if you want to.
844
 *
845
 * The returned buffer_head has ->b_count elevated.  The caller is expected
846
 * to brelse() it when appropriate.
847
 */
848
static struct buffer_head * ext3_find_entry (struct dentry *dentry,
849
                                        struct ext3_dir_entry_2 ** res_dir)
850
{
851
        struct super_block * sb;
852
        struct buffer_head * bh_use[NAMEI_RA_SIZE];
853
        struct buffer_head * bh, *ret = NULL;
854
        unsigned long start, block, b;
855
        int ra_max = 0;          /* Number of bh's in the readahead
856
                                   buffer, bh_use[] */
857
        int ra_ptr = 0;          /* Current index into readahead
858
                                   buffer */
859
        int num = 0;
860
        int nblocks, i, err;
861
        struct inode *dir = dentry->d_parent->d_inode;
862
        int namelen;
863
        const u8 *name;
864
        unsigned blocksize;
865
 
866
        *res_dir = NULL;
867
        sb = dir->i_sb;
868
        blocksize = sb->s_blocksize;
869
        namelen = dentry->d_name.len;
870
        name = dentry->d_name.name;
871
        if (namelen > EXT3_NAME_LEN)
872
                return NULL;
873
        if (is_dx(dir)) {
874
                bh = ext3_dx_find_entry(dentry, res_dir, &err);
875
                /*
876
                 * On success, or if the error was file not found,
877
                 * return.  Otherwise, fall back to doing a search the
878
                 * old fashioned way.
879
                 */
880
                if (bh || (err != ERR_BAD_DX_DIR))
881
                        return bh;
882
                dxtrace(printk("ext3_find_entry: dx failed, falling back\n"));
883
        }
884
        nblocks = dir->i_size >> EXT3_BLOCK_SIZE_BITS(sb);
885
        start = EXT3_I(dir)->i_dir_start_lookup;
886
        if (start >= nblocks)
887
                start = 0;
888
        block = start;
889
restart:
890
        do {
891
                /*
892
                 * We deal with the read-ahead logic here.
893
                 */
894
                if (ra_ptr >= ra_max) {
895
                        /* Refill the readahead buffer */
896
                        ra_ptr = 0;
897
                        b = block;
898
                        for (ra_max = 0; ra_max < NAMEI_RA_SIZE; ra_max++) {
899
                                /*
900
                                 * Terminate if we reach the end of the
901
                                 * directory and must wrap, or if our
902
                                 * search has finished at this block.
903
                                 */
904
                                if (b >= nblocks || (num && block == start)) {
905
                                        bh_use[ra_max] = NULL;
906
                                        break;
907
                                }
908
                                num++;
909
                                bh = ext3_getblk(NULL, dir, b++, 0, &err);
910
                                bh_use[ra_max] = bh;
911
                                if (bh)
912
                                        ll_rw_block(READ_META, 1, &bh);
913
                        }
914
                }
915
                if ((bh = bh_use[ra_ptr++]) == NULL)
916
                        goto next;
917
                wait_on_buffer(bh);
918
                if (!buffer_uptodate(bh)) {
919
                        /* read error, skip block & hope for the best */
920
                        ext3_error(sb, __FUNCTION__, "reading directory #%lu "
921
                                   "offset %lu", dir->i_ino, block);
922
                        brelse(bh);
923
                        goto next;
924
                }
925
                i = search_dirblock(bh, dir, dentry,
926
                            block << EXT3_BLOCK_SIZE_BITS(sb), res_dir);
927
                if (i == 1) {
928
                        EXT3_I(dir)->i_dir_start_lookup = block;
929
                        ret = bh;
930
                        goto cleanup_and_exit;
931
                } else {
932
                        brelse(bh);
933
                        if (i < 0)
934
                                goto cleanup_and_exit;
935
                }
936
        next:
937
                if (++block >= nblocks)
938
                        block = 0;
939
        } while (block != start);
940
 
941
        /*
942
         * If the directory has grown while we were searching, then
943
         * search the last part of the directory before giving up.
944
         */
945
        block = nblocks;
946
        nblocks = dir->i_size >> EXT3_BLOCK_SIZE_BITS(sb);
947
        if (block < nblocks) {
948
                start = 0;
949
                goto restart;
950
        }
951
 
952
cleanup_and_exit:
953
        /* Clean up the read-ahead blocks */
954
        for (; ra_ptr < ra_max; ra_ptr++)
955
                brelse (bh_use[ra_ptr]);
956
        return ret;
957
}
958
 
959
static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry,
960
                       struct ext3_dir_entry_2 **res_dir, int *err)
961
{
962
        struct super_block * sb;
963
        struct dx_hash_info     hinfo;
964
        u32 hash;
965
        struct dx_frame frames[2], *frame;
966
        struct ext3_dir_entry_2 *de, *top;
967
        struct buffer_head *bh;
968
        unsigned long block;
969
        int retval;
970
        int namelen = dentry->d_name.len;
971
        const u8 *name = dentry->d_name.name;
972
        struct inode *dir = dentry->d_parent->d_inode;
973
 
974
        sb = dir->i_sb;
975
        /* NFS may look up ".." - look at dx_root directory block */
976
        if (namelen > 2 || name[0] != '.'||(name[1] != '.' && name[1] != '\0')){
977
                if (!(frame = dx_probe(dentry, NULL, &hinfo, frames, err)))
978
                        return NULL;
979
        } else {
980
                frame = frames;
981
                frame->bh = NULL;                       /* for dx_release() */
982
                frame->at = (struct dx_entry *)frames;  /* hack for zero entry*/
983
                dx_set_block(frame->at, 0);              /* dx_root block is 0 */
984
        }
985
        hash = hinfo.hash;
986
        do {
987
                block = dx_get_block(frame->at);
988
                if (!(bh = ext3_bread (NULL,dir, block, 0, err)))
989
                        goto errout;
990
                de = (struct ext3_dir_entry_2 *) bh->b_data;
991
                top = (struct ext3_dir_entry_2 *) ((char *) de + sb->s_blocksize -
992
                                       EXT3_DIR_REC_LEN(0));
993
                for (; de < top; de = ext3_next_entry(de))
994
                if (ext3_match (namelen, name, de)) {
995
                        if (!ext3_check_dir_entry("ext3_find_entry",
996
                                                  dir, de, bh,
997
                                  (block<<EXT3_BLOCK_SIZE_BITS(sb))
998
                                          +((char *)de - bh->b_data))) {
999
                                brelse (bh);
1000
                                *err = ERR_BAD_DX_DIR;
1001
                                goto errout;
1002
                        }
1003
                        *res_dir = de;
1004
                        dx_release (frames);
1005
                        return bh;
1006
                }
1007
                brelse (bh);
1008
                /* Check to see if we should continue to search */
1009
                retval = ext3_htree_next_block(dir, hash, frame,
1010
                                               frames, NULL);
1011
                if (retval < 0) {
1012
                        ext3_warning(sb, __FUNCTION__,
1013
                             "error reading index page in directory #%lu",
1014
                             dir->i_ino);
1015
                        *err = retval;
1016
                        goto errout;
1017
                }
1018
        } while (retval == 1);
1019
 
1020
        *err = -ENOENT;
1021
errout:
1022
        dxtrace(printk("%s not found\n", name));
1023
        dx_release (frames);
1024
        return NULL;
1025
}
1026
 
1027
static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry, struct nameidata *nd)
1028
{
1029
        struct inode * inode;
1030
        struct ext3_dir_entry_2 * de;
1031
        struct buffer_head * bh;
1032
 
1033
        if (dentry->d_name.len > EXT3_NAME_LEN)
1034
                return ERR_PTR(-ENAMETOOLONG);
1035
 
1036
        bh = ext3_find_entry(dentry, &de);
1037
        inode = NULL;
1038
        if (bh) {
1039
                unsigned long ino = le32_to_cpu(de->inode);
1040
                brelse (bh);
1041
                if (!ext3_valid_inum(dir->i_sb, ino)) {
1042
                        ext3_error(dir->i_sb, "ext3_lookup",
1043
                                   "bad inode number: %lu", ino);
1044
                        inode = NULL;
1045
                } else
1046
                        inode = iget(dir->i_sb, ino);
1047
 
1048
                if (!inode)
1049
                        return ERR_PTR(-EACCES);
1050
 
1051
                if (is_bad_inode(inode)) {
1052
                        iput(inode);
1053
                        return ERR_PTR(-ENOENT);
1054
                }
1055
        }
1056
        return d_splice_alias(inode, dentry);
1057
}
1058
 
1059
 
1060
struct dentry *ext3_get_parent(struct dentry *child)
1061
{
1062
        unsigned long ino;
1063
        struct dentry *parent;
1064
        struct inode *inode;
1065
        struct dentry dotdot;
1066
        struct ext3_dir_entry_2 * de;
1067
        struct buffer_head *bh;
1068
 
1069
        dotdot.d_name.name = "..";
1070
        dotdot.d_name.len = 2;
1071
        dotdot.d_parent = child; /* confusing, isn't it! */
1072
 
1073
        bh = ext3_find_entry(&dotdot, &de);
1074
        inode = NULL;
1075
        if (!bh)
1076
                return ERR_PTR(-ENOENT);
1077
        ino = le32_to_cpu(de->inode);
1078
        brelse(bh);
1079
 
1080
        if (!ext3_valid_inum(child->d_inode->i_sb, ino)) {
1081
                ext3_error(child->d_inode->i_sb, "ext3_get_parent",
1082
                           "bad inode number: %lu", ino);
1083
                inode = NULL;
1084
        } else
1085
                inode = iget(child->d_inode->i_sb, ino);
1086
 
1087
        if (!inode)
1088
                return ERR_PTR(-EACCES);
1089
 
1090
        if (is_bad_inode(inode)) {
1091
                iput(inode);
1092
                return ERR_PTR(-ENOENT);
1093
        }
1094
 
1095
        parent = d_alloc_anon(inode);
1096
        if (!parent) {
1097
                iput(inode);
1098
                parent = ERR_PTR(-ENOMEM);
1099
        }
1100
        return parent;
1101
}
1102
 
1103
#define S_SHIFT 12
1104
static unsigned char ext3_type_by_mode[S_IFMT >> S_SHIFT] = {
1105
        [S_IFREG >> S_SHIFT]    = EXT3_FT_REG_FILE,
1106
        [S_IFDIR >> S_SHIFT]    = EXT3_FT_DIR,
1107
        [S_IFCHR >> S_SHIFT]    = EXT3_FT_CHRDEV,
1108
        [S_IFBLK >> S_SHIFT]    = EXT3_FT_BLKDEV,
1109
        [S_IFIFO >> S_SHIFT]    = EXT3_FT_FIFO,
1110
        [S_IFSOCK >> S_SHIFT]   = EXT3_FT_SOCK,
1111
        [S_IFLNK >> S_SHIFT]    = EXT3_FT_SYMLINK,
1112
};
1113
 
1114
static inline void ext3_set_de_type(struct super_block *sb,
1115
                                struct ext3_dir_entry_2 *de,
1116
                                umode_t mode) {
1117
        if (EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_FILETYPE))
1118
                de->file_type = ext3_type_by_mode[(mode & S_IFMT)>>S_SHIFT];
1119
}
1120
 
1121
/*
1122
 * Move count entries from end of map between two memory locations.
1123
 * Returns pointer to last entry moved.
1124
 */
1125
static struct ext3_dir_entry_2 *
1126
dx_move_dirents(char *from, char *to, struct dx_map_entry *map, int count)
1127
{
1128
        unsigned rec_len = 0;
1129
 
1130
        while (count--) {
1131
                struct ext3_dir_entry_2 *de = (struct ext3_dir_entry_2 *) (from + map->offs);
1132
                rec_len = EXT3_DIR_REC_LEN(de->name_len);
1133
                memcpy (to, de, rec_len);
1134
                ((struct ext3_dir_entry_2 *) to)->rec_len =
1135
                                ext3_rec_len_to_disk(rec_len);
1136
                de->inode = 0;
1137
                map++;
1138
                to += rec_len;
1139
        }
1140
        return (struct ext3_dir_entry_2 *) (to - rec_len);
1141
}
1142
 
1143
/*
1144
 * Compact each dir entry in the range to the minimal rec_len.
1145
 * Returns pointer to last entry in range.
1146
 */
1147
static struct ext3_dir_entry_2* dx_pack_dirents(char *base, int size)
1148
{
1149
        struct ext3_dir_entry_2 *next, *to, *prev, *de = (struct ext3_dir_entry_2 *) base;
1150
        unsigned rec_len = 0;
1151
 
1152
        prev = to = de;
1153
        while ((char*)de < base + size) {
1154
                next = ext3_next_entry(de);
1155
                if (de->inode && de->name_len) {
1156
                        rec_len = EXT3_DIR_REC_LEN(de->name_len);
1157
                        if (de > to)
1158
                                memmove(to, de, rec_len);
1159
                        to->rec_len = ext3_rec_len_to_disk(rec_len);
1160
                        prev = to;
1161
                        to = (struct ext3_dir_entry_2 *) (((char *) to) + rec_len);
1162
                }
1163
                de = next;
1164
        }
1165
        return prev;
1166
}
1167
 
1168
/*
1169
 * Split a full leaf block to make room for a new dir entry.
1170
 * Allocate a new block, and move entries so that they are approx. equally full.
1171
 * Returns pointer to de in block into which the new entry will be inserted.
1172
 */
1173
static struct ext3_dir_entry_2 *do_split(handle_t *handle, struct inode *dir,
1174
                        struct buffer_head **bh,struct dx_frame *frame,
1175
                        struct dx_hash_info *hinfo, int *error)
1176
{
1177
        unsigned blocksize = dir->i_sb->s_blocksize;
1178
        unsigned count, continued;
1179
        struct buffer_head *bh2;
1180
        u32 newblock;
1181
        u32 hash2;
1182
        struct dx_map_entry *map;
1183
        char *data1 = (*bh)->b_data, *data2;
1184
        unsigned split, move, size, i;
1185
        struct ext3_dir_entry_2 *de = NULL, *de2;
1186
        int     err = 0;
1187
 
1188
        bh2 = ext3_append (handle, dir, &newblock, &err);
1189
        if (!(bh2)) {
1190
                brelse(*bh);
1191
                *bh = NULL;
1192
                goto errout;
1193
        }
1194
 
1195
        BUFFER_TRACE(*bh, "get_write_access");
1196
        err = ext3_journal_get_write_access(handle, *bh);
1197
        if (err)
1198
                goto journal_error;
1199
 
1200
        BUFFER_TRACE(frame->bh, "get_write_access");
1201
        err = ext3_journal_get_write_access(handle, frame->bh);
1202
        if (err)
1203
                goto journal_error;
1204
 
1205
        data2 = bh2->b_data;
1206
 
1207
        /* create map in the end of data2 block */
1208
        map = (struct dx_map_entry *) (data2 + blocksize);
1209
        count = dx_make_map ((struct ext3_dir_entry_2 *) data1,
1210
                             blocksize, hinfo, map);
1211
        map -= count;
1212
        dx_sort_map (map, count);
1213
        /* Split the existing block in the middle, size-wise */
1214
        size = 0;
1215
        move = 0;
1216
        for (i = count-1; i >= 0; i--) {
1217
                /* is more than half of this entry in 2nd half of the block? */
1218
                if (size + map[i].size/2 > blocksize/2)
1219
                        break;
1220
                size += map[i].size;
1221
                move++;
1222
        }
1223
        /* map index at which we will split */
1224
        split = count - move;
1225
        hash2 = map[split].hash;
1226
        continued = hash2 == map[split - 1].hash;
1227
        dxtrace(printk("Split block %i at %x, %i/%i\n",
1228
                dx_get_block(frame->at), hash2, split, count-split));
1229
 
1230
        /* Fancy dance to stay within two buffers */
1231
        de2 = dx_move_dirents(data1, data2, map + split, count - split);
1232
        de = dx_pack_dirents(data1,blocksize);
1233
        de->rec_len = ext3_rec_len_to_disk(data1 + blocksize - (char *) de);
1234
        de2->rec_len = ext3_rec_len_to_disk(data2 + blocksize - (char *) de2);
1235
        dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data1, blocksize, 1));
1236
        dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data2, blocksize, 1));
1237
 
1238
        /* Which block gets the new entry? */
1239
        if (hinfo->hash >= hash2)
1240
        {
1241
                swap(*bh, bh2);
1242
                de = de2;
1243
        }
1244
        dx_insert_block (frame, hash2 + continued, newblock);
1245
        err = ext3_journal_dirty_metadata (handle, bh2);
1246
        if (err)
1247
                goto journal_error;
1248
        err = ext3_journal_dirty_metadata (handle, frame->bh);
1249
        if (err)
1250
                goto journal_error;
1251
        brelse (bh2);
1252
        dxtrace(dx_show_index ("frame", frame->entries));
1253
        return de;
1254
 
1255
journal_error:
1256
        brelse(*bh);
1257
        brelse(bh2);
1258
        *bh = NULL;
1259
        ext3_std_error(dir->i_sb, err);
1260
errout:
1261
        *error = err;
1262
        return NULL;
1263
}
1264
 
1265
 
1266
/*
1267
 * Add a new entry into a directory (leaf) block.  If de is non-NULL,
1268
 * it points to a directory entry which is guaranteed to be large
1269
 * enough for new directory entry.  If de is NULL, then
1270
 * add_dirent_to_buf will attempt search the directory block for
1271
 * space.  It will return -ENOSPC if no space is available, and -EIO
1272
 * and -EEXIST if directory entry already exists.
1273
 *
1274
 * NOTE!  bh is NOT released in the case where ENOSPC is returned.  In
1275
 * all other cases bh is released.
1276
 */
1277
static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry,
1278
                             struct inode *inode, struct ext3_dir_entry_2 *de,
1279
                             struct buffer_head * bh)
1280
{
1281
        struct inode    *dir = dentry->d_parent->d_inode;
1282
        const char      *name = dentry->d_name.name;
1283
        int             namelen = dentry->d_name.len;
1284
        unsigned long   offset = 0;
1285
        unsigned short  reclen;
1286
        int             nlen, rlen, err;
1287
        char            *top;
1288
 
1289
        reclen = EXT3_DIR_REC_LEN(namelen);
1290
        if (!de) {
1291
                de = (struct ext3_dir_entry_2 *)bh->b_data;
1292
                top = bh->b_data + dir->i_sb->s_blocksize - reclen;
1293
                while ((char *) de <= top) {
1294
                        if (!ext3_check_dir_entry("ext3_add_entry", dir, de,
1295
                                                  bh, offset)) {
1296
                                brelse (bh);
1297
                                return -EIO;
1298
                        }
1299
                        if (ext3_match (namelen, name, de)) {
1300
                                brelse (bh);
1301
                                return -EEXIST;
1302
                        }
1303
                        nlen = EXT3_DIR_REC_LEN(de->name_len);
1304
                        rlen = ext3_rec_len_from_disk(de->rec_len);
1305
                        if ((de->inode? rlen - nlen: rlen) >= reclen)
1306
                                break;
1307
                        de = (struct ext3_dir_entry_2 *)((char *)de + rlen);
1308
                        offset += rlen;
1309
                }
1310
                if ((char *) de > top)
1311
                        return -ENOSPC;
1312
        }
1313
        BUFFER_TRACE(bh, "get_write_access");
1314
        err = ext3_journal_get_write_access(handle, bh);
1315
        if (err) {
1316
                ext3_std_error(dir->i_sb, err);
1317
                brelse(bh);
1318
                return err;
1319
        }
1320
 
1321
        /* By now the buffer is marked for journaling */
1322
        nlen = EXT3_DIR_REC_LEN(de->name_len);
1323
        rlen = ext3_rec_len_from_disk(de->rec_len);
1324
        if (de->inode) {
1325
                struct ext3_dir_entry_2 *de1 = (struct ext3_dir_entry_2 *)((char *)de + nlen);
1326
                de1->rec_len = ext3_rec_len_to_disk(rlen - nlen);
1327
                de->rec_len = ext3_rec_len_to_disk(nlen);
1328
                de = de1;
1329
        }
1330
        de->file_type = EXT3_FT_UNKNOWN;
1331
        if (inode) {
1332
                de->inode = cpu_to_le32(inode->i_ino);
1333
                ext3_set_de_type(dir->i_sb, de, inode->i_mode);
1334
        } else
1335
                de->inode = 0;
1336
        de->name_len = namelen;
1337
        memcpy (de->name, name, namelen);
1338
        /*
1339
         * XXX shouldn't update any times until successful
1340
         * completion of syscall, but too many callers depend
1341
         * on this.
1342
         *
1343
         * XXX similarly, too many callers depend on
1344
         * ext3_new_inode() setting the times, but error
1345
         * recovery deletes the inode, so the worst that can
1346
         * happen is that the times are slightly out of date
1347
         * and/or different from the directory change time.
1348
         */
1349
        dir->i_mtime = dir->i_ctime = CURRENT_TIME_SEC;
1350
        ext3_update_dx_flag(dir);
1351
        dir->i_version++;
1352
        ext3_mark_inode_dirty(handle, dir);
1353
        BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");
1354
        err = ext3_journal_dirty_metadata(handle, bh);
1355
        if (err)
1356
                ext3_std_error(dir->i_sb, err);
1357
        brelse(bh);
1358
        return 0;
1359
}
1360
 
1361
/*
1362
 * This converts a one block unindexed directory to a 3 block indexed
1363
 * directory, and adds the dentry to the indexed directory.
1364
 */
1365
static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
1366
                            struct inode *inode, struct buffer_head *bh)
1367
{
1368
        struct inode    *dir = dentry->d_parent->d_inode;
1369
        const char      *name = dentry->d_name.name;
1370
        int             namelen = dentry->d_name.len;
1371
        struct buffer_head *bh2;
1372
        struct dx_root  *root;
1373
        struct dx_frame frames[2], *frame;
1374
        struct dx_entry *entries;
1375
        struct ext3_dir_entry_2 *de, *de2;
1376
        char            *data1, *top;
1377
        unsigned        len;
1378
        int             retval;
1379
        unsigned        blocksize;
1380
        struct dx_hash_info hinfo;
1381
        u32             block;
1382
        struct fake_dirent *fde;
1383
 
1384
        blocksize =  dir->i_sb->s_blocksize;
1385
        dxtrace(printk("Creating index\n"));
1386
        retval = ext3_journal_get_write_access(handle, bh);
1387
        if (retval) {
1388
                ext3_std_error(dir->i_sb, retval);
1389
                brelse(bh);
1390
                return retval;
1391
        }
1392
        root = (struct dx_root *) bh->b_data;
1393
 
1394
        bh2 = ext3_append (handle, dir, &block, &retval);
1395
        if (!(bh2)) {
1396
                brelse(bh);
1397
                return retval;
1398
        }
1399
        EXT3_I(dir)->i_flags |= EXT3_INDEX_FL;
1400
        data1 = bh2->b_data;
1401
 
1402
        /* The 0th block becomes the root, move the dirents out */
1403
        fde = &root->dotdot;
1404
        de = (struct ext3_dir_entry_2 *)((char *)fde +
1405
                        ext3_rec_len_from_disk(fde->rec_len));
1406
        len = ((char *) root) + blocksize - (char *) de;
1407
        memcpy (data1, de, len);
1408
        de = (struct ext3_dir_entry_2 *) data1;
1409
        top = data1 + len;
1410
        while ((char *)(de2 = ext3_next_entry(de)) < top)
1411
                de = de2;
1412
        de->rec_len = ext3_rec_len_to_disk(data1 + blocksize - (char *) de);
1413
        /* Initialize the root; the dot dirents already exist */
1414
        de = (struct ext3_dir_entry_2 *) (&root->dotdot);
1415
        de->rec_len = ext3_rec_len_to_disk(blocksize - EXT3_DIR_REC_LEN(2));
1416
        memset (&root->info, 0, sizeof(root->info));
1417
        root->info.info_length = sizeof(root->info);
1418
        root->info.hash_version = EXT3_SB(dir->i_sb)->s_def_hash_version;
1419
        entries = root->entries;
1420
        dx_set_block (entries, 1);
1421
        dx_set_count (entries, 1);
1422
        dx_set_limit (entries, dx_root_limit(dir, sizeof(root->info)));
1423
 
1424
        /* Initialize as for dx_probe */
1425
        hinfo.hash_version = root->info.hash_version;
1426
        hinfo.seed = EXT3_SB(dir->i_sb)->s_hash_seed;
1427
        ext3fs_dirhash(name, namelen, &hinfo);
1428
        frame = frames;
1429
        frame->entries = entries;
1430
        frame->at = entries;
1431
        frame->bh = bh;
1432
        bh = bh2;
1433
        de = do_split(handle,dir, &bh, frame, &hinfo, &retval);
1434
        dx_release (frames);
1435
        if (!(de))
1436
                return retval;
1437
 
1438
        return add_dirent_to_buf(handle, dentry, inode, de, bh);
1439
}
1440
 
1441
/*
1442
 *      ext3_add_entry()
1443
 *
1444
 * adds a file entry to the specified directory, using the same
1445
 * semantics as ext3_find_entry(). It returns NULL if it failed.
1446
 *
1447
 * NOTE!! The inode part of 'de' is left at 0 - which means you
1448
 * may not sleep between calling this and putting something into
1449
 * the entry, as someone else might have used it while you slept.
1450
 */
1451
static int ext3_add_entry (handle_t *handle, struct dentry *dentry,
1452
        struct inode *inode)
1453
{
1454
        struct inode *dir = dentry->d_parent->d_inode;
1455
        unsigned long offset;
1456
        struct buffer_head * bh;
1457
        struct ext3_dir_entry_2 *de;
1458
        struct super_block * sb;
1459
        int     retval;
1460
        int     dx_fallback=0;
1461
        unsigned blocksize;
1462
        u32 block, blocks;
1463
 
1464
        sb = dir->i_sb;
1465
        blocksize = sb->s_blocksize;
1466
        if (!dentry->d_name.len)
1467
                return -EINVAL;
1468
        if (is_dx(dir)) {
1469
                retval = ext3_dx_add_entry(handle, dentry, inode);
1470
                if (!retval || (retval != ERR_BAD_DX_DIR))
1471
                        return retval;
1472
                EXT3_I(dir)->i_flags &= ~EXT3_INDEX_FL;
1473
                dx_fallback++;
1474
                ext3_mark_inode_dirty(handle, dir);
1475
        }
1476
        blocks = dir->i_size >> sb->s_blocksize_bits;
1477
        for (block = 0, offset = 0; block < blocks; block++) {
1478
                bh = ext3_bread(handle, dir, block, 0, &retval);
1479
                if(!bh)
1480
                        return retval;
1481
                retval = add_dirent_to_buf(handle, dentry, inode, NULL, bh);
1482
                if (retval != -ENOSPC)
1483
                        return retval;
1484
 
1485
                if (blocks == 1 && !dx_fallback &&
1486
                    EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_DIR_INDEX))
1487
                        return make_indexed_dir(handle, dentry, inode, bh);
1488
                brelse(bh);
1489
        }
1490
        bh = ext3_append(handle, dir, &block, &retval);
1491
        if (!bh)
1492
                return retval;
1493
        de = (struct ext3_dir_entry_2 *) bh->b_data;
1494
        de->inode = 0;
1495
        de->rec_len = ext3_rec_len_to_disk(blocksize);
1496
        return add_dirent_to_buf(handle, dentry, inode, de, bh);
1497
}
1498
 
1499
/*
1500
 * Returns 0 for success, or a negative error value
1501
 */
1502
static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry,
1503
                             struct inode *inode)
1504
{
1505
        struct dx_frame frames[2], *frame;
1506
        struct dx_entry *entries, *at;
1507
        struct dx_hash_info hinfo;
1508
        struct buffer_head * bh;
1509
        struct inode *dir = dentry->d_parent->d_inode;
1510
        struct super_block * sb = dir->i_sb;
1511
        struct ext3_dir_entry_2 *de;
1512
        int err;
1513
 
1514
        frame = dx_probe(dentry, NULL, &hinfo, frames, &err);
1515
        if (!frame)
1516
                return err;
1517
        entries = frame->entries;
1518
        at = frame->at;
1519
 
1520
        if (!(bh = ext3_bread(handle,dir, dx_get_block(frame->at), 0, &err)))
1521
                goto cleanup;
1522
 
1523
        BUFFER_TRACE(bh, "get_write_access");
1524
        err = ext3_journal_get_write_access(handle, bh);
1525
        if (err)
1526
                goto journal_error;
1527
 
1528
        err = add_dirent_to_buf(handle, dentry, inode, NULL, bh);
1529
        if (err != -ENOSPC) {
1530
                bh = NULL;
1531
                goto cleanup;
1532
        }
1533
 
1534
        /* Block full, should compress but for now just split */
1535
        dxtrace(printk("using %u of %u node entries\n",
1536
                       dx_get_count(entries), dx_get_limit(entries)));
1537
        /* Need to split index? */
1538
        if (dx_get_count(entries) == dx_get_limit(entries)) {
1539
                u32 newblock;
1540
                unsigned icount = dx_get_count(entries);
1541
                int levels = frame - frames;
1542
                struct dx_entry *entries2;
1543
                struct dx_node *node2;
1544
                struct buffer_head *bh2;
1545
 
1546
                if (levels && (dx_get_count(frames->entries) ==
1547
                               dx_get_limit(frames->entries))) {
1548
                        ext3_warning(sb, __FUNCTION__,
1549
                                     "Directory index full!");
1550
                        err = -ENOSPC;
1551
                        goto cleanup;
1552
                }
1553
                bh2 = ext3_append (handle, dir, &newblock, &err);
1554
                if (!(bh2))
1555
                        goto cleanup;
1556
                node2 = (struct dx_node *)(bh2->b_data);
1557
                entries2 = node2->entries;
1558
                node2->fake.rec_len = ext3_rec_len_to_disk(sb->s_blocksize);
1559
                node2->fake.inode = 0;
1560
                BUFFER_TRACE(frame->bh, "get_write_access");
1561
                err = ext3_journal_get_write_access(handle, frame->bh);
1562
                if (err)
1563
                        goto journal_error;
1564
                if (levels) {
1565
                        unsigned icount1 = icount/2, icount2 = icount - icount1;
1566
                        unsigned hash2 = dx_get_hash(entries + icount1);
1567
                        dxtrace(printk("Split index %i/%i\n", icount1, icount2));
1568
 
1569
                        BUFFER_TRACE(frame->bh, "get_write_access"); /* index root */
1570
                        err = ext3_journal_get_write_access(handle,
1571
                                                             frames[0].bh);
1572
                        if (err)
1573
                                goto journal_error;
1574
 
1575
                        memcpy ((char *) entries2, (char *) (entries + icount1),
1576
                                icount2 * sizeof(struct dx_entry));
1577
                        dx_set_count (entries, icount1);
1578
                        dx_set_count (entries2, icount2);
1579
                        dx_set_limit (entries2, dx_node_limit(dir));
1580
 
1581
                        /* Which index block gets the new entry? */
1582
                        if (at - entries >= icount1) {
1583
                                frame->at = at = at - entries - icount1 + entries2;
1584
                                frame->entries = entries = entries2;
1585
                                swap(frame->bh, bh2);
1586
                        }
1587
                        dx_insert_block (frames + 0, hash2, newblock);
1588
                        dxtrace(dx_show_index ("node", frames[1].entries));
1589
                        dxtrace(dx_show_index ("node",
1590
                               ((struct dx_node *) bh2->b_data)->entries));
1591
                        err = ext3_journal_dirty_metadata(handle, bh2);
1592
                        if (err)
1593
                                goto journal_error;
1594
                        brelse (bh2);
1595
                } else {
1596
                        dxtrace(printk("Creating second level index...\n"));
1597
                        memcpy((char *) entries2, (char *) entries,
1598
                               icount * sizeof(struct dx_entry));
1599
                        dx_set_limit(entries2, dx_node_limit(dir));
1600
 
1601
                        /* Set up root */
1602
                        dx_set_count(entries, 1);
1603
                        dx_set_block(entries + 0, newblock);
1604
                        ((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels = 1;
1605
 
1606
                        /* Add new access path frame */
1607
                        frame = frames + 1;
1608
                        frame->at = at = at - entries + entries2;
1609
                        frame->entries = entries = entries2;
1610
                        frame->bh = bh2;
1611
                        err = ext3_journal_get_write_access(handle,
1612
                                                             frame->bh);
1613
                        if (err)
1614
                                goto journal_error;
1615
                }
1616
                ext3_journal_dirty_metadata(handle, frames[0].bh);
1617
        }
1618
        de = do_split(handle, dir, &bh, frame, &hinfo, &err);
1619
        if (!de)
1620
                goto cleanup;
1621
        err = add_dirent_to_buf(handle, dentry, inode, de, bh);
1622
        bh = NULL;
1623
        goto cleanup;
1624
 
1625
journal_error:
1626
        ext3_std_error(dir->i_sb, err);
1627
cleanup:
1628
        if (bh)
1629
                brelse(bh);
1630
        dx_release(frames);
1631
        return err;
1632
}
1633
 
1634
/*
1635
 * ext3_delete_entry deletes a directory entry by merging it with the
1636
 * previous entry
1637
 */
1638
static int ext3_delete_entry (handle_t *handle,
1639
                              struct inode * dir,
1640
                              struct ext3_dir_entry_2 * de_del,
1641
                              struct buffer_head * bh)
1642
{
1643
        struct ext3_dir_entry_2 * de, * pde;
1644
        int i;
1645
 
1646
        i = 0;
1647
        pde = NULL;
1648
        de = (struct ext3_dir_entry_2 *) bh->b_data;
1649
        while (i < bh->b_size) {
1650
                if (!ext3_check_dir_entry("ext3_delete_entry", dir, de, bh, i))
1651
                        return -EIO;
1652
                if (de == de_del)  {
1653
                        BUFFER_TRACE(bh, "get_write_access");
1654
                        ext3_journal_get_write_access(handle, bh);
1655
                        if (pde)
1656
                                pde->rec_len = ext3_rec_len_to_disk(
1657
                                        ext3_rec_len_from_disk(pde->rec_len) +
1658
                                        ext3_rec_len_from_disk(de->rec_len));
1659
                        else
1660
                                de->inode = 0;
1661
                        dir->i_version++;
1662
                        BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");
1663
                        ext3_journal_dirty_metadata(handle, bh);
1664
                        return 0;
1665
                }
1666
                i += ext3_rec_len_from_disk(de->rec_len);
1667
                pde = de;
1668
                de = ext3_next_entry(de);
1669
        }
1670
        return -ENOENT;
1671
}
1672
 
1673
static int ext3_add_nondir(handle_t *handle,
1674
                struct dentry *dentry, struct inode *inode)
1675
{
1676
        int err = ext3_add_entry(handle, dentry, inode);
1677
        if (!err) {
1678
                ext3_mark_inode_dirty(handle, inode);
1679
                d_instantiate(dentry, inode);
1680
                return 0;
1681
        }
1682
        drop_nlink(inode);
1683
        iput(inode);
1684
        return err;
1685
}
1686
 
1687
/*
1688
 * By the time this is called, we already have created
1689
 * the directory cache entry for the new file, but it
1690
 * is so far negative - it has no inode.
1691
 *
1692
 * If the create succeeds, we fill in the inode information
1693
 * with d_instantiate().
1694
 */
1695
static int ext3_create (struct inode * dir, struct dentry * dentry, int mode,
1696
                struct nameidata *nd)
1697
{
1698
        handle_t *handle;
1699
        struct inode * inode;
1700
        int err, retries = 0;
1701
 
1702
retry:
1703
        handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) +
1704
                                        EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 +
1705
                                        2*EXT3_QUOTA_INIT_BLOCKS(dir->i_sb));
1706
        if (IS_ERR(handle))
1707
                return PTR_ERR(handle);
1708
 
1709
        if (IS_DIRSYNC(dir))
1710
                handle->h_sync = 1;
1711
 
1712
        inode = ext3_new_inode (handle, dir, mode);
1713
        err = PTR_ERR(inode);
1714
        if (!IS_ERR(inode)) {
1715
                inode->i_op = &ext3_file_inode_operations;
1716
                inode->i_fop = &ext3_file_operations;
1717
                ext3_set_aops(inode);
1718
                err = ext3_add_nondir(handle, dentry, inode);
1719
        }
1720
        ext3_journal_stop(handle);
1721
        if (err == -ENOSPC && ext3_should_retry_alloc(dir->i_sb, &retries))
1722
                goto retry;
1723
        return err;
1724
}
1725
 
1726
static int ext3_mknod (struct inode * dir, struct dentry *dentry,
1727
                        int mode, dev_t rdev)
1728
{
1729
        handle_t *handle;
1730
        struct inode *inode;
1731
        int err, retries = 0;
1732
 
1733
        if (!new_valid_dev(rdev))
1734
                return -EINVAL;
1735
 
1736
retry:
1737
        handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) +
1738
                                        EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 +
1739
                                        2*EXT3_QUOTA_INIT_BLOCKS(dir->i_sb));
1740
        if (IS_ERR(handle))
1741
                return PTR_ERR(handle);
1742
 
1743
        if (IS_DIRSYNC(dir))
1744
                handle->h_sync = 1;
1745
 
1746
        inode = ext3_new_inode (handle, dir, mode);
1747
        err = PTR_ERR(inode);
1748
        if (!IS_ERR(inode)) {
1749
                init_special_inode(inode, inode->i_mode, rdev);
1750
#ifdef CONFIG_EXT3_FS_XATTR
1751
                inode->i_op = &ext3_special_inode_operations;
1752
#endif
1753
                err = ext3_add_nondir(handle, dentry, inode);
1754
        }
1755
        ext3_journal_stop(handle);
1756
        if (err == -ENOSPC && ext3_should_retry_alloc(dir->i_sb, &retries))
1757
                goto retry;
1758
        return err;
1759
}
1760
 
1761
static int ext3_mkdir(struct inode * dir, struct dentry * dentry, int mode)
1762
{
1763
        handle_t *handle;
1764
        struct inode * inode;
1765
        struct buffer_head * dir_block;
1766
        struct ext3_dir_entry_2 * de;
1767
        int err, retries = 0;
1768
 
1769
        if (dir->i_nlink >= EXT3_LINK_MAX)
1770
                return -EMLINK;
1771
 
1772
retry:
1773
        handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) +
1774
                                        EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 +
1775
                                        2*EXT3_QUOTA_INIT_BLOCKS(dir->i_sb));
1776
        if (IS_ERR(handle))
1777
                return PTR_ERR(handle);
1778
 
1779
        if (IS_DIRSYNC(dir))
1780
                handle->h_sync = 1;
1781
 
1782
        inode = ext3_new_inode (handle, dir, S_IFDIR | mode);
1783
        err = PTR_ERR(inode);
1784
        if (IS_ERR(inode))
1785
                goto out_stop;
1786
 
1787
        inode->i_op = &ext3_dir_inode_operations;
1788
        inode->i_fop = &ext3_dir_operations;
1789
        inode->i_size = EXT3_I(inode)->i_disksize = inode->i_sb->s_blocksize;
1790
        dir_block = ext3_bread (handle, inode, 0, 1, &err);
1791
        if (!dir_block) {
1792
                drop_nlink(inode); /* is this nlink == 0? */
1793
                ext3_mark_inode_dirty(handle, inode);
1794
                iput (inode);
1795
                goto out_stop;
1796
        }
1797
        BUFFER_TRACE(dir_block, "get_write_access");
1798
        ext3_journal_get_write_access(handle, dir_block);
1799
        de = (struct ext3_dir_entry_2 *) dir_block->b_data;
1800
        de->inode = cpu_to_le32(inode->i_ino);
1801
        de->name_len = 1;
1802
        de->rec_len = ext3_rec_len_to_disk(EXT3_DIR_REC_LEN(de->name_len));
1803
        strcpy (de->name, ".");
1804
        ext3_set_de_type(dir->i_sb, de, S_IFDIR);
1805
        de = ext3_next_entry(de);
1806
        de->inode = cpu_to_le32(dir->i_ino);
1807
        de->rec_len = ext3_rec_len_to_disk(inode->i_sb->s_blocksize -
1808
                                        EXT3_DIR_REC_LEN(1));
1809
        de->name_len = 2;
1810
        strcpy (de->name, "..");
1811
        ext3_set_de_type(dir->i_sb, de, S_IFDIR);
1812
        inode->i_nlink = 2;
1813
        BUFFER_TRACE(dir_block, "call ext3_journal_dirty_metadata");
1814
        ext3_journal_dirty_metadata(handle, dir_block);
1815
        brelse (dir_block);
1816
        ext3_mark_inode_dirty(handle, inode);
1817
        err = ext3_add_entry (handle, dentry, inode);
1818
        if (err) {
1819
                inode->i_nlink = 0;
1820
                ext3_mark_inode_dirty(handle, inode);
1821
                iput (inode);
1822
                goto out_stop;
1823
        }
1824
        inc_nlink(dir);
1825
        ext3_update_dx_flag(dir);
1826
        ext3_mark_inode_dirty(handle, dir);
1827
        d_instantiate(dentry, inode);
1828
out_stop:
1829
        ext3_journal_stop(handle);
1830
        if (err == -ENOSPC && ext3_should_retry_alloc(dir->i_sb, &retries))
1831
                goto retry;
1832
        return err;
1833
}
1834
 
1835
/*
1836
 * routine to check that the specified directory is empty (for rmdir)
1837
 */
1838
static int empty_dir (struct inode * inode)
1839
{
1840
        unsigned long offset;
1841
        struct buffer_head * bh;
1842
        struct ext3_dir_entry_2 * de, * de1;
1843
        struct super_block * sb;
1844
        int err = 0;
1845
 
1846
        sb = inode->i_sb;
1847
        if (inode->i_size < EXT3_DIR_REC_LEN(1) + EXT3_DIR_REC_LEN(2) ||
1848
            !(bh = ext3_bread (NULL, inode, 0, 0, &err))) {
1849
                if (err)
1850
                        ext3_error(inode->i_sb, __FUNCTION__,
1851
                                   "error %d reading directory #%lu offset 0",
1852
                                   err, inode->i_ino);
1853
                else
1854
                        ext3_warning(inode->i_sb, __FUNCTION__,
1855
                                     "bad directory (dir #%lu) - no data block",
1856
                                     inode->i_ino);
1857
                return 1;
1858
        }
1859
        de = (struct ext3_dir_entry_2 *) bh->b_data;
1860
        de1 = ext3_next_entry(de);
1861
        if (le32_to_cpu(de->inode) != inode->i_ino ||
1862
                        !le32_to_cpu(de1->inode) ||
1863
                        strcmp (".", de->name) ||
1864
                        strcmp ("..", de1->name)) {
1865
                ext3_warning (inode->i_sb, "empty_dir",
1866
                              "bad directory (dir #%lu) - no `.' or `..'",
1867
                              inode->i_ino);
1868
                brelse (bh);
1869
                return 1;
1870
        }
1871
        offset = ext3_rec_len_from_disk(de->rec_len) +
1872
                        ext3_rec_len_from_disk(de1->rec_len);
1873
        de = ext3_next_entry(de1);
1874
        while (offset < inode->i_size ) {
1875
                if (!bh ||
1876
                        (void *) de >= (void *) (bh->b_data+sb->s_blocksize)) {
1877
                        err = 0;
1878
                        brelse (bh);
1879
                        bh = ext3_bread (NULL, inode,
1880
                                offset >> EXT3_BLOCK_SIZE_BITS(sb), 0, &err);
1881
                        if (!bh) {
1882
                                if (err)
1883
                                        ext3_error(sb, __FUNCTION__,
1884
                                                   "error %d reading directory"
1885
                                                   " #%lu offset %lu",
1886
                                                   err, inode->i_ino, offset);
1887
                                offset += sb->s_blocksize;
1888
                                continue;
1889
                        }
1890
                        de = (struct ext3_dir_entry_2 *) bh->b_data;
1891
                }
1892
                if (!ext3_check_dir_entry("empty_dir", inode, de, bh, offset)) {
1893
                        de = (struct ext3_dir_entry_2 *)(bh->b_data +
1894
                                                         sb->s_blocksize);
1895
                        offset = (offset | (sb->s_blocksize - 1)) + 1;
1896
                        continue;
1897
                }
1898
                if (le32_to_cpu(de->inode)) {
1899
                        brelse (bh);
1900
                        return 0;
1901
                }
1902
                offset += ext3_rec_len_from_disk(de->rec_len);
1903
                de = ext3_next_entry(de);
1904
        }
1905
        brelse (bh);
1906
        return 1;
1907
}
1908
 
1909
/* ext3_orphan_add() links an unlinked or truncated inode into a list of
1910
 * such inodes, starting at the superblock, in case we crash before the
1911
 * file is closed/deleted, or in case the inode truncate spans multiple
1912
 * transactions and the last transaction is not recovered after a crash.
1913
 *
1914
 * At filesystem recovery time, we walk this list deleting unlinked
1915
 * inodes and truncating linked inodes in ext3_orphan_cleanup().
1916
 */
1917
int ext3_orphan_add(handle_t *handle, struct inode *inode)
1918
{
1919
        struct super_block *sb = inode->i_sb;
1920
        struct ext3_iloc iloc;
1921
        int err = 0, rc;
1922
 
1923
        lock_super(sb);
1924
        if (!list_empty(&EXT3_I(inode)->i_orphan))
1925
                goto out_unlock;
1926
 
1927
        /* Orphan handling is only valid for files with data blocks
1928
         * being truncated, or files being unlinked. */
1929
 
1930
        /* @@@ FIXME: Observation from aviro:
1931
         * I think I can trigger J_ASSERT in ext3_orphan_add().  We block
1932
         * here (on lock_super()), so race with ext3_link() which might bump
1933
         * ->i_nlink. For, say it, character device. Not a regular file,
1934
         * not a directory, not a symlink and ->i_nlink > 0.
1935
         */
1936
        J_ASSERT ((S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
1937
                S_ISLNK(inode->i_mode)) || inode->i_nlink == 0);
1938
 
1939
        BUFFER_TRACE(EXT3_SB(sb)->s_sbh, "get_write_access");
1940
        err = ext3_journal_get_write_access(handle, EXT3_SB(sb)->s_sbh);
1941
        if (err)
1942
                goto out_unlock;
1943
 
1944
        err = ext3_reserve_inode_write(handle, inode, &iloc);
1945
        if (err)
1946
                goto out_unlock;
1947
 
1948
        /* Insert this inode at the head of the on-disk orphan list... */
1949
        NEXT_ORPHAN(inode) = le32_to_cpu(EXT3_SB(sb)->s_es->s_last_orphan);
1950
        EXT3_SB(sb)->s_es->s_last_orphan = cpu_to_le32(inode->i_ino);
1951
        err = ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh);
1952
        rc = ext3_mark_iloc_dirty(handle, inode, &iloc);
1953
        if (!err)
1954
                err = rc;
1955
 
1956
        /* Only add to the head of the in-memory list if all the
1957
         * previous operations succeeded.  If the orphan_add is going to
1958
         * fail (possibly taking the journal offline), we can't risk
1959
         * leaving the inode on the orphan list: stray orphan-list
1960
         * entries can cause panics at unmount time.
1961
         *
1962
         * This is safe: on error we're going to ignore the orphan list
1963
         * anyway on the next recovery. */
1964
        if (!err)
1965
                list_add(&EXT3_I(inode)->i_orphan, &EXT3_SB(sb)->s_orphan);
1966
 
1967
        jbd_debug(4, "superblock will point to %lu\n", inode->i_ino);
1968
        jbd_debug(4, "orphan inode %lu will point to %d\n",
1969
                        inode->i_ino, NEXT_ORPHAN(inode));
1970
out_unlock:
1971
        unlock_super(sb);
1972
        ext3_std_error(inode->i_sb, err);
1973
        return err;
1974
}
1975
 
1976
/*
1977
 * ext3_orphan_del() removes an unlinked or truncated inode from the list
1978
 * of such inodes stored on disk, because it is finally being cleaned up.
1979
 */
1980
int ext3_orphan_del(handle_t *handle, struct inode *inode)
1981
{
1982
        struct list_head *prev;
1983
        struct ext3_inode_info *ei = EXT3_I(inode);
1984
        struct ext3_sb_info *sbi;
1985
        unsigned long ino_next;
1986
        struct ext3_iloc iloc;
1987
        int err = 0;
1988
 
1989
        lock_super(inode->i_sb);
1990
        if (list_empty(&ei->i_orphan)) {
1991
                unlock_super(inode->i_sb);
1992
                return 0;
1993
        }
1994
 
1995
        ino_next = NEXT_ORPHAN(inode);
1996
        prev = ei->i_orphan.prev;
1997
        sbi = EXT3_SB(inode->i_sb);
1998
 
1999
        jbd_debug(4, "remove inode %lu from orphan list\n", inode->i_ino);
2000
 
2001
        list_del_init(&ei->i_orphan);
2002
 
2003
        /* If we're on an error path, we may not have a valid
2004
         * transaction handle with which to update the orphan list on
2005
         * disk, but we still need to remove the inode from the linked
2006
         * list in memory. */
2007
        if (!handle)
2008
                goto out;
2009
 
2010
        err = ext3_reserve_inode_write(handle, inode, &iloc);
2011
        if (err)
2012
                goto out_err;
2013
 
2014
        if (prev == &sbi->s_orphan) {
2015
                jbd_debug(4, "superblock will point to %lu\n", ino_next);
2016
                BUFFER_TRACE(sbi->s_sbh, "get_write_access");
2017
                err = ext3_journal_get_write_access(handle, sbi->s_sbh);
2018
                if (err)
2019
                        goto out_brelse;
2020
                sbi->s_es->s_last_orphan = cpu_to_le32(ino_next);
2021
                err = ext3_journal_dirty_metadata(handle, sbi->s_sbh);
2022
        } else {
2023
                struct ext3_iloc iloc2;
2024
                struct inode *i_prev =
2025
                        &list_entry(prev, struct ext3_inode_info, i_orphan)->vfs_inode;
2026
 
2027
                jbd_debug(4, "orphan inode %lu will point to %lu\n",
2028
                          i_prev->i_ino, ino_next);
2029
                err = ext3_reserve_inode_write(handle, i_prev, &iloc2);
2030
                if (err)
2031
                        goto out_brelse;
2032
                NEXT_ORPHAN(i_prev) = ino_next;
2033
                err = ext3_mark_iloc_dirty(handle, i_prev, &iloc2);
2034
        }
2035
        if (err)
2036
                goto out_brelse;
2037
        NEXT_ORPHAN(inode) = 0;
2038
        err = ext3_mark_iloc_dirty(handle, inode, &iloc);
2039
 
2040
out_err:
2041
        ext3_std_error(inode->i_sb, err);
2042
out:
2043
        unlock_super(inode->i_sb);
2044
        return err;
2045
 
2046
out_brelse:
2047
        brelse(iloc.bh);
2048
        goto out_err;
2049
}
2050
 
2051
static int ext3_rmdir (struct inode * dir, struct dentry *dentry)
2052
{
2053
        int retval;
2054
        struct inode * inode;
2055
        struct buffer_head * bh;
2056
        struct ext3_dir_entry_2 * de;
2057
        handle_t *handle;
2058
 
2059
        /* Initialize quotas before so that eventual writes go in
2060
         * separate transaction */
2061
        DQUOT_INIT(dentry->d_inode);
2062
        handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS(dir->i_sb));
2063
        if (IS_ERR(handle))
2064
                return PTR_ERR(handle);
2065
 
2066
        retval = -ENOENT;
2067
        bh = ext3_find_entry (dentry, &de);
2068
        if (!bh)
2069
                goto end_rmdir;
2070
 
2071
        if (IS_DIRSYNC(dir))
2072
                handle->h_sync = 1;
2073
 
2074
        inode = dentry->d_inode;
2075
 
2076
        retval = -EIO;
2077
        if (le32_to_cpu(de->inode) != inode->i_ino)
2078
                goto end_rmdir;
2079
 
2080
        retval = -ENOTEMPTY;
2081
        if (!empty_dir (inode))
2082
                goto end_rmdir;
2083
 
2084
        retval = ext3_delete_entry(handle, dir, de, bh);
2085
        if (retval)
2086
                goto end_rmdir;
2087
        if (inode->i_nlink != 2)
2088
                ext3_warning (inode->i_sb, "ext3_rmdir",
2089
                              "empty directory has nlink!=2 (%d)",
2090
                              inode->i_nlink);
2091
        inode->i_version++;
2092
        clear_nlink(inode);
2093
        /* There's no need to set i_disksize: the fact that i_nlink is
2094
         * zero will ensure that the right thing happens during any
2095
         * recovery. */
2096
        inode->i_size = 0;
2097
        ext3_orphan_add(handle, inode);
2098
        inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME_SEC;
2099
        ext3_mark_inode_dirty(handle, inode);
2100
        drop_nlink(dir);
2101
        ext3_update_dx_flag(dir);
2102
        ext3_mark_inode_dirty(handle, dir);
2103
 
2104
end_rmdir:
2105
        ext3_journal_stop(handle);
2106
        brelse (bh);
2107
        return retval;
2108
}
2109
 
2110
static int ext3_unlink(struct inode * dir, struct dentry *dentry)
2111
{
2112
        int retval;
2113
        struct inode * inode;
2114
        struct buffer_head * bh;
2115
        struct ext3_dir_entry_2 * de;
2116
        handle_t *handle;
2117
 
2118
        /* Initialize quotas before so that eventual writes go
2119
         * in separate transaction */
2120
        DQUOT_INIT(dentry->d_inode);
2121
        handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS(dir->i_sb));
2122
        if (IS_ERR(handle))
2123
                return PTR_ERR(handle);
2124
 
2125
        if (IS_DIRSYNC(dir))
2126
                handle->h_sync = 1;
2127
 
2128
        retval = -ENOENT;
2129
        bh = ext3_find_entry (dentry, &de);
2130
        if (!bh)
2131
                goto end_unlink;
2132
 
2133
        inode = dentry->d_inode;
2134
 
2135
        retval = -EIO;
2136
        if (le32_to_cpu(de->inode) != inode->i_ino)
2137
                goto end_unlink;
2138
 
2139
        if (!inode->i_nlink) {
2140
                ext3_warning (inode->i_sb, "ext3_unlink",
2141
                              "Deleting nonexistent file (%lu), %d",
2142
                              inode->i_ino, inode->i_nlink);
2143
                inode->i_nlink = 1;
2144
        }
2145
        retval = ext3_delete_entry(handle, dir, de, bh);
2146
        if (retval)
2147
                goto end_unlink;
2148
        dir->i_ctime = dir->i_mtime = CURRENT_TIME_SEC;
2149
        ext3_update_dx_flag(dir);
2150
        ext3_mark_inode_dirty(handle, dir);
2151
        drop_nlink(inode);
2152
        if (!inode->i_nlink)
2153
                ext3_orphan_add(handle, inode);
2154
        inode->i_ctime = dir->i_ctime;
2155
        ext3_mark_inode_dirty(handle, inode);
2156
        retval = 0;
2157
 
2158
end_unlink:
2159
        ext3_journal_stop(handle);
2160
        brelse (bh);
2161
        return retval;
2162
}
2163
 
2164
static int ext3_symlink (struct inode * dir,
2165
                struct dentry *dentry, const char * symname)
2166
{
2167
        handle_t *handle;
2168
        struct inode * inode;
2169
        int l, err, retries = 0;
2170
 
2171
        l = strlen(symname)+1;
2172
        if (l > dir->i_sb->s_blocksize)
2173
                return -ENAMETOOLONG;
2174
 
2175
retry:
2176
        handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) +
2177
                                        EXT3_INDEX_EXTRA_TRANS_BLOCKS + 5 +
2178
                                        2*EXT3_QUOTA_INIT_BLOCKS(dir->i_sb));
2179
        if (IS_ERR(handle))
2180
                return PTR_ERR(handle);
2181
 
2182
        if (IS_DIRSYNC(dir))
2183
                handle->h_sync = 1;
2184
 
2185
        inode = ext3_new_inode (handle, dir, S_IFLNK|S_IRWXUGO);
2186
        err = PTR_ERR(inode);
2187
        if (IS_ERR(inode))
2188
                goto out_stop;
2189
 
2190
        if (l > sizeof (EXT3_I(inode)->i_data)) {
2191
                inode->i_op = &ext3_symlink_inode_operations;
2192
                ext3_set_aops(inode);
2193
                /*
2194
                 * page_symlink() calls into ext3_prepare/commit_write.
2195
                 * We have a transaction open.  All is sweetness.  It also sets
2196
                 * i_size in generic_commit_write().
2197
                 */
2198
                err = __page_symlink(inode, symname, l,
2199
                                mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS);
2200
                if (err) {
2201
                        drop_nlink(inode);
2202
                        ext3_mark_inode_dirty(handle, inode);
2203
                        iput (inode);
2204
                        goto out_stop;
2205
                }
2206
        } else {
2207
                inode->i_op = &ext3_fast_symlink_inode_operations;
2208
                memcpy((char*)&EXT3_I(inode)->i_data,symname,l);
2209
                inode->i_size = l-1;
2210
        }
2211
        EXT3_I(inode)->i_disksize = inode->i_size;
2212
        err = ext3_add_nondir(handle, dentry, inode);
2213
out_stop:
2214
        ext3_journal_stop(handle);
2215
        if (err == -ENOSPC && ext3_should_retry_alloc(dir->i_sb, &retries))
2216
                goto retry;
2217
        return err;
2218
}
2219
 
2220
static int ext3_link (struct dentry * old_dentry,
2221
                struct inode * dir, struct dentry *dentry)
2222
{
2223
        handle_t *handle;
2224
        struct inode *inode = old_dentry->d_inode;
2225
        int err, retries = 0;
2226
 
2227
        if (inode->i_nlink >= EXT3_LINK_MAX)
2228
                return -EMLINK;
2229
        /*
2230
         * Return -ENOENT if we've raced with unlink and i_nlink is 0.  Doing
2231
         * otherwise has the potential to corrupt the orphan inode list.
2232
         */
2233
        if (inode->i_nlink == 0)
2234
                return -ENOENT;
2235
 
2236
retry:
2237
        handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) +
2238
                                        EXT3_INDEX_EXTRA_TRANS_BLOCKS);
2239
        if (IS_ERR(handle))
2240
                return PTR_ERR(handle);
2241
 
2242
        if (IS_DIRSYNC(dir))
2243
                handle->h_sync = 1;
2244
 
2245
        inode->i_ctime = CURRENT_TIME_SEC;
2246
        inc_nlink(inode);
2247
        atomic_inc(&inode->i_count);
2248
 
2249
        err = ext3_add_nondir(handle, dentry, inode);
2250
        ext3_journal_stop(handle);
2251
        if (err == -ENOSPC && ext3_should_retry_alloc(dir->i_sb, &retries))
2252
                goto retry;
2253
        return err;
2254
}
2255
 
2256
#define PARENT_INO(buffer) \
2257
        (ext3_next_entry((struct ext3_dir_entry_2 *)(buffer))->inode)
2258
 
2259
/*
2260
 * Anybody can rename anything with this: the permission checks are left to the
2261
 * higher-level routines.
2262
 */
2263
static int ext3_rename (struct inode * old_dir, struct dentry *old_dentry,
2264
                           struct inode * new_dir,struct dentry *new_dentry)
2265
{
2266
        handle_t *handle;
2267
        struct inode * old_inode, * new_inode;
2268
        struct buffer_head * old_bh, * new_bh, * dir_bh;
2269
        struct ext3_dir_entry_2 * old_de, * new_de;
2270
        int retval;
2271
 
2272
        old_bh = new_bh = dir_bh = NULL;
2273
 
2274
        /* Initialize quotas before so that eventual writes go
2275
         * in separate transaction */
2276
        if (new_dentry->d_inode)
2277
                DQUOT_INIT(new_dentry->d_inode);
2278
        handle = ext3_journal_start(old_dir, 2 *
2279
                                        EXT3_DATA_TRANS_BLOCKS(old_dir->i_sb) +
2280
                                        EXT3_INDEX_EXTRA_TRANS_BLOCKS + 2);
2281
        if (IS_ERR(handle))
2282
                return PTR_ERR(handle);
2283
 
2284
        if (IS_DIRSYNC(old_dir) || IS_DIRSYNC(new_dir))
2285
                handle->h_sync = 1;
2286
 
2287
        old_bh = ext3_find_entry (old_dentry, &old_de);
2288
        /*
2289
         *  Check for inode number is _not_ due to possible IO errors.
2290
         *  We might rmdir the source, keep it as pwd of some process
2291
         *  and merrily kill the link to whatever was created under the
2292
         *  same name. Goodbye sticky bit ;-<
2293
         */
2294
        old_inode = old_dentry->d_inode;
2295
        retval = -ENOENT;
2296
        if (!old_bh || le32_to_cpu(old_de->inode) != old_inode->i_ino)
2297
                goto end_rename;
2298
 
2299
        new_inode = new_dentry->d_inode;
2300
        new_bh = ext3_find_entry (new_dentry, &new_de);
2301
        if (new_bh) {
2302
                if (!new_inode) {
2303
                        brelse (new_bh);
2304
                        new_bh = NULL;
2305
                }
2306
        }
2307
        if (S_ISDIR(old_inode->i_mode)) {
2308
                if (new_inode) {
2309
                        retval = -ENOTEMPTY;
2310
                        if (!empty_dir (new_inode))
2311
                                goto end_rename;
2312
                }
2313
                retval = -EIO;
2314
                dir_bh = ext3_bread (handle, old_inode, 0, 0, &retval);
2315
                if (!dir_bh)
2316
                        goto end_rename;
2317
                if (le32_to_cpu(PARENT_INO(dir_bh->b_data)) != old_dir->i_ino)
2318
                        goto end_rename;
2319
                retval = -EMLINK;
2320
                if (!new_inode && new_dir!=old_dir &&
2321
                                new_dir->i_nlink >= EXT3_LINK_MAX)
2322
                        goto end_rename;
2323
        }
2324
        if (!new_bh) {
2325
                retval = ext3_add_entry (handle, new_dentry, old_inode);
2326
                if (retval)
2327
                        goto end_rename;
2328
        } else {
2329
                BUFFER_TRACE(new_bh, "get write access");
2330
                ext3_journal_get_write_access(handle, new_bh);
2331
                new_de->inode = cpu_to_le32(old_inode->i_ino);
2332
                if (EXT3_HAS_INCOMPAT_FEATURE(new_dir->i_sb,
2333
                                              EXT3_FEATURE_INCOMPAT_FILETYPE))
2334
                        new_de->file_type = old_de->file_type;
2335
                new_dir->i_version++;
2336
                BUFFER_TRACE(new_bh, "call ext3_journal_dirty_metadata");
2337
                ext3_journal_dirty_metadata(handle, new_bh);
2338
                brelse(new_bh);
2339
                new_bh = NULL;
2340
        }
2341
 
2342
        /*
2343
         * Like most other Unix systems, set the ctime for inodes on a
2344
         * rename.
2345
         */
2346
        old_inode->i_ctime = CURRENT_TIME_SEC;
2347
        ext3_mark_inode_dirty(handle, old_inode);
2348
 
2349
        /*
2350
         * ok, that's it
2351
         */
2352
        if (le32_to_cpu(old_de->inode) != old_inode->i_ino ||
2353
            old_de->name_len != old_dentry->d_name.len ||
2354
            strncmp(old_de->name, old_dentry->d_name.name, old_de->name_len) ||
2355
            (retval = ext3_delete_entry(handle, old_dir,
2356
                                        old_de, old_bh)) == -ENOENT) {
2357
                /* old_de could have moved from under us during htree split, so
2358
                 * make sure that we are deleting the right entry.  We might
2359
                 * also be pointing to a stale entry in the unused part of
2360
                 * old_bh so just checking inum and the name isn't enough. */
2361
                struct buffer_head *old_bh2;
2362
                struct ext3_dir_entry_2 *old_de2;
2363
 
2364
                old_bh2 = ext3_find_entry(old_dentry, &old_de2);
2365
                if (old_bh2) {
2366
                        retval = ext3_delete_entry(handle, old_dir,
2367
                                                   old_de2, old_bh2);
2368
                        brelse(old_bh2);
2369
                }
2370
        }
2371
        if (retval) {
2372
                ext3_warning(old_dir->i_sb, "ext3_rename",
2373
                                "Deleting old file (%lu), %d, error=%d",
2374
                                old_dir->i_ino, old_dir->i_nlink, retval);
2375
        }
2376
 
2377
        if (new_inode) {
2378
                drop_nlink(new_inode);
2379
                new_inode->i_ctime = CURRENT_TIME_SEC;
2380
        }
2381
        old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME_SEC;
2382
        ext3_update_dx_flag(old_dir);
2383
        if (dir_bh) {
2384
                BUFFER_TRACE(dir_bh, "get_write_access");
2385
                ext3_journal_get_write_access(handle, dir_bh);
2386
                PARENT_INO(dir_bh->b_data) = cpu_to_le32(new_dir->i_ino);
2387
                BUFFER_TRACE(dir_bh, "call ext3_journal_dirty_metadata");
2388
                ext3_journal_dirty_metadata(handle, dir_bh);
2389
                drop_nlink(old_dir);
2390
                if (new_inode) {
2391
                        drop_nlink(new_inode);
2392
                } else {
2393
                        inc_nlink(new_dir);
2394
                        ext3_update_dx_flag(new_dir);
2395
                        ext3_mark_inode_dirty(handle, new_dir);
2396
                }
2397
        }
2398
        ext3_mark_inode_dirty(handle, old_dir);
2399
        if (new_inode) {
2400
                ext3_mark_inode_dirty(handle, new_inode);
2401
                if (!new_inode->i_nlink)
2402
                        ext3_orphan_add(handle, new_inode);
2403
        }
2404
        retval = 0;
2405
 
2406
end_rename:
2407
        brelse (dir_bh);
2408
        brelse (old_bh);
2409
        brelse (new_bh);
2410
        ext3_journal_stop(handle);
2411
        return retval;
2412
}
2413
 
2414
/*
2415
 * directories can handle most operations...
2416
 */
2417
const struct inode_operations ext3_dir_inode_operations = {
2418
        .create         = ext3_create,
2419
        .lookup         = ext3_lookup,
2420
        .link           = ext3_link,
2421
        .unlink         = ext3_unlink,
2422
        .symlink        = ext3_symlink,
2423
        .mkdir          = ext3_mkdir,
2424
        .rmdir          = ext3_rmdir,
2425
        .mknod          = ext3_mknod,
2426
        .rename         = ext3_rename,
2427
        .setattr        = ext3_setattr,
2428
#ifdef CONFIG_EXT3_FS_XATTR
2429
        .setxattr       = generic_setxattr,
2430
        .getxattr       = generic_getxattr,
2431
        .listxattr      = ext3_listxattr,
2432
        .removexattr    = generic_removexattr,
2433
#endif
2434
        .permission     = ext3_permission,
2435
};
2436
 
2437
const struct inode_operations ext3_special_inode_operations = {
2438
        .setattr        = ext3_setattr,
2439
#ifdef CONFIG_EXT3_FS_XATTR
2440
        .setxattr       = generic_setxattr,
2441
        .getxattr       = generic_getxattr,
2442
        .listxattr      = ext3_listxattr,
2443
        .removexattr    = generic_removexattr,
2444
#endif
2445
        .permission     = ext3_permission,
2446
};

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.