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
;
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 struct dentry
*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
);
135 return ERR_PTR(-EACCES
);
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
;
224 inode
= minix_new_inode(dir
);
227 inode
->i_op
= &minix_file_inode_operations
;
228 inode
->i_mode
= mode
;
229 mark_inode_dirty(inode
);
230 error
= minix_add_entry(dir
, dentry
->d_name
.name
,
231 dentry
->d_name
.len
, &bh
,&de
);
234 mark_inode_dirty(inode
);
238 de
->inode
= inode
->i_ino
;
239 mark_buffer_dirty(bh
, 1);
241 d_instantiate(dentry
, inode
);
245 int minix_mknod(struct inode
* dir
, struct dentry
*dentry
, int mode
, int rdev
)
248 struct inode
* inode
;
249 struct buffer_head
* bh
;
250 struct minix_dir_entry
* de
;
252 inode
= minix_new_inode(dir
);
255 inode
->i_uid
= current
->fsuid
;
256 init_special_inode(inode
, mode
, rdev
);
257 mark_inode_dirty(inode
);
258 error
= minix_add_entry(dir
, dentry
->d_name
.name
, dentry
->d_name
.len
, &bh
, &de
);
261 mark_inode_dirty(inode
);
265 de
->inode
= inode
->i_ino
;
266 mark_buffer_dirty(bh
, 1);
268 d_instantiate(dentry
, inode
);
272 int minix_mkdir(struct inode
* dir
, struct dentry
*dentry
, int mode
)
275 struct inode
* inode
;
276 struct buffer_head
* bh
, *dir_block
;
277 struct minix_dir_entry
* de
;
278 struct minix_sb_info
* info
;
280 info
= &dir
->i_sb
->u
.minix_sb
;
281 if (dir
->i_nlink
>= info
->s_link_max
)
283 inode
= minix_new_inode(dir
);
286 inode
->i_op
= &minix_dir_inode_operations
;
287 inode
->i_size
= 2 * info
->s_dirsize
;
288 dir_block
= minix_bread(inode
,0,1);
291 mark_inode_dirty(inode
);
295 de
= (struct minix_dir_entry
*) dir_block
->b_data
;
296 de
->inode
=inode
->i_ino
;
297 strcpy(de
->name
,".");
298 de
= (struct minix_dir_entry
*) (dir_block
->b_data
+ info
->s_dirsize
);
299 de
->inode
= dir
->i_ino
;
300 strcpy(de
->name
,"..");
302 mark_buffer_dirty(dir_block
, 1);
304 inode
->i_mode
= S_IFDIR
| (mode
& 0777 & ~current
->fs
->umask
);
305 if (dir
->i_mode
& S_ISGID
)
306 inode
->i_mode
|= S_ISGID
;
307 mark_inode_dirty(inode
);
308 error
= minix_add_entry(dir
, dentry
->d_name
.name
,
309 dentry
->d_name
.len
, &bh
, &de
);
315 de
->inode
= inode
->i_ino
;
316 mark_buffer_dirty(bh
, 1);
318 mark_inode_dirty(dir
);
320 d_instantiate(dentry
, inode
);
325 * routine to check that the specified directory is empty (for rmdir)
327 static int empty_dir(struct inode
* inode
)
329 unsigned int block
, offset
;
330 struct buffer_head
* bh
;
331 struct minix_dir_entry
* de
;
332 struct minix_sb_info
* info
;
334 if (!inode
|| !inode
->i_sb
)
336 info
= &inode
->i_sb
->u
.minix_sb
;
339 offset
= 2*info
->s_dirsize
;
340 if (inode
->i_size
& (info
->s_dirsize
-1))
342 if (inode
->i_size
< offset
)
344 bh
= minix_bread(inode
,0,0);
347 de
= (struct minix_dir_entry
*) bh
->b_data
;
348 if (!de
->inode
|| strcmp(de
->name
,"."))
350 de
= (struct minix_dir_entry
*) (bh
->b_data
+ info
->s_dirsize
);
351 if (!de
->inode
|| strcmp(de
->name
,".."))
353 while (block
*BLOCK_SIZE
+offset
< inode
->i_size
) {
355 bh
= minix_bread(inode
,block
,0);
361 de
= (struct minix_dir_entry
*) (bh
->b_data
+ offset
);
362 offset
+= info
->s_dirsize
;
367 if (offset
< bh
->b_size
)
378 printk("Bad directory on device %s\n",
379 kdevname(inode
->i_dev
));
383 int minix_rmdir(struct inode
* dir
, struct dentry
*dentry
)
386 struct inode
* inode
;
387 struct buffer_head
* bh
;
388 struct minix_dir_entry
* de
;
391 bh
= minix_find_entry(dir
, dentry
->d_name
.name
,
392 dentry
->d_name
.len
, &de
);
396 inode
= dentry
->d_inode
;
398 if (!empty_dir(inode
)) {
402 if (de
->inode
!= inode
->i_ino
) {
406 if (!list_empty(&dentry
->d_hash
)) {
410 if (inode
->i_nlink
!= 2)
411 printk("empty directory has nlink!=2 (%d)\n",inode
->i_nlink
);
413 dir
->i_version
= ++event
;
414 mark_buffer_dirty(bh
, 1);
416 mark_inode_dirty(inode
);
417 inode
->i_ctime
= dir
->i_ctime
= dir
->i_mtime
= CURRENT_TIME
;
419 mark_inode_dirty(dir
);
427 int minix_unlink(struct inode
* dir
, struct dentry
*dentry
)
430 struct inode
* inode
;
431 struct buffer_head
* bh
;
432 struct minix_dir_entry
* de
;
437 bh
= minix_find_entry(dir
, dentry
->d_name
.name
,
438 dentry
->d_name
.len
, &de
);
441 inode
= dentry
->d_inode
;
444 if (de
->inode
!= inode
->i_ino
) {
446 current
->counter
= 0;
450 if (de
->inode
!= inode
->i_ino
) {
454 if (!inode
->i_nlink
) {
455 printk("Deleting nonexistent file (%s:%lu), %d\n",
456 kdevname(inode
->i_dev
),
457 inode
->i_ino
, inode
->i_nlink
);
461 dir
->i_version
= ++event
;
462 mark_buffer_dirty(bh
, 1);
463 dir
->i_ctime
= dir
->i_mtime
= CURRENT_TIME
;
464 mark_inode_dirty(dir
);
466 inode
->i_ctime
= dir
->i_ctime
;
467 mark_inode_dirty(inode
);
468 d_delete(dentry
); /* This also frees the inode */
475 int minix_symlink(struct inode
* dir
, struct dentry
*dentry
,
476 const char * symname
)
478 struct minix_dir_entry
* de
;
479 struct inode
* inode
= NULL
;
480 struct buffer_head
* bh
= NULL
, * name_block
= NULL
;
484 if (!(inode
= minix_new_inode(dir
)))
487 inode
->i_mode
= S_IFLNK
| 0777;
488 inode
->i_op
= &minix_symlink_inode_operations
;
489 name_block
= minix_bread(inode
,0,1);
492 mark_inode_dirty(inode
);
497 while (i
< 1023 && (c
=*(symname
++)))
498 name_block
->b_data
[i
++] = c
;
499 name_block
->b_data
[i
] = 0;
500 mark_buffer_dirty(name_block
, 1);
503 mark_inode_dirty(inode
);
504 i
= minix_add_entry(dir
, dentry
->d_name
.name
,
505 dentry
->d_name
.len
, &bh
, &de
);
508 mark_inode_dirty(inode
);
512 de
->inode
= inode
->i_ino
;
513 mark_buffer_dirty(bh
, 1);
515 d_instantiate(dentry
, inode
);
519 int minix_link(struct dentry
* old_dentry
, struct inode
* dir
,
520 struct dentry
*dentry
)
523 struct inode
*inode
= old_dentry
->d_inode
;
524 struct minix_dir_entry
* de
;
525 struct buffer_head
* bh
;
527 if (S_ISDIR(inode
->i_mode
))
530 if (inode
->i_nlink
>= inode
->i_sb
->u
.minix_sb
.s_link_max
)
533 error
= minix_add_entry(dir
, dentry
->d_name
.name
,
534 dentry
->d_name
.len
, &bh
, &de
);
539 de
->inode
= inode
->i_ino
;
540 mark_buffer_dirty(bh
, 1);
543 inode
->i_ctime
= CURRENT_TIME
;
544 mark_inode_dirty(inode
);
546 d_instantiate(dentry
, inode
);
550 #define PARENT_INO(buffer) \
551 (((struct minix_dir_entry *) ((buffer)+info->s_dirsize))->inode)
554 * rename uses retrying to avoid race-conditions: at least they should be minimal.
555 * it tries to allocate all the blocks, then sanity-checks, and if the sanity-
556 * checks fail, it tries to restart itself again. Very practical - no changes
557 * are done until we know everything works ok.. and then all the changes can be
558 * done in one fell swoop when we have claimed all the buffers needed.
560 * Anybody can rename anything with this: the permission checks are left to the
561 * higher-level routines.
563 int minix_rename(struct inode
* old_dir
, struct dentry
*old_dentry
,
564 struct inode
* new_dir
, struct dentry
*new_dentry
)
566 struct inode
* old_inode
, * new_inode
;
567 struct buffer_head
* old_bh
, * new_bh
, * dir_bh
;
568 struct minix_dir_entry
* old_de
, * new_de
;
569 struct minix_sb_info
* info
;
572 info
= &old_dir
->i_sb
->u
.minix_sb
;
578 current
->counter
= 0;
581 old_inode
= new_inode
= NULL
;
582 old_bh
= new_bh
= dir_bh
= NULL
;
583 old_bh
= minix_find_entry(old_dir
, old_dentry
->d_name
.name
,
584 old_dentry
->d_name
.len
, &old_de
);
588 old_inode
= old_dentry
->d_inode
;
590 new_inode
= new_dentry
->d_inode
;
591 new_bh
= minix_find_entry(new_dir
, new_dentry
->d_name
.name
,
592 new_dentry
->d_name
.len
, &new_de
);
599 if (S_ISDIR(old_inode
->i_mode
)) {
602 if (!empty_dir(new_inode
))
606 dir_bh
= minix_bread(old_inode
,0,0);
609 if (PARENT_INO(dir_bh
->b_data
) != old_dir
->i_ino
)
612 if (!new_inode
&& new_dir
->i_nlink
>= info
->s_link_max
)
616 retval
= minix_add_entry(new_dir
,
617 new_dentry
->d_name
.name
,
618 new_dentry
->d_name
.len
,
623 /* sanity checking before doing the rename - avoid races */
624 if (new_inode
&& (new_de
->inode
!= new_inode
->i_ino
))
626 if (new_de
->inode
&& !new_inode
)
628 if (old_de
->inode
!= old_inode
->i_ino
)
632 new_de
->inode
= old_inode
->i_ino
;
633 old_dir
->i_ctime
= old_dir
->i_mtime
= CURRENT_TIME
;
634 mark_inode_dirty(old_dir
);
635 old_dir
->i_version
= ++event
;
636 new_dir
->i_ctime
= new_dir
->i_mtime
= CURRENT_TIME
;
637 mark_inode_dirty(new_dir
);
638 new_dir
->i_version
= ++event
;
640 new_inode
->i_nlink
--;
641 new_inode
->i_ctime
= CURRENT_TIME
;
642 mark_inode_dirty(new_inode
);
644 mark_buffer_dirty(old_bh
, 1);
645 mark_buffer_dirty(new_bh
, 1);
647 PARENT_INO(dir_bh
->b_data
) = new_dir
->i_ino
;
648 mark_buffer_dirty(dir_bh
, 1);
650 mark_inode_dirty(old_dir
);
652 new_inode
->i_nlink
--;
653 mark_inode_dirty(new_inode
);
656 mark_inode_dirty(new_dir
);