Whamcloud - gitweb
This adds most of the metadata infrastructure: I think that all commands
[fs/lustre-release.git] / lustre / llite / dir.c
1 /*
2  *
3  * Copyright (C) 1992, 1993, 1994, 1995
4  * Remy Card (card@masi.ibp.fr)
5  * Laboratoire MASI - Institut Blaise Pascal
6  * Universite Pierre et Marie Curie (Paris VI)
7  *
8  *  from
9  *
10  *  linux/fs/minix/dir.c
11  *  linux/fs/ext2/dir.c
12  *
13  *  Copyright (C) 1991, 1992  Linus Torvalds
14  *
15  *  ext2 directory handling functions
16  *
17  *  Big-endian to little-endian byte-swapping/bitmaps by
18  *        David S. Miller (davem@caip.rutgers.edu), 1995
19  *
20  *  All code that works with directory layout had been switched to pagecache
21  *  and moved here. AV
22  *   
23  *  Adapted for Lustre Light
24  *  Copyright (C) 2002, Cluster File Systems, Inc.
25  * 
26  */
27
28 #include <linux/fs.h>
29 #include <linux/ext2_fs.h>
30 #include <linux/pagemap.h>
31 #include <linux/mm.h>
32 #include <linux/obd_support.h>
33 #include <linux/locks.h>
34
35 typedef struct ext2_dir_entry_2 ext2_dirent;
36
37 #define PageChecked(page)        test_bit(PG_checked, &(page)->flags)
38 #define SetPageChecked(page)     set_bit(PG_checked, &(page)->flags)
39
40 int waitfor_one_page(struct page *page)
41 {
42         int error = 0;
43         struct buffer_head *bh, *head = page->buffers;
44
45         bh = head;
46         do {
47                 wait_on_buffer(bh);
48                 if (buffer_req(bh) && !buffer_uptodate(bh))
49                         error = -EIO;
50         } while ((bh = bh->b_this_page) != head);
51         return error;
52 }
53
54 /*
55  * ext2 uses block-sized chunks. Arguably, sector-sized ones would be
56  * more robust, but we have what we have
57  */
58 static inline unsigned ext2_chunk_size(struct inode *inode)
59 {
60         //return inode->i_sb->s_blocksize;
61         return PAGE_SIZE;
62 }
63
64 static inline void ext2_put_page(struct page *page)
65 {
66         kunmap(page);
67         page_cache_release(page);
68 }
69
70 static inline unsigned long dir_pages(struct inode *inode)
71 {
72         return (inode->i_size+PAGE_CACHE_SIZE-1)>>PAGE_CACHE_SHIFT;
73 }
74
75 extern void set_page_clean(struct page *page); 
76
77 static int ext2_commit_chunk(struct page *page, unsigned from, unsigned to)
78 {
79         struct inode *dir = page->mapping->host;
80         int err = 0;
81
82         dir->i_version = ++event;
83         dir->i_size = (page->index << PAGE_CACHE_SHIFT) + to; 
84         SetPageUptodate(page);
85         set_page_clean(page);
86
87         //page->mapping->a_ops->commit_write(NULL, page, from, to);
88         //if (IS_SYNC(dir))
89         //      err = waitfor_one_page(page);
90         return err;
91 }
92
93 static void ext2_check_page(struct page *page)
94 {
95         struct inode *dir = page->mapping->host;
96         unsigned chunk_size = ext2_chunk_size(dir);
97         char *kaddr = page_address(page);
98         //      u32 max_inumber = le32_to_cpu(sb->u.ext2_sb.s_es->s_inodes_count);
99         unsigned offs, rec_len;
100         unsigned limit = PAGE_CACHE_SIZE;
101         ext2_dirent *p;
102         char *error;
103
104         if ((dir->i_size >> PAGE_CACHE_SHIFT) == page->index) {
105                 limit = dir->i_size & ~PAGE_CACHE_MASK;
106                 if (limit & (chunk_size - 1))
107                         goto Ebadsize;
108                 for (offs = limit; offs<PAGE_CACHE_SIZE; offs += chunk_size) {
109                         ext2_dirent *p = (ext2_dirent*)(kaddr + offs);
110                         p->rec_len = cpu_to_le16(chunk_size);
111                 }
112                 if (!limit)
113                         goto out;
114         }
115         for (offs = 0; offs <= limit - EXT2_DIR_REC_LEN(1); offs += rec_len) {
116                 p = (ext2_dirent *)(kaddr + offs);
117                 rec_len = le16_to_cpu(p->rec_len);
118
119                 if (rec_len < EXT2_DIR_REC_LEN(1))
120                         goto Eshort;
121                 if (rec_len & 3)
122                         goto Ealign;
123                 if (rec_len < EXT2_DIR_REC_LEN(p->name_len))
124                         goto Enamelen;
125                 if (((offs + rec_len - 1) ^ offs) & ~(chunk_size-1))
126                         goto Espan;
127                 //              if (le32_to_cpu(p->inode) > max_inumber)
128                 //goto Einumber;
129         }
130         if (offs != limit)
131                 goto Eend;
132 out:
133         SetPageChecked(page);
134         return;
135
136         /* Too bad, we had an error */
137
138 Ebadsize:
139         printk("ext2_check_page"
140                 "size of directory #%lu is not a multiple of chunk size",
141                 dir->i_ino
142         );
143         goto fail;
144 Eshort:
145         error = "rec_len is smaller than minimal";
146         goto bad_entry;
147 Ealign:
148         error = "unaligned directory entry";
149         goto bad_entry;
150 Enamelen:
151         error = "rec_len is too small for name_len";
152         goto bad_entry;
153 Espan:
154         error = "directory entry across blocks";
155         goto bad_entry;
156         //Einumber:
157         // error = "inode out of bounds";
158 bad_entry:
159         printk("ext2_check_page: bad entry in directory #%lu: %s - "
160                 "offset=%lu, inode=%lu, rec_len=%d, name_len=%d",
161                 dir->i_ino, error, (page->index<<PAGE_CACHE_SHIFT)+offs,
162                 (unsigned long) le32_to_cpu(p->inode),
163                 rec_len, p->name_len);
164         goto fail;
165 Eend:
166         p = (ext2_dirent *)(kaddr + offs);
167         printk("ext2_check_page"
168                 "entry in directory #%lu spans the page boundary"
169                 "offset=%lu, inode=%lu",
170                 dir->i_ino, (page->index<<PAGE_CACHE_SHIFT)+offs,
171                 (unsigned long) le32_to_cpu(p->inode));
172 fail:
173         SetPageChecked(page);
174         SetPageError(page);
175 }
176
177 static struct page * ext2_get_page(struct inode *dir, unsigned long n)
178 {
179         struct address_space *mapping = dir->i_mapping;
180         struct page *page = read_cache_page(mapping, n,
181                                 (filler_t*)mapping->a_ops->readpage, NULL);
182         if (!IS_ERR(page)) {
183                 wait_on_page(page);
184                 kmap(page);
185                 if (!Page_Uptodate(page))
186                         goto fail;
187                 if (!PageChecked(page))
188                         ext2_check_page(page);
189                 if (PageError(page))
190                         goto fail;
191         }
192         return page;
193
194 fail:
195         ext2_put_page(page);
196         return ERR_PTR(-EIO);
197 }
198
199 /*
200  * NOTE! unlike strncmp, ext2_match returns 1 for success, 0 for failure.
201  *
202  * len <= EXT2_NAME_LEN and de != NULL are guaranteed by caller.
203  */
204 static inline int ext2_match (int len, const char * const name,
205                                         struct ext2_dir_entry_2 * de)
206 {
207         if (len != de->name_len)
208                 return 0;
209         if (!de->inode)
210                 return 0;
211         return !memcmp(name, de->name, len);
212 }
213
214 /*
215  * p is at least 6 bytes before the end of page
216  */
217 static inline ext2_dirent *ext2_next_entry(ext2_dirent *p)
218 {
219         return (ext2_dirent *)((char*)p + le16_to_cpu(p->rec_len));
220 }
221
222 static inline unsigned 
223 ext2_validate_entry(char *base, unsigned offset, unsigned mask)
224 {
225         ext2_dirent *de = (ext2_dirent*)(base + offset);
226         ext2_dirent *p = (ext2_dirent*)(base + (offset&mask));
227         while ((char*)p < (char*)de)
228                 p = ext2_next_entry(p);
229         return (char *)p - base;
230 }
231
232 static unsigned char ext2_filetype_table[EXT2_FT_MAX] = {
233         [EXT2_FT_UNKNOWN]       DT_UNKNOWN,
234         [EXT2_FT_REG_FILE]      DT_REG,
235         [EXT2_FT_DIR]           DT_DIR,
236         [EXT2_FT_CHRDEV]        DT_CHR,
237         [EXT2_FT_BLKDEV]        DT_BLK,
238         [EXT2_FT_FIFO]          DT_FIFO,
239         [EXT2_FT_SOCK]          DT_SOCK,
240         [EXT2_FT_SYMLINK]       DT_LNK,
241 };
242
243 static unsigned int ll_dt2fmt[DT_WHT + 1] = {
244         [EXT2_FT_UNKNOWN]       0, 
245         [EXT2_FT_REG_FILE]      S_IFREG,
246         [EXT2_FT_DIR]           S_IFDIR,
247         [EXT2_FT_CHRDEV]        S_IFCHR,
248         [EXT2_FT_BLKDEV]        S_IFBLK, 
249         [EXT2_FT_FIFO]          S_IFIFO,
250         [EXT2_FT_SOCK]          S_IFSOCK,
251         [EXT2_FT_SYMLINK]       S_IFLNK
252 };
253         
254 #define S_SHIFT 12
255 static unsigned char ext2_type_by_mode[S_IFMT >> S_SHIFT] = {
256         [S_IFREG >> S_SHIFT]    EXT2_FT_REG_FILE,
257         [S_IFDIR >> S_SHIFT]    EXT2_FT_DIR,
258         [S_IFCHR >> S_SHIFT]    EXT2_FT_CHRDEV,
259         [S_IFBLK >> S_SHIFT]    EXT2_FT_BLKDEV,
260         [S_IFIFO >> S_SHIFT]    EXT2_FT_FIFO,
261         [S_IFSOCK >> S_SHIFT]   EXT2_FT_SOCK,
262         [S_IFLNK >> S_SHIFT]    EXT2_FT_SYMLINK,
263 };
264
265 static inline void ext2_set_de_type(ext2_dirent *de, struct inode *inode)
266 {
267         mode_t mode = inode->i_mode;
268         de->file_type = ext2_type_by_mode[(mode & S_IFMT)>>S_SHIFT];
269 }
270
271 int
272 new_ll_readdir (struct file * filp, void * dirent, filldir_t filldir)
273 {
274         loff_t pos = filp->f_pos;
275         struct inode *inode = filp->f_dentry->d_inode;
276         // XXX struct super_block *sb = inode->i_sb;
277         unsigned offset = pos & ~PAGE_CACHE_MASK;
278         unsigned long n = pos >> PAGE_CACHE_SHIFT;
279         unsigned long npages = dir_pages(inode);
280         unsigned chunk_mask = ~(ext2_chunk_size(inode)-1);
281         unsigned char *types = NULL;
282         int need_revalidate = (filp->f_version != inode->i_version);
283
284         if (pos > inode->i_size - EXT2_DIR_REC_LEN(1))
285                 goto done;
286
287         types = ext2_filetype_table;
288
289         for ( ; n < npages; n++, offset = 0) {
290                 char *kaddr, *limit;
291                 ext2_dirent *de;
292                 struct page *page = ext2_get_page(inode, n);
293
294                 if (IS_ERR(page))
295                         continue;
296                 kaddr = page_address(page);
297                 if (need_revalidate) {
298                         offset = ext2_validate_entry(kaddr, offset, chunk_mask);
299                         need_revalidate = 0;
300                 }
301                 de = (ext2_dirent *)(kaddr+offset);
302                 limit = kaddr + PAGE_CACHE_SIZE - EXT2_DIR_REC_LEN(1);
303                 for ( ;(char*)de <= limit; de = ext2_next_entry(de))
304                         if (de->inode) {
305                                 int over;
306                                 unsigned char d_type = DT_UNKNOWN;
307
308                                 if (types && de->file_type < EXT2_FT_MAX)
309                                         d_type = types[de->file_type];
310
311                                 offset = (char *)de - kaddr;
312                                 over = filldir(dirent, de->name, de->name_len,
313                                                 (n<<PAGE_CACHE_SHIFT) | offset,
314                                                 le32_to_cpu(de->inode), d_type);
315                                 if (over) {
316                                         ext2_put_page(page);
317                                         goto done;
318                                 }
319                         }
320                 ext2_put_page(page);
321         }
322
323 done:
324         filp->f_pos = (n << PAGE_CACHE_SHIFT) | offset;
325         filp->f_version = inode->i_version;
326         UPDATE_ATIME(inode);
327         return 0;
328 }
329
330 /*
331  *      ext2_find_entry()
332  *
333  * finds an entry in the specified directory with the wanted name. It
334  * returns the page in which the entry was found, and the entry itself
335  * (as a parameter - res_dir). Page is returned mapped and unlocked.
336  * Entry is guaranteed to be valid.
337  */
338 struct ext2_dir_entry_2 * ext2_find_entry (struct inode * dir,
339                         struct dentry *dentry, struct page ** res_page)
340 {
341         const char *name = dentry->d_name.name;
342         int namelen = dentry->d_name.len;
343         unsigned reclen = EXT2_DIR_REC_LEN(namelen);
344         unsigned long start, n;
345         unsigned long npages = dir_pages(dir);
346         struct page *page = NULL;
347         ext2_dirent * de;
348
349         /* OFFSET_CACHE */
350         *res_page = NULL;
351
352         //      start = dir->u.ext2_i.i_dir_start_lookup;
353         start = 0;
354         if (start >= npages)
355                 start = 0;
356         n = start;
357         do {
358                 char *kaddr;
359                 page = ext2_get_page(dir, n);
360                 if (!IS_ERR(page)) {
361                         kaddr = page_address(page);
362                         de = (ext2_dirent *) kaddr;
363                         kaddr += PAGE_CACHE_SIZE - reclen;
364                         while ((char *) de <= kaddr) {
365                                 if (ext2_match (namelen, name, de))
366                                         goto found;
367                                 de = ext2_next_entry(de);
368                         }
369                         ext2_put_page(page);
370                 }
371                 if (++n >= npages)
372                         n = 0;
373         } while (n != start);
374         return NULL;
375
376 found:
377         *res_page = page;
378         //      dir->u.ext2_i.i_dir_start_lookup = n;
379         return de;
380 }
381
382 struct ext2_dir_entry_2 * ext2_dotdot (struct inode *dir, struct page **p)
383 {
384         struct page *page = ext2_get_page(dir, 0);
385         ext2_dirent *de = NULL;
386
387         if (!IS_ERR(page)) {
388                 de = ext2_next_entry((ext2_dirent *) page_address(page));
389                 *p = page;
390         }
391         return de;
392 }
393
394 ino_t ll_inode_by_name(struct inode * dir, struct dentry *dentry, int *type)
395 {
396         ino_t res = 0;
397         struct ext2_dir_entry_2 * de;
398         struct page *page;
399         
400         de = ext2_find_entry (dir, dentry, &page);
401         if (de) {
402                 res = le32_to_cpu(de->inode);
403                 *type = ll_dt2fmt[de->file_type];
404                 kunmap(page);
405                 page_cache_release(page);
406         }
407         return res;
408 }
409
410 /* Releases the page */
411 void ext2_set_link(struct inode *dir, struct ext2_dir_entry_2 *de,
412                         struct page *page, struct inode *inode)
413 {
414         unsigned from = (char *) de - (char *) page_address(page);
415         unsigned to = from + le16_to_cpu(de->rec_len);
416         int err;
417
418         lock_page(page);
419         err = page->mapping->a_ops->prepare_write(NULL, page, from, to);
420         if (err)
421                 BUG();
422         de->inode = cpu_to_le32(inode->i_ino);
423         ext2_set_de_type (de, inode);
424         dir->i_mtime = dir->i_ctime = CURRENT_TIME;
425         err = ext2_commit_chunk(page, from, to);
426         UnlockPage(page);
427         ext2_put_page(page);
428 }
429
430 /*
431  *      Parent is locked.
432  */
433 int ll_add_link (struct dentry *dentry, struct inode *inode)
434 {
435         struct inode *dir = dentry->d_parent->d_inode;
436         const char *name = dentry->d_name.name;
437         int namelen = dentry->d_name.len;
438         unsigned reclen = EXT2_DIR_REC_LEN(namelen);
439         unsigned short rec_len, name_len;
440         struct page *page = NULL;
441         ext2_dirent * de;
442         unsigned long npages = dir_pages(dir);
443         unsigned long n;
444         char *kaddr;
445         unsigned from, to;
446         int err;
447
448         /* We take care of directory expansion in the same loop */
449         for (n = 0; n <= npages; n++) {
450                 page = ext2_get_page(dir, n);
451                 err = PTR_ERR(page);
452                 if (IS_ERR(page))
453                         goto out;
454                 kaddr = page_address(page);
455                 de = (ext2_dirent *)kaddr;
456                 kaddr += PAGE_CACHE_SIZE - reclen;
457                 while ((char *)de <= kaddr) {
458                         err = -EEXIST;
459                         if (ext2_match (namelen, name, de))
460                                 goto out_page;
461                         name_len = EXT2_DIR_REC_LEN(de->name_len);
462                         rec_len = le16_to_cpu(de->rec_len);
463                         if ( n==npages && rec_len == 0) {
464                                 printk("Fatal dir behaviour\n");
465                                 goto out_page;
466                         }
467                         if (!de->inode && rec_len >= reclen)
468                                 goto got_it;
469                         if (rec_len >= name_len + reclen)
470                                 goto got_it;
471                         de = (ext2_dirent *) ((char *) de + rec_len);
472                 }
473                 ext2_put_page(page);
474         }
475         BUG();
476         return -EINVAL;
477
478 got_it:
479         from = (char*)de - (char*)page_address(page);
480         to = from + rec_len;
481         lock_page(page);
482         //err = page->mapping->a_ops->prepare_write(NULL, page, from, to);
483         //if (err)
484         //      goto out_unlock;
485         if (de->inode) {
486                 ext2_dirent *de1 = (ext2_dirent *) ((char *) de + name_len);
487                 de1->rec_len = cpu_to_le16(rec_len - name_len);
488                 de->rec_len = cpu_to_le16(name_len);
489                 de = de1;
490         }
491         de->name_len = namelen;
492         memcpy (de->name, name, namelen);
493         de->inode = cpu_to_le32(inode->i_ino);
494         ext2_set_de_type (de, inode);
495         CDEBUG(D_INODE, "type set to %o\n", de->file_type);
496         dir->i_mtime = dir->i_ctime = CURRENT_TIME;
497         err = ext2_commit_chunk(page, from, to);
498
499         // change_inode happens with the commit_chunk
500         /* XXX OFFSET_CACHE */
501
502 out_unlock:
503         UnlockPage(page);
504 out_page:
505         ext2_put_page(page);
506 out:
507         return err;
508 }
509
510 /*
511  * ext2_delete_entry deletes a directory entry by merging it with the
512  * previous entry. Page is up-to-date. Releases the page.
513  */
514 int ext2_delete_entry (struct ext2_dir_entry_2 * dir, struct page * page )
515 {
516         struct address_space *mapping = page->mapping;
517         struct inode *inode = mapping->host;
518         char *kaddr = page_address(page);
519         unsigned from = ((char*)dir - kaddr) & ~(ext2_chunk_size(inode)-1);
520         unsigned to = ((char*)dir - kaddr) + le16_to_cpu(dir->rec_len);
521         ext2_dirent * pde = NULL;
522         ext2_dirent * de = (ext2_dirent *) (kaddr + from);
523         int err;
524
525         while ((char*)de < (char*)dir) {
526                 pde = de;
527                 de = ext2_next_entry(de);
528         }
529         if (pde)
530                 from = (char*)pde - (char*)page_address(page);
531         lock_page(page);
532         err = mapping->a_ops->prepare_write(NULL, page, from, to);
533         if (err)
534                 BUG();
535         if (pde)
536                 pde->rec_len = cpu_to_le16(to-from);
537         dir->inode = 0;
538         inode->i_ctime = inode->i_mtime = CURRENT_TIME;
539         err = ext2_commit_chunk(page, from, to);
540         UnlockPage(page);
541         ext2_put_page(page);
542         return err;
543 }
544
545 /*
546  * Set the first fragment of directory.
547  */
548 int ext2_make_empty(struct inode *inode, struct inode *parent)
549 {
550         struct address_space *mapping = inode->i_mapping;
551         struct page *page = grab_cache_page(mapping, 0);
552         unsigned chunk_size = ext2_chunk_size(inode);
553         struct ext2_dir_entry_2 * de;
554         char *base;
555         int err;
556         ENTRY;
557
558         if (!page)
559                 return -ENOMEM;
560         err = mapping->a_ops->prepare_write(NULL, page, 0, chunk_size);
561         if (err)
562                 goto fail;
563
564         base = page_address(page);
565
566         de = (struct ext2_dir_entry_2 *) base;
567         de->name_len = 1;
568         de->rec_len = cpu_to_le16(EXT2_DIR_REC_LEN(1));
569         memcpy (de->name, ".\0\0", 4);
570         de->inode = cpu_to_le32(inode->i_ino);
571         ext2_set_de_type (de, inode);
572
573         de = (struct ext2_dir_entry_2 *) (base + EXT2_DIR_REC_LEN(1));
574         de->name_len = 2;
575         de->rec_len = cpu_to_le16(chunk_size - EXT2_DIR_REC_LEN(1));
576         de->inode = cpu_to_le32(parent->i_ino);
577         memcpy (de->name, "..\0", 4);
578         ext2_set_de_type (de, inode);
579
580         err = ext2_commit_chunk(page, 0, chunk_size);
581 fail:
582         UnlockPage(page);
583         page_cache_release(page);
584         ENTRY;
585         return err;
586 }
587
588 /*
589  * routine to check that the specified directory is empty (for rmdir)
590  */
591 int ext2_empty_dir (struct inode * inode)
592 {
593         struct page *page = NULL;
594         unsigned long i, npages = dir_pages(inode);
595         
596         for (i = 0; i < npages; i++) {
597                 char *kaddr;
598                 ext2_dirent * de;
599                 page = ext2_get_page(inode, i);
600
601                 if (IS_ERR(page))
602                         continue;
603
604                 kaddr = page_address(page);
605                 de = (ext2_dirent *)kaddr;
606                 kaddr += PAGE_CACHE_SIZE-EXT2_DIR_REC_LEN(1);
607
608                 while ((char *)de <= kaddr) {
609                         if (de->inode != 0) {
610                                 /* check for . and .. */
611                                 if (de->name[0] != '.')
612                                         goto not_empty;
613                                 if (de->name_len > 2)
614                                         goto not_empty;
615                                 if (de->name_len < 2) {
616                                         if (de->inode !=
617                                             cpu_to_le32(inode->i_ino))
618                                                 goto not_empty;
619                                 } else if (de->name[1] != '.')
620                                         goto not_empty;
621                         }
622                         de = ext2_next_entry(de);
623                 }
624                 ext2_put_page(page);
625         }
626         return 1;
627
628 not_empty:
629         ext2_put_page(page);
630         return 0;
631 }
632
633 struct file_operations ll_dir_operations = {
634         read: generic_read_dir,
635         readdir: new_ll_readdir
636 };