2 * linux/fs/minix/namei.c
4 * Copyright (C) 1991, 1992 Linus Torvalds
7 #include <linux/sched.h>
8 #include <linux/minix_fs.h>
9 #include <linux/kernel.h>
10 #include <linux/string.h>
11 #include <linux/stat.h>
12 #include <linux/fcntl.h>
13 #include <linux/errno.h>
15 #include <asm/uaccess.h>
18 * comment out this line if you want names > info->s_namelen chars to be
19 * truncated. Else they will be disallowed (ENAMETOOLONG).
21 /* #define NO_TRUNCATE */
23 static inline int namecompare(int len
, int maxlen
,
24 const char * name
, const char * buffer
)
26 if (len
< maxlen
&& buffer
[len
])
28 return !memcmp(name
, buffer
, len
);
34 * finds an entry in the specified directory with the wanted name. It
35 * returns the cache buffer in which the entry was found, and the entry
36 * itself (as a parameter - res_dir). It does NOT read the inode of the
37 * entry - you'll have to do that yourself if you want to.
39 static struct buffer_head
* minix_find_entry(struct inode
* dir
,
40 const char * name
, int namelen
, struct minix_dir_entry
** res_dir
)
42 unsigned long block
, offset
;
43 struct buffer_head
* bh
;
44 struct minix_sb_info
* info
;
45 struct minix_dir_entry
*de
;
48 if (!dir
|| !dir
->i_sb
)
50 info
= &dir
->i_sb
->u
.minix_sb
;
51 if (namelen
> info
->s_namelen
) {
55 namelen
= info
->s_namelen
;
60 while (block
*BLOCK_SIZE
+offset
< dir
->i_size
) {
62 bh
= minix_bread(dir
,block
,0);
68 de
= (struct minix_dir_entry
*) (bh
->b_data
+ offset
);
69 offset
+= info
->s_dirsize
;
70 if (de
->inode
&& namecompare(namelen
,info
->s_namelen
,name
,de
->name
)) {
74 if (offset
< bh
->b_size
)
87 static int minix_hash(struct dentry
*dentry
, struct qstr
*qstr
)
91 const unsigned char *name
;
93 i
= dentry
->d_inode
->i_sb
->u
.minix_sb
.s_namelen
;
96 /* Truncate the name in place, avoids having to define a compare
100 hash
= init_name_hash();
102 hash
= partial_name_hash(*name
++, hash
);
103 qstr
->hash
= end_name_hash(hash
);
109 struct dentry_operations minix_dentry_operations
= {
119 int minix_lookup(struct inode
* dir
, struct dentry
*dentry
)
121 struct inode
* inode
= NULL
;
122 struct minix_dir_entry
* de
;
123 struct buffer_head
* bh
;
126 dentry
->d_op
= &minix_dentry_operations
;
128 bh
= minix_find_entry(dir
, dentry
->d_name
.name
, dentry
->d_name
.len
, &de
);
132 inode
= iget(dir
->i_sb
, ino
);
137 d_add(dentry
, inode
);
144 * adds a file entry to the specified directory, returning a possible
145 * error value if it fails.
147 * NOTE!! The inode part of 'de' is left at 0 - which means you
148 * may not sleep between calling this and putting something into
149 * the entry, as someone else might have used it while you slept.
151 static int minix_add_entry(struct inode
* dir
,
152 const char * name
, int namelen
,
153 struct buffer_head
** res_buf
,
154 struct minix_dir_entry
** res_dir
)
157 unsigned long block
, offset
;
158 struct buffer_head
* bh
;
159 struct minix_dir_entry
* de
;
160 struct minix_sb_info
* info
;
164 if (!dir
|| !dir
->i_sb
)
166 info
= &dir
->i_sb
->u
.minix_sb
;
167 if (namelen
> info
->s_namelen
) {
169 return -ENAMETOOLONG
;
171 namelen
= info
->s_namelen
;
180 bh
= minix_bread(dir
,block
,1);
184 de
= (struct minix_dir_entry
*) (bh
->b_data
+ offset
);
185 offset
+= info
->s_dirsize
;
186 if (block
*bh
->b_size
+ offset
> dir
->i_size
) {
188 dir
->i_size
= block
*bh
->b_size
+ offset
;
189 mark_inode_dirty(dir
);
192 if (namecompare(namelen
, info
->s_namelen
, name
, de
->name
)) {
197 dir
->i_mtime
= dir
->i_ctime
= CURRENT_TIME
;
198 mark_inode_dirty(dir
);
199 for (i
= 0; i
< info
->s_namelen
; i
++)
200 de
->name
[i
] = (i
< namelen
) ? name
[i
] : 0;
201 dir
->i_version
= ++event
;
202 mark_buffer_dirty(bh
, 1);
206 if (offset
< bh
->b_size
)
217 int minix_create(struct inode
* dir
, struct dentry
*dentry
, int mode
)
220 struct inode
* inode
;
221 struct buffer_head
* bh
;
222 struct minix_dir_entry
* de
;
226 inode
= minix_new_inode(dir
);
229 inode
->i_op
= &minix_file_inode_operations
;
230 inode
->i_mode
= mode
;
231 mark_inode_dirty(inode
);
232 error
= minix_add_entry(dir
, dentry
->d_name
.name
,
233 dentry
->d_name
.len
, &bh
,&de
);
236 mark_inode_dirty(inode
);
240 de
->inode
= inode
->i_ino
;
241 mark_buffer_dirty(bh
, 1);
243 d_instantiate(dentry
, inode
);
247 int minix_mknod(struct inode
* dir
, struct dentry
*dentry
, int mode
, int rdev
)
250 struct inode
* inode
;
251 struct buffer_head
* bh
;
252 struct minix_dir_entry
* de
;
256 bh
= minix_find_entry(dir
, dentry
->d_name
.name
,
257 dentry
->d_name
.len
, &de
);
262 inode
= minix_new_inode(dir
);
265 inode
->i_uid
= current
->fsuid
;
266 inode
->i_mode
= mode
;
268 if (S_ISREG(inode
->i_mode
))
269 inode
->i_op
= &minix_file_inode_operations
;
270 else if (S_ISCHR(inode
->i_mode
))
271 inode
->i_op
= &chrdev_inode_operations
;
272 else if (S_ISBLK(inode
->i_mode
))
273 inode
->i_op
= &blkdev_inode_operations
;
274 else if (S_ISFIFO(inode
->i_mode
))
276 if (S_ISBLK(mode
) || S_ISCHR(mode
))
277 inode
->i_rdev
= to_kdev_t(rdev
);
278 mark_inode_dirty(inode
);
279 error
= minix_add_entry(dir
, dentry
->d_name
.name
, dentry
->d_name
.len
, &bh
, &de
);
282 mark_inode_dirty(inode
);
286 de
->inode
= inode
->i_ino
;
287 mark_buffer_dirty(bh
, 1);
289 d_instantiate(dentry
, inode
);
293 int minix_mkdir(struct inode
* dir
, struct dentry
*dentry
, int mode
)
296 struct inode
* inode
;
297 struct buffer_head
* bh
, *dir_block
;
298 struct minix_dir_entry
* de
;
299 struct minix_sb_info
* info
;
301 if (!dir
|| !dir
->i_sb
)
303 info
= &dir
->i_sb
->u
.minix_sb
;
304 bh
= minix_find_entry(dir
, dentry
->d_name
.name
,
305 dentry
->d_name
.len
, &de
);
310 if (dir
->i_nlink
>= info
->s_link_max
)
312 inode
= minix_new_inode(dir
);
315 inode
->i_op
= &minix_dir_inode_operations
;
316 inode
->i_size
= 2 * info
->s_dirsize
;
317 dir_block
= minix_bread(inode
,0,1);
320 mark_inode_dirty(inode
);
324 de
= (struct minix_dir_entry
*) dir_block
->b_data
;
325 de
->inode
=inode
->i_ino
;
326 strcpy(de
->name
,".");
327 de
= (struct minix_dir_entry
*) (dir_block
->b_data
+ info
->s_dirsize
);
328 de
->inode
= dir
->i_ino
;
329 strcpy(de
->name
,"..");
331 mark_buffer_dirty(dir_block
, 1);
333 inode
->i_mode
= S_IFDIR
| (mode
& 0777 & ~current
->fs
->umask
);
334 if (dir
->i_mode
& S_ISGID
)
335 inode
->i_mode
|= S_ISGID
;
336 mark_inode_dirty(inode
);
337 error
= minix_add_entry(dir
, dentry
->d_name
.name
,
338 dentry
->d_name
.len
, &bh
, &de
);
344 de
->inode
= inode
->i_ino
;
345 mark_buffer_dirty(bh
, 1);
347 mark_inode_dirty(dir
);
349 d_instantiate(dentry
, inode
);
354 * routine to check that the specified directory is empty (for rmdir)
356 static int empty_dir(struct inode
* inode
)
358 unsigned int block
, offset
;
359 struct buffer_head
* bh
;
360 struct minix_dir_entry
* de
;
361 struct minix_sb_info
* info
;
363 if (!inode
|| !inode
->i_sb
)
365 info
= &inode
->i_sb
->u
.minix_sb
;
368 offset
= 2*info
->s_dirsize
;
369 if (inode
->i_size
& (info
->s_dirsize
-1))
371 if (inode
->i_size
< offset
)
373 bh
= minix_bread(inode
,0,0);
376 de
= (struct minix_dir_entry
*) bh
->b_data
;
377 if (!de
->inode
|| strcmp(de
->name
,"."))
379 de
= (struct minix_dir_entry
*) (bh
->b_data
+ info
->s_dirsize
);
380 if (!de
->inode
|| strcmp(de
->name
,".."))
382 while (block
*BLOCK_SIZE
+offset
< inode
->i_size
) {
384 bh
= minix_bread(inode
,block
,0);
390 de
= (struct minix_dir_entry
*) (bh
->b_data
+ offset
);
391 offset
+= info
->s_dirsize
;
396 if (offset
< bh
->b_size
)
407 printk("Bad directory on device %s\n",
408 kdevname(inode
->i_dev
));
412 int minix_rmdir(struct inode
* dir
, struct dentry
*dentry
)
415 struct inode
* inode
;
416 struct buffer_head
* bh
;
417 struct minix_dir_entry
* de
;
420 bh
= minix_find_entry(dir
, dentry
->d_name
.name
,
421 dentry
->d_name
.len
, &de
);
425 inode
= dentry
->d_inode
;
427 if (!empty_dir(inode
)) {
431 if (de
->inode
!= inode
->i_ino
) {
435 if (!list_empty(&dentry
->d_hash
)) {
439 if (inode
->i_nlink
!= 2)
440 printk("empty directory has nlink!=2 (%d)\n",inode
->i_nlink
);
442 dir
->i_version
= ++event
;
443 mark_buffer_dirty(bh
, 1);
445 mark_inode_dirty(inode
);
446 inode
->i_ctime
= dir
->i_ctime
= dir
->i_mtime
= CURRENT_TIME
;
448 mark_inode_dirty(dir
);
456 int minix_unlink(struct inode
* dir
, struct dentry
*dentry
)
459 struct inode
* inode
;
460 struct buffer_head
* bh
;
461 struct minix_dir_entry
* de
;
466 bh
= minix_find_entry(dir
, dentry
->d_name
.name
,
467 dentry
->d_name
.len
, &de
);
470 inode
= dentry
->d_inode
;
473 if (de
->inode
!= inode
->i_ino
) {
475 current
->counter
= 0;
479 if (de
->inode
!= inode
->i_ino
) {
483 if (!inode
->i_nlink
) {
484 printk("Deleting nonexistent file (%s:%lu), %d\n",
485 kdevname(inode
->i_dev
),
486 inode
->i_ino
, inode
->i_nlink
);
490 dir
->i_version
= ++event
;
491 mark_buffer_dirty(bh
, 1);
492 dir
->i_ctime
= dir
->i_mtime
= CURRENT_TIME
;
493 mark_inode_dirty(dir
);
495 inode
->i_ctime
= dir
->i_ctime
;
496 mark_inode_dirty(inode
);
497 d_delete(dentry
); /* This also frees the inode */
504 int minix_symlink(struct inode
* dir
, struct dentry
*dentry
,
505 const char * symname
)
507 struct minix_dir_entry
* de
;
508 struct inode
* inode
= NULL
;
509 struct buffer_head
* bh
= NULL
, * name_block
= NULL
;
513 if (!(inode
= minix_new_inode(dir
)))
516 inode
->i_mode
= S_IFLNK
| 0777;
517 inode
->i_op
= &minix_symlink_inode_operations
;
518 name_block
= minix_bread(inode
,0,1);
521 mark_inode_dirty(inode
);
526 while (i
< 1023 && (c
=*(symname
++)))
527 name_block
->b_data
[i
++] = c
;
528 name_block
->b_data
[i
] = 0;
529 mark_buffer_dirty(name_block
, 1);
532 mark_inode_dirty(inode
);
533 bh
= minix_find_entry(dir
, dentry
->d_name
.name
,
534 dentry
->d_name
.len
, &de
);
537 mark_inode_dirty(inode
);
542 i
= minix_add_entry(dir
, dentry
->d_name
.name
,
543 dentry
->d_name
.len
, &bh
, &de
);
546 mark_inode_dirty(inode
);
550 de
->inode
= inode
->i_ino
;
551 mark_buffer_dirty(bh
, 1);
553 d_instantiate(dentry
, inode
);
557 int minix_link(struct dentry
* old_dentry
, struct inode
* dir
,
558 struct dentry
*dentry
)
561 struct inode
*inode
= old_dentry
->d_inode
;
562 struct minix_dir_entry
* de
;
563 struct buffer_head
* bh
;
565 if (S_ISDIR(inode
->i_mode
))
568 if (inode
->i_nlink
>= inode
->i_sb
->u
.minix_sb
.s_link_max
)
571 bh
= minix_find_entry(dir
, dentry
->d_name
.name
,
572 dentry
->d_name
.len
, &de
);
577 error
= minix_add_entry(dir
, dentry
->d_name
.name
,
578 dentry
->d_name
.len
, &bh
, &de
);
583 de
->inode
= inode
->i_ino
;
584 mark_buffer_dirty(bh
, 1);
587 inode
->i_ctime
= CURRENT_TIME
;
588 mark_inode_dirty(inode
);
590 d_instantiate(dentry
, inode
);
594 #define PARENT_INO(buffer) \
595 (((struct minix_dir_entry *) ((buffer)+info->s_dirsize))->inode)
598 * rename uses retrying to avoid race-conditions: at least they should be minimal.
599 * it tries to allocate all the blocks, then sanity-checks, and if the sanity-
600 * checks fail, it tries to restart itself again. Very practical - no changes
601 * are done until we know everything works ok.. and then all the changes can be
602 * done in one fell swoop when we have claimed all the buffers needed.
604 * Anybody can rename anything with this: the permission checks are left to the
605 * higher-level routines.
607 int minix_rename(struct inode
* old_dir
, struct dentry
*old_dentry
,
608 struct inode
* new_dir
, struct dentry
*new_dentry
)
610 struct inode
* old_inode
, * new_inode
;
611 struct buffer_head
* old_bh
, * new_bh
, * dir_bh
;
612 struct minix_dir_entry
* old_de
, * new_de
;
613 struct minix_sb_info
* info
;
616 info
= &old_dir
->i_sb
->u
.minix_sb
;
622 current
->counter
= 0;
625 old_inode
= new_inode
= NULL
;
626 old_bh
= new_bh
= dir_bh
= NULL
;
627 old_bh
= minix_find_entry(old_dir
, old_dentry
->d_name
.name
,
628 old_dentry
->d_name
.len
, &old_de
);
632 old_inode
= old_dentry
->d_inode
;
634 new_inode
= new_dentry
->d_inode
;
635 new_bh
= minix_find_entry(new_dir
, new_dentry
->d_name
.name
,
636 new_dentry
->d_name
.len
, &new_de
);
643 if (S_ISDIR(old_inode
->i_mode
)) {
646 if (!empty_dir(new_inode
))
650 dir_bh
= minix_bread(old_inode
,0,0);
653 if (PARENT_INO(dir_bh
->b_data
) != old_dir
->i_ino
)
656 if (!new_inode
&& new_dir
->i_nlink
>= info
->s_link_max
)
660 retval
= minix_add_entry(new_dir
,
661 new_dentry
->d_name
.name
,
662 new_dentry
->d_name
.len
,
667 /* sanity checking before doing the rename - avoid races */
668 if (new_inode
&& (new_de
->inode
!= new_inode
->i_ino
))
670 if (new_de
->inode
&& !new_inode
)
672 if (old_de
->inode
!= old_inode
->i_ino
)
676 new_de
->inode
= old_inode
->i_ino
;
677 old_dir
->i_ctime
= old_dir
->i_mtime
= CURRENT_TIME
;
678 mark_inode_dirty(old_dir
);
679 old_dir
->i_version
= ++event
;
680 new_dir
->i_ctime
= new_dir
->i_mtime
= CURRENT_TIME
;
681 mark_inode_dirty(new_dir
);
682 new_dir
->i_version
= ++event
;
684 new_inode
->i_nlink
--;
685 new_inode
->i_ctime
= CURRENT_TIME
;
686 mark_inode_dirty(new_inode
);
688 mark_buffer_dirty(old_bh
, 1);
689 mark_buffer_dirty(new_bh
, 1);
691 PARENT_INO(dir_bh
->b_data
) = new_dir
->i_ino
;
692 mark_buffer_dirty(dir_bh
, 1);
694 mark_inode_dirty(old_dir
);
696 new_inode
->i_nlink
--;
697 mark_inode_dirty(new_inode
);
700 mark_inode_dirty(new_dir
);