Whamcloud - gitweb
86065bd033125a6855c0fb87a49afc8f5fdd2c9d
[fs/lustre-release.git] / lustre / obdfs / namei.c
1 /*
2  *  linux/fs/obdfs/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/ext2/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  * 
20  *  Changes for use in OBDFS
21  *  Copyright (c) 1999, Seagate Technology Inc.
22  * 
23  */
24
25 #include <asm/uaccess.h>
26
27 #include <linux/errno.h>
28 #include <linux/fs.h>
29 #include <linux/ext2_fs.h>
30 #include <linux/fcntl.h>
31 #include <linux/sched.h>
32 #include <linux/stat.h>
33 #include <linux/string.h>
34 #include <linux/locks.h>
35 #include <linux/quotaops.h>
36 #include <linux/iobuf.h>
37
38 #include <linux/obd_support.h>
39 #include <linux/obdfs.h>
40
41 /*
42  * define how far ahead to read directories while searching them.
43  */
44 #define NAMEI_RA_CHUNKS  2
45 #define NAMEI_RA_BLOCKS  4
46 #define NAMEI_RA_SIZE        (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS)
47 #define NAMEI_RA_INDEX(c,b)  (((c) * NAMEI_RA_BLOCKS) + (b))
48
49 /*
50  * NOTE! unlike strncmp, ext2_match returns 1 for success, 0 for failure.
51  *
52  * `len <= EXT2_NAME_LEN' is guaranteed by caller.
53  * `de != NULL' is guaranteed by caller.
54  */
55 static inline int ext2_match (int len, const char * const name,
56                        struct ext2_dir_entry_2 * de)
57 {
58         if (len != de->name_len)
59                 return 0;
60         if (!de->inode)
61                 return 0;
62         return !memcmp(name, de->name, len);
63 }
64
65 /*
66  *      ext2_find_entry()
67  *
68  * finds an entry in the specified directory with the wanted name. It
69  * returns the cache buffer in which the entry was found, and the entry
70  * itself (as a parameter - res_dir). It does NOT read the inode of the
71  * entry - you'll have to do that yourself if you want to.
72  */
73 static struct page * obdfs_find_entry (struct inode * dir,
74                                              const char * const name, int namelen,
75                                              struct ext2_dir_entry_2 ** res_dir, int lock)
76 {
77         struct super_block * sb;
78         unsigned long offset;
79         struct page * page;
80         ENTRY;
81         CDEBUG(D_INODE, "find entry for %*s\n", namelen, name);
82
83         *res_dir = NULL;
84         sb = dir->i_sb;
85
86         if (namelen > EXT2_NAME_LEN)
87                 return NULL;
88
89         CDEBUG(D_INODE, "dirsize is %Ld\n", dir->i_size);
90
91         page = 0;
92         offset = 0;
93         while ( offset < dir->i_size ) {
94                 struct ext2_dir_entry_2 * de;
95                 char * dlimit;
96
97                 page = obdfs_getpage(dir, offset, 0, lock);
98
99                 if ( !page ) {
100                         CDEBUG(D_INODE, "No page, offset %lx\n", offset);
101                         return NULL;
102                 }
103
104                 de = (struct ext2_dir_entry_2 *) page_address(page);
105                 dlimit = (char *)page_address(page) + PAGE_SIZE; 
106                 while ((char *) de < dlimit) {
107                         /* this code is executed quadratically often */
108                         /* do minimal checking `by hand' */
109                         int de_len;
110                         /* CDEBUG(D_INODE, "Entry %p len %d, page at %#lx - %#lx , offset %lx\n",
111                                de, le16_to_cpu(de->rec_len), page_address(page),
112                                page_address(page) + PAGE_SIZE, offset); */
113
114                         if ((char *) de + namelen <= dlimit &&
115                             ext2_match (namelen, name, de)) {
116                                 /* found a match -
117                                    just to be sure, do a full check */
118                                 if (!obdfs_check_dir_entry("ext2_find_entry",
119                                                           dir, de, page, offset))
120                                         goto failure;
121                                 *res_dir = de;
122                                 EXIT;
123                                 return page;
124                         }
125                         /* prevent looping on a bad block */
126                         de_len = le16_to_cpu(de->rec_len);
127                         if (de_len <= 0) {
128                                 printk("Bad entry at %p len %d\n", de, de_len);
129                                 goto failure;
130                         }
131                         offset += de_len;
132                         de = (struct ext2_dir_entry_2 *)
133                                 ((char *) de + de_len);
134                         /* CDEBUG(D_INODE, "Next while %lx\n", offset); */
135                 }
136                 if ( lock ) 
137                         UnlockPage(page);
138                 page_cache_release(page);
139                 page = NULL;
140                 CDEBUG(D_INODE, "Next for %lx\n", offset);
141         }
142
143 failure:
144         CDEBUG(D_INODE, "Negative case, page %p, offset %ld\n", page, offset);
145         if (page) {
146                 if (lock) 
147                         UnlockPage(page);
148                 page_cache_release(page);
149         }
150         EXIT;
151         return NULL;
152 }
153
154 struct dentry *obdfs_lookup(struct inode * dir, struct dentry *dentry)
155 {
156         struct inode * inode;
157         struct ext2_dir_entry_2 * de;
158         struct page * page;
159         ENTRY;
160
161         if (dentry->d_name.len > EXT2_NAME_LEN)
162                 return ERR_PTR(-ENAMETOOLONG);
163
164         page = obdfs_find_entry (dir, dentry->d_name.name, dentry->d_name.len, &de, LOCKED);
165         inode = NULL;
166         if ( !page ) 
167                 CDEBUG(D_INODE, "No page - negative entry.\n");
168         if ( page && !de ) {
169                 CDEBUG(D_INODE, "Danger: PAGE but de.\n");
170                 return ERR_PTR(-ENOENT);
171         }
172         if (page) {
173                 unsigned long ino = le32_to_cpu(de->inode);
174                 UnlockPage(page);
175                 page_cache_release(page);
176                 inode = iget(dir->i_sb, ino);
177
178                 if (!inode) { 
179                         CDEBUG(D_INODE, "No inode.\n");
180                         EXIT;
181                         return ERR_PTR(-EACCES);
182                 }
183         }
184         d_add(dentry, inode);
185         EXIT;
186         return NULL;
187 }
188
189
190 /*
191  *      ext2_add_entry()
192  *
193  * adds a file entry to the specified directory, using the same
194  * semantics as ext2_find_entry(). It returns NULL if it failed.
195  *
196  * NOTE!! The inode part of 'de' is left at 0 - which means you
197  * may not sleep between calling this and putting something into
198  * the entry, as someone else might have used it while you slept.
199
200  * returns a locked and held page upon success 
201  */
202 static struct page *obdfs_add_entry (struct inode * dir,
203                                      const char * name, int namelen,
204                                      struct ext2_dir_entry_2 ** res_dir,
205                                      int *err)
206 {
207         unsigned long offset;
208         unsigned short rec_len;
209         struct page *page;
210         struct ext2_dir_entry_2 * de, * de1;
211         struct super_block * sb;
212
213         ENTRY;
214         *err = -EINVAL;
215         *res_dir = NULL;
216         if (!dir || !dir->i_nlink) {
217                 EXIT;
218                 return NULL;
219         }
220         sb = dir->i_sb;
221
222         if (!namelen) { 
223                 EXIT;
224                 return NULL;
225         }
226         /*
227          * Is this a busy deleted directory?  Can't create new files if so
228          */
229         if (dir->i_size == 0)
230         {
231                 EXIT;
232                 *err = -ENOENT;
233                 return NULL;
234         }
235         page = obdfs_getpage(dir, 0, 0, LOCKED);
236         if (!page) {
237                 EXIT;
238                 return NULL;
239         }
240         rec_len = EXT2_DIR_REC_LEN(namelen);
241         CDEBUG(D_INODE, "reclen: %d\n", rec_len);
242         offset = 0;
243         de = (struct ext2_dir_entry_2 *) page_address(page);
244         *err = -ENOSPC;
245         while (1) {
246                 CDEBUG(D_INODE, "Considering entry at %p, (page at %#lx - %#lx), offset %ld\n",
247                        de, page_address(page), page_address(page) + PAGE_SIZE, offset);
248                 if ((char *)de >= PAGE_SIZE + (char *)page_address(page)) {
249                         UnlockPage(page);
250                         page_cache_release(page);
251                         page = obdfs_getpage(dir, offset, 1, LOCKED);
252                         if (!page) {
253                                 EXIT;
254                                 return NULL;
255                         }
256                         if (dir->i_size <= offset) {
257                                 if (dir->i_size == 0) {
258                                         *err = -ENOENT;
259                                         EXIT;
260                                         return NULL;
261                                 }
262
263                                 CDEBUG(D_INODE, "creating next block\n");
264
265                                 de = (struct ext2_dir_entry_2 *) page_address(page);
266                                 de->inode = 0;
267                                 de->rec_len = le16_to_cpu(PAGE_SIZE);
268                                 dir->i_size = offset + PAGE_SIZE;
269                                 dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL;
270                                 mark_inode_dirty(dir);
271                         } else {
272
273                                 ext2_debug ("skipping to next block\n");
274
275                                 de = (struct ext2_dir_entry_2 *) page_address(page);
276                         }
277                 }
278                 CDEBUG(D_INODE, "\n");
279                 if (!obdfs_check_dir_entry ("ext2_add_entry", dir, de, page,
280                                            offset)) {
281                         *err = -ENOENT;
282                         UnlockPage(page);
283                         page_cache_release(page);
284                         EXIT;
285                         return NULL;
286                 }
287                 CDEBUG(D_INODE, "\n");
288                 if (ext2_match (namelen, name, de)) {
289                                 *err = -EEXIST;
290                                 UnlockPage(page);
291                                 page_cache_release(page);
292                                 EXIT;
293                                 return NULL;
294                 }
295                 CDEBUG(D_INODE, "Testing for enough space at de %p\n", de);
296                 if ( (le32_to_cpu(de->inode) == 0 && le16_to_cpu(de->rec_len) >= rec_len) ||
297                      (le16_to_cpu(de->rec_len) >= EXT2_DIR_REC_LEN(de->name_len) + rec_len)) {
298                         offset += le16_to_cpu(de->rec_len);
299                         CDEBUG(D_INODE, "Found enough space de %p, offset %#lx\n", de, offset);
300                         if (le32_to_cpu(de->inode)) {
301                                 CDEBUG(D_INODE, "Inserting new in %p\n", de);
302                                 de1 = (struct ext2_dir_entry_2 *) ((char *) de +
303                                         EXT2_DIR_REC_LEN(de->name_len));
304                                 CDEBUG(D_INODE, "-- de1 at %p\n", de1);
305                                 de1->rec_len = cpu_to_le16(le16_to_cpu(de->rec_len) -
306                                         EXT2_DIR_REC_LEN(de->name_len));
307                                 de->rec_len = cpu_to_le16(EXT2_DIR_REC_LEN(de->name_len));
308                                 de = de1;
309                         }
310                         CDEBUG(D_INODE, "Reclen adjusted; copy %d bytes to %p, page at %#lx EOP at %#lx\n", namelen, de->name, page_address(page), page_address(page) + PAGE_SIZE);
311                         de->inode = 0;
312                         de->name_len = namelen;
313                         de->file_type = 0;
314                         memcpy (de->name, name, namelen);
315                         CDEBUG(D_INODE, "Copy done\n");
316                         /*
317                          * XXX shouldn't update any times until successful
318                          * completion of syscall, but too many callers depend
319                          * on this.
320                          *
321                          * XXX similarly, too many callers depend on
322                          * ext2_new_inode() setting the times, but error
323                          * recovery deletes the inode, so the worst that can
324                          * happen is that the times are slightly out of date
325                          * and/or different from the directory change time.
326                          */
327                         dir->i_mtime = dir->i_ctime = CURRENT_TIME;
328                         dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL;
329                         mark_inode_dirty(dir);
330                         dir->i_version = ++event;
331                         *res_dir = de;
332                         *err = 0;
333                         PDEBUG(page, "addentry");
334                         CDEBUG(D_INODE, "Regular exit from add_entry");
335                         EXIT;
336                         return page;
337                 }
338                 CDEBUG(D_INODE, "\n");
339                 offset += le16_to_cpu(de->rec_len);
340                 de = (struct ext2_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len));
341                 
342         }
343         CDEBUG(D_INODE, "\n");
344
345         UnlockPage(page);
346         page_cache_release(page);
347         PDEBUG(page, "addentry");
348         EXIT;
349         return NULL;
350 }
351
352 /*
353  * ext2_delete_entry deletes a directory entry by merging it with the
354  * previous entry
355  */
356 static int obdfs_delete_entry (struct ext2_dir_entry_2 * dir,
357                               struct page * page)
358 {
359         struct ext2_dir_entry_2 * de, * pde;
360         int i;
361
362         i = 0;
363         pde = NULL;
364         de = (struct ext2_dir_entry_2 *) page_address(page);
365         while (i < PAGE_SIZE) {
366                 if (!obdfs_check_dir_entry ("ext2_delete_entry", NULL, 
367                                            de, page, i))
368                         return -EIO;
369                 if (de == dir)  {
370                         if (pde)
371                                 pde->rec_len =
372                                         cpu_to_le16(le16_to_cpu(pde->rec_len) +
373                                                     le16_to_cpu(dir->rec_len));
374                         else
375                                 dir->inode = 0;
376                         return 0;
377                 }
378                 i += le16_to_cpu(de->rec_len);
379                 pde = de;
380                 de = (struct ext2_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len));
381         }
382         return -ENOENT;
383 }
384
385
386 static inline void ext2_set_de_type(struct super_block *sb,
387                                 struct ext2_dir_entry_2 *de,
388                                 umode_t mode) {
389         if (!EXT2_HAS_INCOMPAT_FEATURE(sb, EXT2_FEATURE_INCOMPAT_FILETYPE))
390                 return;
391         if (S_ISCHR(mode))
392                 de->file_type = EXT2_FT_CHRDEV;
393         else if (S_ISBLK(mode))
394                 de->file_type = EXT2_FT_BLKDEV;
395         else if (S_ISFIFO(mode))  
396                 de->file_type = EXT2_FT_FIFO;
397         else if (S_ISLNK(mode))
398                 de->file_type = EXT2_FT_SYMLINK;
399         else if (S_ISREG(mode))
400                 de->file_type = EXT2_FT_REG_FILE;
401         else if (S_ISDIR(mode))  
402                 de->file_type = EXT2_FT_DIR;
403 }
404
405
406 /*
407  * Display all dentries holding the specified inode.
408  */
409 #if 0
410 static void show_dentry(struct list_head * dlist, int subdirs)
411 {
412         struct list_head *tmp = dlist;
413
414         while ((tmp = tmp->next) != dlist) {
415                 struct dentry * dentry;
416                 const char * unhashed = "";
417
418                 if ( subdirs ) 
419                         dentry  = list_entry(tmp, struct dentry, d_child);
420                 else 
421                         dentry  = list_entry(tmp, struct dentry, d_alias);
422
423                 if (list_empty(&dentry->d_hash))
424                         unhashed = "(unhashed)";
425
426                 if ( dentry->d_inode ) 
427                         printk("show_dentry: %s/%s, d_count=%d%s (ino %ld, dev %d, ct %d)\n",
428                                dentry->d_parent->d_name.name,
429                                dentry->d_name.name, dentry->d_count,
430                                unhashed, dentry->d_inode->i_ino, 
431                                dentry->d_inode->i_dev, 
432                                dentry->d_inode->i_count);
433                 else 
434                         printk("show_dentry: %s/%s, d_count=%d%s \n",
435                                dentry->d_parent->d_name.name,
436                                dentry->d_name.name, dentry->d_count,
437                                unhashed);
438         }
439 }
440 #endif
441
442
443 /*
444  * By the time this is called, we already have created
445  * the directory cache entry for the new file, but it
446  * is so far negative - it has no inode.
447  *
448  * If the create succeeds, we fill in the inode information
449  * with d_instantiate(). 
450  */
451 int obdfs_create (struct inode * dir, struct dentry * dentry, int mode)
452 {
453         struct inode * inode;
454         struct page *page;
455         struct ext2_dir_entry_2 * de;
456         int err = -EIO;
457         struct obdo *oa;
458
459         ENTRY;
460
461         oa = obdo_alloc(oa);
462         if (!oa) {
463                 EXIT;
464                 return -ENOMEM;
465         }
466
467         err = IOPS(dir, create)(IID(dir), 0, oa);
468
469         if ( err ) 
470                 return err;
471         obdo_to_inode(inode, oa);
472         inode = iget(dir->i_sb, inode->i_ino);
473         if (!inode || !list_empty(&inode->i_dentry)) {
474                 CDEBUG(D_INODE, "No inode, ino %ld\n", inode->i_ino);
475                 obdo_free(oa);
476                 EXIT;
477                 return -EIO;
478         }
479
480         inode->i_op = &obdfs_file_inode_operations;
481         inode->i_mode = mode;
482         mark_inode_dirty(inode);
483         page = obdfs_add_entry (dir, dentry->d_name.name, dentry->d_name.len,
484                                 &de, &err);
485         if (!page) {
486                 inode->i_nlink--;
487                 mark_inode_dirty(inode);
488                 iput (inode);
489                 obdo_free(oa);
490                 EXIT;
491                 return err;
492         }
493         de->inode = cpu_to_le32(inode->i_ino);
494         ext2_set_de_type(dir->i_sb, de, S_IFREG);
495         dir->i_version = ++event;
496         oa->o_id = dir->i_ino; /* Note: this is a different OA than above */
497         err = IOPS(dir, brw)(WRITE, IID(dir), oa, (char *)page_address(page),
498                              PAGE_SIZE, (page->index) << PAGE_SHIFT, 0);
499         obdo_free(oa);
500         UnlockPage(page);
501 #if 0
502         if (IS_SYNC(dir)) {
503                 ll_rw_block (WRITE, 1, &bh);
504                 wait_on_buffer (bh);
505         }
506 #endif
507         page_cache_release(page);
508         d_instantiate(dentry, inode);
509         EXIT;
510         return 0;
511 }
512
513 int obdfs_mknod (struct inode * dir, struct dentry *dentry, int mode, int rdev)
514 {
515         struct inode * inode;
516         struct page *page;
517         struct ext2_dir_entry_2 * de;
518         struct obdo *oa;
519         int err;
520
521         ENTRY;
522
523         oa = obdo_alloc();
524         if (!oa) {
525                 EXIT;
526                 return -ENOMEM;
527         }
528         err = IOPS(dir, create)(IID(dir), 0, oa);
529         if ( err ) 
530                 return err;
531         obdo_to_inode(inode, oa);
532         inode = iget(dir->i_sb, inode->i_ino);
533         if (!inode) {
534                 obdo_free(oa);
535                 EXIT;
536                 return -EIO;
537         }
538
539         inode->i_uid = current->fsuid;
540         init_special_inode(inode, mode, rdev);
541         page = obdfs_add_entry (dir, dentry->d_name.name, dentry->d_name.len,
542                                 &de, &err);
543         if (!page)
544                 goto out_no_entry;
545         de->inode = cpu_to_le32(inode->i_ino);
546         dir->i_version = ++event;
547         ext2_set_de_type(dir->i_sb, de, inode->i_mode);
548         mark_inode_dirty(inode);
549         oa->o_id = dir->i_ino; /* Note: this is a different OA than above */
550         err = IOPS(dir, brw)(WRITE, IID(dir), oa, (char *)page_address(page),
551                                PAGE_SIZE, (page->index) << PAGE_SHIFT, 0);
552         UnlockPage(page);
553         obdo_free(oa);
554
555 #if 0
556         if (IS_SYNC(dir)) {
557                 ll_rw_block (WRITE, 1, &bh);
558                 wait_on_buffer (bh);
559         }
560 #endif
561         d_instantiate(dentry, inode);
562         page_cache_release(page);
563         err = 0;
564 out:
565         return err;
566
567 out_no_entry:
568         inode->i_nlink--;
569         mark_inode_dirty(inode);
570         iput(inode);
571         goto out;
572 }
573
574 int obdfs_mkdir(struct inode * dir, struct dentry * dentry, int mode)
575 {
576         struct inode * inode;
577         struct page *page, *inode_page;
578         struct ext2_dir_entry_2 * de;
579         struct obdo *ioa, *doa;
580         int err;
581
582         ENTRY;
583
584         err = -EMLINK;
585         if (dir->i_nlink >= EXT2_LINK_MAX)
586                 goto out;
587
588         ioa = obdo_alloc();
589         if (!ioa) {
590                 EXIT;
591                 return -ENOMEM;
592         }
593         doa = obdo_alloc();
594         if (!ioa) {
595                 EXIT;
596                 return -ENOMEM;
597         }
598
599         err = IOPS(dir, create)(IID(dir), 0, ioa);
600         if ( err ) {
601                 obdo_free(oa);
602                 EXIT;
603                 return err;
604         }
605         obdo_to_inode(inode, ioa);
606         inode = iget(dir->i_sb, inode->i_ino);
607         if (!inode) {
608                 obdo_free(oa);
609                 EXIT;
610                 return -EIO;
611         }
612
613         inode->i_op = &obdfs_dir_inode_operations;
614         inode->i_blocks = 0;    
615         inode_page = obdfs_getpage(inode, 0, 1, LOCKED);
616         if (!inode_page) {
617                 inode->i_nlink--; /* is this nlink == 0? */
618                 mark_inode_dirty(inode);
619                 iput (inode);
620                 obdo_free(oa);
621                 return err;
622         }
623
624         /* create . and .. */
625         de = (struct ext2_dir_entry_2 *) page_address(inode_page);
626         de->inode = cpu_to_le32(inode->i_ino);
627         de->name_len = 1;
628         de->rec_len = cpu_to_le16(EXT2_DIR_REC_LEN(de->name_len));
629         strcpy (de->name, ".");
630         ext2_set_de_type(dir->i_sb, de, S_IFDIR);
631         
632         de = (struct ext2_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len));
633         de->inode = cpu_to_le32(dir->i_ino);
634         de->rec_len = cpu_to_le16(PAGE_SIZE - EXT2_DIR_REC_LEN(1));
635         de->name_len = 2;
636         strcpy (de->name, "..");
637         ext2_set_de_type(dir->i_sb, de, S_IFDIR);
638         
639         oa->o_id = dir->i_ino;
640         err = IOPS(dir, brw)(WRITE, IID(dir), oa, (char *)page_address(inode_page),
641                              PAGE_SIZE, (inode_page->index) << PAGE_SHIFT, 1);
642
643         obdo_to_inode(dir, doa); /* copy o_blocks to i_blocks */
644         obdo_free(doa);
645
646         inode->i_blocks = PAGE_SIZE/inode->i_sb->s_blocksize;
647         inode->i_size = PAGE_SIZE;
648         UnlockPage(inode_page);
649         page_cache_release(inode_page);
650
651         inode->i_nlink = 2;
652         inode->i_mode = S_IFDIR | mode;
653         if (dir->i_mode & S_ISGID)
654                 inode->i_mode |= S_ISGID;
655         mark_inode_dirty(inode);
656
657         /* now deal with the parent */
658         page = obdfs_add_entry(dir, dentry->d_name.name, dentry->d_name.len, &de, &err);
659         if (!page) {
660                 goto out_no_entry;
661         }
662
663         de->inode = cpu_to_le32(inode->i_ino);
664         ext2_set_de_type(dir->i_sb, de, S_IFDIR);
665         dir->i_version = ++event;
666
667 #if 0
668         if (IS_SYNC(dir)) {
669                 ll_rw_block (WRITE, 1, &bh);
670                 wait_on_buffer (bh);
671         }
672 #endif
673         dir->i_nlink++;
674         dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL;
675         mark_inode_dirty(dir);
676         iops(dir)->o_brw(WRITE, iid(dir), dir, page, 1);
677         UnlockPage(page);
678         page_cache_release(page);
679         d_instantiate(dentry, inode);
680         err = 0;
681 out:
682         EXIT;
683         return err;
684
685 out_no_entry:
686         inode->i_nlink = 0;
687         mark_inode_dirty(inode);
688         iput (inode);
689         EXIT;
690         goto out;
691 }
692
693
694 /*
695  * routine to check that the specified directory is empty (for rmdir)
696  */
697 static int empty_dir (struct inode * inode)
698 {
699         unsigned long offset;
700         struct page *page;
701         struct ext2_dir_entry_2 * de, * de1;
702         struct super_block * sb;
703
704         sb = inode->i_sb;
705         if (inode->i_size < EXT2_DIR_REC_LEN(1) + EXT2_DIR_REC_LEN(2) ||
706             !(page = obdfs_getpage (inode, 0, 0, LOCKED))) {
707                 ext2_warning (inode->i_sb, "empty_dir",
708                               "bad directory (dir #%lu) - no data block",
709                               inode->i_ino);
710                 return 1;
711         }
712         de = (struct ext2_dir_entry_2 *) page_address(page);
713         de1 = (struct ext2_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len));
714         if (le32_to_cpu(de->inode) != inode->i_ino || !le32_to_cpu(de1->inode) || 
715             strcmp (".", de->name) || strcmp ("..", de1->name)) {
716                 ext2_warning (inode->i_sb, "empty_dir",
717                               "bad directory (dir #%lu) - no `.' or `..'",
718                               inode->i_ino);
719                 page_cache_release(page);
720                 return 1;
721         }
722         offset = le16_to_cpu(de->rec_len) + le16_to_cpu(de1->rec_len);
723         de = (struct ext2_dir_entry_2 *) ((char *) de1 + le16_to_cpu(de1->rec_len));
724         while (offset < inode->i_size ) {
725                 if (!page || (void *) de >= (void *) (page_address(page) + PAGE_SIZE)) {
726                         if (page) {
727                                 UnlockPage(page);
728                                 page_cache_release(page);
729                         }
730                         page = obdfs_getpage(inode, offset, 0, LOCKED);
731                         if (!page) {
732 #if 0
733                                 ext2_error (sb, "empty_dir",
734                                             "directory #%lu contains a hole at offset %lu",
735                                             inode->i_ino, offset);
736 #endif
737                                 offset += sb->s_blocksize;
738                                 continue;
739                         }
740                         de = (struct ext2_dir_entry_2 *) page_address(page);
741                 }
742                 if (!obdfs_check_dir_entry ("empty_dir", inode, de, page,
743                                            offset)) {
744                         UnlockPage(page);
745                         page_cache_release(page);
746                         return 1;
747                 }
748                 if (le32_to_cpu(de->inode)) {
749                         UnlockPage(page);
750                         page_cache_release(page);
751                         return 0;
752                 }
753                 offset += le16_to_cpu(de->rec_len);
754                 de = (struct ext2_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len));
755         }
756         UnlockPage(page);
757         page_cache_release(page);
758         return 1;
759 }
760
761 int obdfs_rmdir (struct inode * dir, struct dentry *dentry)
762 {
763         int retval;
764         struct inode * inode;
765         struct page *page;
766         struct ext2_dir_entry_2 * de;
767
768         ENTRY;
769
770         retval = -ENOENT;
771         page = obdfs_find_entry (dir, dentry->d_name.name, dentry->d_name.len, &de, LOCKED);
772         if (!page)
773                 goto end_rmdir;
774
775         inode = dentry->d_inode;
776         DQUOT_INIT(inode);
777
778         retval = -EIO;
779         if (le32_to_cpu(de->inode) != inode->i_ino)
780                 goto end_rmdir;
781
782         retval = -ENOTEMPTY;
783         if (!empty_dir (inode))
784                 goto end_rmdir;
785
786         retval = obdfs_delete_entry (de, page);
787         dir->i_version = ++event;
788         if (retval)
789                 goto end_rmdir;
790         iops(dir)->o_brw(WRITE, iid(dir), dir, page, 0);
791         UnlockPage(page);
792 #if 0
793         if (IS_SYNC(dir)) {
794                 ll_rw_block (WRITE, 1, &bh);
795                 wait_on_buffer (bh);
796         }
797 #endif
798         if (inode->i_nlink != 2)
799                 ext2_warning (inode->i_sb, "ext2_rmdir",
800                               "empty directory has nlink!=2 (%d)",
801                               inode->i_nlink);
802         inode->i_version = ++event;
803         inode->i_nlink = 0;
804         inode->i_size = 0;
805         mark_inode_dirty(inode);
806         dir->i_nlink--;
807         inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
808         dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL;
809         mark_inode_dirty(dir);
810         d_delete(dentry);
811
812 end_rmdir:
813         if ( page )
814                 page_cache_release(page);
815         EXIT;
816         return retval;
817 }
818
819 int obdfs_unlink(struct inode * dir, struct dentry *dentry)
820 {
821         int retval;
822         struct inode * inode;
823         struct page *page;
824         struct ext2_dir_entry_2 * de;
825
826         ENTRY;
827
828         retval = -ENOENT;
829         page = obdfs_find_entry (dir, dentry->d_name.name, dentry->d_name.len, &de, LOCKED);
830         if (!page)
831                 goto end_unlink;
832
833         inode = dentry->d_inode;
834         DQUOT_INIT(inode);
835
836         retval = -EIO;
837         if (le32_to_cpu(de->inode) != inode->i_ino)
838                 goto end_unlink;
839         
840         if (!inode->i_nlink) {
841                 ext2_warning (inode->i_sb, "ext2_unlink",
842                               "Deleting nonexistent file (%lu), %d",
843                               inode->i_ino, inode->i_nlink);
844                 inode->i_nlink = 1;
845         }
846         retval = obdfs_delete_entry (de, page);
847         if (retval)
848                 goto end_unlink;
849         dir->i_version = ++event;
850         iops(dir)->o_brw(WRITE, iid(dir), dir, page, 0);
851         UnlockPage(page);
852 #if 0
853         if (IS_SYNC(dir)) {
854                 ll_rw_block (WRITE, 1, &bh);
855                 wait_on_buffer (bh);
856         }
857 #endif
858         dir->i_ctime = dir->i_mtime = CURRENT_TIME;
859         dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL;
860         mark_inode_dirty(dir);
861         inode->i_nlink--;
862         mark_inode_dirty(inode);
863         inode->i_ctime = dir->i_ctime;
864         retval = 0;
865         d_delete(dentry);       /* This also frees the inode */
866
867 end_unlink:
868         if (page)
869                 page_cache_release(page);
870         EXIT;
871         return retval;
872 }
873
874 int obdfs_symlink (struct inode * dir, struct dentry *dentry, const char * symname)
875 {
876         struct ext2_dir_entry_2 * de;
877         struct inode * inode;
878         struct page* page = NULL, * name_page = NULL;
879         char * link;
880         int i, l, err = -EIO;
881         char c;
882         obd_id id;
883
884         ENTRY;
885         /*
886          * N.B. Several error exits in ext2_new_inode don't set err.
887          */
888         err = iops(dir)->o_create(iid(dir), 0, &id);
889         if ( err )  {
890                 EXIT;
891                 return err;
892         }
893         inode =  iget(dir->i_sb, (ino_t)id);
894         if (!inode) {
895                 EXIT;
896                 return err;
897         }
898         inode->i_mode = S_IFLNK | S_IRWXUGO;
899         inode->i_op = &obdfs_symlink_inode_operations;
900         for (l = 0; l < inode->i_sb->s_blocksize - 1 &&
901              symname [l]; l++)
902                 ;
903
904         if (l >= sizeof (inode->u.ext2_i.i_data)) {
905                 CDEBUG(D_INODE, "l=%d, normal symlink\n", l);
906
907                 name_page = obdfs_getpage(inode, 0, 1, LOCKED);
908                 if (!name_page) {
909                         inode->i_nlink--;
910                         mark_inode_dirty(inode);
911                         iput (inode);
912                         EXIT;
913                         return err;
914                 }
915                 link = (char *)page_address(name_page);
916         } else {
917                 link = (char *) inode->u.ext2_i.i_data;
918
919                 CDEBUG(D_INODE, "l=%d, fast symlink\n", l);
920
921         }
922         i = 0;
923         while (i < inode->i_sb->s_blocksize - 1 && (c = *(symname++)))
924                 link[i++] = c;
925         link[i] = 0;
926         if (name_page) {
927                 iops(inode)->o_brw(WRITE, iid(inode), inode, name_page, 1);
928                 PDEBUG(name_page, "symlink");
929                 UnlockPage(name_page);
930                 page_cache_release(name_page);
931         }
932         inode->i_size = i;
933         mark_inode_dirty(inode);
934
935         page = obdfs_add_entry (dir, dentry->d_name.name, dentry->d_name.len, &de, &err);
936         if (!page)
937                 goto out_no_entry;
938         de->inode = cpu_to_le32(inode->i_ino);
939         ext2_set_de_type(dir->i_sb, de, S_IFLNK);
940         dir->i_version = ++event;
941         iops(dir)->o_brw(WRITE, iid(dir), dir, page, 1);
942         UnlockPage(page);
943 #if 0
944         if (IS_SYNC(dir)) {
945                 ll_rw_block (WRITE, 1, &bh);
946                 wait_on_buffer (bh);
947         }
948 #endif
949         d_instantiate(dentry, inode);
950         err = 0;
951 out:
952         EXIT;
953         return err;
954
955 out_no_entry:
956         inode->i_nlink--;
957         mark_inode_dirty(inode);
958         iput (inode);
959         goto out;
960 }
961
962 int obdfs_link (struct dentry * old_dentry,
963                 struct inode * dir, struct dentry *dentry)
964 {
965         struct inode *inode = old_dentry->d_inode;
966         struct ext2_dir_entry_2 * de;
967         struct page *page;
968         int err;
969
970         ENTRY;
971
972         if (S_ISDIR(inode->i_mode))
973                 return -EPERM;
974
975         if (inode->i_nlink >= EXT2_LINK_MAX)
976                 return -EMLINK;
977
978         page = obdfs_add_entry (dir, dentry->d_name.name, dentry->d_name.len, &de, &err);
979         if (!page)
980                 return err;
981
982         de->inode = cpu_to_le32(inode->i_ino);
983         ext2_set_de_type(dir->i_sb, de, inode->i_mode);
984         dir->i_version = ++event;
985         iops(dir)->o_brw(WRITE, iid(dir), dir, page, 0);
986         UnlockPage(page);
987
988 #if 0
989         if (IS_SYNC(dir)) {
990                 ll_rw_block (WRITE, 1, &bh);
991                 wait_on_buffer (bh);
992         }
993 #endif
994         page_cache_release(page);
995         inode->i_nlink++;
996         inode->i_ctime = CURRENT_TIME;
997         mark_inode_dirty(inode);
998         inode->i_count++;
999         d_instantiate(dentry, inode);
1000         return 0;
1001 }
1002
1003 #define PARENT_INO(buffer) \
1004         ((struct ext2_dir_entry_2 *) ((char *) buffer + \
1005         le16_to_cpu(((struct ext2_dir_entry_2 *) buffer)->rec_len)))->inode
1006
1007 /*
1008  * Anybody can rename anything with this: the permission checks are left to the
1009  * higher-level routines.
1010  */
1011 int obdfs_rename (struct inode * old_dir, struct dentry *old_dentry,
1012                            struct inode * new_dir, struct dentry *new_dentry)
1013 {
1014         struct inode * old_inode, * new_inode;
1015         struct page * old_page, * new_page, * dir_page;
1016         struct ext2_dir_entry_2 * old_de, * new_de;
1017         int retval;
1018
1019         ENTRY;
1020
1021         new_page = dir_page = NULL;
1022
1023         /* does the old entry exist? - if not get out */
1024         old_page = obdfs_find_entry (old_dir, old_dentry->d_name.name, old_dentry->d_name.len, &old_de, NOLOCK);
1025         PDEBUG(old_page, "rename - old page");
1026         /*
1027          *  Check for inode number is _not_ due to possible IO errors.
1028          *  We might rmdir the source, keep it as pwd of some process
1029          *  and merrily kill the link to whatever was created under the
1030          *  same name. Goodbye sticky bit ;-<
1031          */
1032         old_inode = old_dentry->d_inode;
1033         retval = -ENOENT;
1034         if (!old_page || le32_to_cpu(old_de->inode) != old_inode->i_ino)
1035                 goto end_rename;
1036
1037         /* find new inode */
1038         new_inode = new_dentry->d_inode;
1039         new_page = obdfs_find_entry (new_dir, new_dentry->d_name.name,
1040                                 new_dentry->d_name.len, &new_de, NOLOCK);
1041         PDEBUG(new_page, "rename - new page ");
1042         if (new_page) {
1043                 if (!new_inode) {
1044                         page_cache_release(new_page);
1045                         new_page = NULL;
1046                 } else {
1047                         DQUOT_INIT(new_inode);
1048                 }
1049         }
1050         /* in this case we to check more ... */
1051         if (S_ISDIR(old_inode->i_mode)) {
1052                 /* can only rename into empty new directory */
1053                 if (new_inode) {
1054                         retval = -ENOTEMPTY;
1055                         if (!empty_dir (new_inode))
1056                                 goto end_rename;
1057                 }
1058                 retval = -EIO;
1059                 dir_page= obdfs_getpage (old_inode, 0, 0, LOCKED);
1060                 PDEBUG(dir_page, "rename dir page");
1061
1062                 if (!dir_page)
1063                         goto end_rename;
1064                 if (le32_to_cpu(PARENT_INO(page_address(dir_page))) != old_dir->i_ino)
1065                         goto end_rename;
1066                 retval = -EMLINK;
1067                 if (!new_inode && new_dir!=old_dir &&
1068                                 new_dir->i_nlink >= EXT2_LINK_MAX)
1069                         goto end_rename;
1070         }
1071         /* create the target dir entry */
1072         if (!new_page) {
1073                 new_page = obdfs_add_entry (new_dir, new_dentry->d_name.name,
1074                                         new_dentry->d_name.len, &new_de,
1075                                         &retval);
1076                 PDEBUG(new_page, "rename new page");
1077                 if (!new_page)
1078                         goto end_rename;
1079         }
1080         new_dir->i_version = ++event;
1081
1082         /*
1083          * remove the old entry
1084          */
1085         new_de->inode = le32_to_cpu(old_inode->i_ino);
1086         if (EXT2_HAS_INCOMPAT_FEATURE(new_dir->i_sb,
1087                                       EXT2_FEATURE_INCOMPAT_FILETYPE))
1088                 new_de->file_type = old_de->file_type;
1089         
1090         obdfs_delete_entry (old_de, old_page);
1091
1092         old_dir->i_version = ++event;
1093         if (new_inode) {
1094                 new_inode->i_nlink--;
1095                 new_inode->i_ctime = CURRENT_TIME;
1096                 mark_inode_dirty(new_inode);
1097         }
1098         old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME;
1099         old_dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL;
1100         mark_inode_dirty(old_dir);
1101         if (dir_page) {
1102                 PARENT_INO(page_address(dir_page)) = le32_to_cpu(new_dir->i_ino);
1103                 iops(old_inode)->o_brw(WRITE, iid(old_inode), old_inode, dir_page, 0);
1104                 old_dir->i_nlink--;
1105                 mark_inode_dirty(old_dir);
1106                 if (new_inode) {
1107                         new_inode->i_nlink--;
1108                         mark_inode_dirty(new_inode);
1109                 } else {
1110                         new_dir->i_nlink++;
1111                         new_dir->u.ext2_i.i_flags &= ~EXT2_BTREE_FL;
1112                         mark_inode_dirty(new_dir);
1113                 }
1114         }
1115         if ( old_page != new_page ) {
1116                 unsigned long index = old_page->index;
1117                 /* lock the old_page and release unlocked copy */
1118                 CDEBUG(D_INODE, "old_page at %p\n", old_page);
1119                 page_cache_release(old_page);
1120                 old_page = obdfs_getpage(old_dir, index >> PAGE_SHIFT, 0, LOCKED);
1121                 CDEBUG(D_INODE, "old_page at %p\n", old_page);
1122                 iops(old_dir)->o_brw(WRITE, iid(old_dir), old_dir, old_page,0);
1123         }
1124 #if 0
1125         if (IS_SYNC(old_dir)) {
1126                 ll_rw_block (WRITE, 1, &old_bh);
1127                 wait_on_buffer (old_bh);
1128         }
1129 #endif
1130         iops(new_dir)->o_brw(WRITE, iid(new_dir), new_dir, new_page, 0);
1131 #if 0
1132         if (IS_SYNC(new_dir)) {
1133                 ll_rw_block (WRITE, 1, &new_bh);
1134                 wait_on_buffer (new_bh);
1135         }
1136 #endif
1137
1138         retval = 0;
1139
1140 end_rename:
1141         if (old_page && PageLocked(old_page) )
1142                 UnlockPage(old_page);
1143         if (old_page)
1144                 page_cache_release(old_page);
1145         if (new_page && PageLocked(new_page) )
1146                 UnlockPage(new_page);
1147         if (new_page)
1148                 page_cache_release(new_page);
1149         if (dir_page && PageLocked(dir_page) )
1150                 UnlockPage(dir_page);
1151         if (dir_page)
1152                 page_cache_release(dir_page);
1153
1154
1155         return retval;
1156 }