[PATCH] Make most file operations structs in fs/ const
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / fs / jffs2 / dir.c
blob8bc7a5018e4044be500c3e14bf73b974673c6646
1 /*
2 * JFFS2 -- Journalling Flash File System, Version 2.
4 * Copyright (C) 2001-2003 Red Hat, Inc.
6 * Created by David Woodhouse <dwmw2@infradead.org>
8 * For licensing information, see the file 'LICENCE' in this directory.
10 * $Id: dir.c,v 1.90 2005/11/07 11:14:39 gleixner Exp $
14 #include <linux/kernel.h>
15 #include <linux/slab.h>
16 #include <linux/sched.h>
17 #include <linux/fs.h>
18 #include <linux/crc32.h>
19 #include <linux/jffs2.h>
20 #include <linux/jffs2_fs_i.h>
21 #include <linux/jffs2_fs_sb.h>
22 #include <linux/time.h>
23 #include "nodelist.h"
25 static int jffs2_readdir (struct file *, void *, filldir_t);
27 static int jffs2_create (struct inode *,struct dentry *,int,
28 struct nameidata *);
29 static struct dentry *jffs2_lookup (struct inode *,struct dentry *,
30 struct nameidata *);
31 static int jffs2_link (struct dentry *,struct inode *,struct dentry *);
32 static int jffs2_unlink (struct inode *,struct dentry *);
33 static int jffs2_symlink (struct inode *,struct dentry *,const char *);
34 static int jffs2_mkdir (struct inode *,struct dentry *,int);
35 static int jffs2_rmdir (struct inode *,struct dentry *);
36 static int jffs2_mknod (struct inode *,struct dentry *,int,dev_t);
37 static int jffs2_rename (struct inode *, struct dentry *,
38 struct inode *, struct dentry *);
40 const struct file_operations jffs2_dir_operations =
42 .read = generic_read_dir,
43 .readdir = jffs2_readdir,
44 .ioctl = jffs2_ioctl,
45 .fsync = jffs2_fsync
49 struct inode_operations jffs2_dir_inode_operations =
51 .create = jffs2_create,
52 .lookup = jffs2_lookup,
53 .link = jffs2_link,
54 .unlink = jffs2_unlink,
55 .symlink = jffs2_symlink,
56 .mkdir = jffs2_mkdir,
57 .rmdir = jffs2_rmdir,
58 .mknod = jffs2_mknod,
59 .rename = jffs2_rename,
60 .setattr = jffs2_setattr,
63 /***********************************************************************/
66 /* We keep the dirent list sorted in increasing order of name hash,
67 and we use the same hash function as the dentries. Makes this
68 nice and simple
70 static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,
71 struct nameidata *nd)
73 struct jffs2_inode_info *dir_f;
74 struct jffs2_sb_info *c;
75 struct jffs2_full_dirent *fd = NULL, *fd_list;
76 uint32_t ino = 0;
77 struct inode *inode = NULL;
79 D1(printk(KERN_DEBUG "jffs2_lookup()\n"));
81 dir_f = JFFS2_INODE_INFO(dir_i);
82 c = JFFS2_SB_INFO(dir_i->i_sb);
84 down(&dir_f->sem);
86 /* NB: The 2.2 backport will need to explicitly check for '.' and '..' here */
87 for (fd_list = dir_f->dents; fd_list && fd_list->nhash <= target->d_name.hash; fd_list = fd_list->next) {
88 if (fd_list->nhash == target->d_name.hash &&
89 (!fd || fd_list->version > fd->version) &&
90 strlen(fd_list->name) == target->d_name.len &&
91 !strncmp(fd_list->name, target->d_name.name, target->d_name.len)) {
92 fd = fd_list;
95 if (fd)
96 ino = fd->ino;
97 up(&dir_f->sem);
98 if (ino) {
99 inode = iget(dir_i->i_sb, ino);
100 if (!inode) {
101 printk(KERN_WARNING "iget() failed for ino #%u\n", ino);
102 return (ERR_PTR(-EIO));
106 d_add(target, inode);
108 return NULL;
111 /***********************************************************************/
114 static int jffs2_readdir(struct file *filp, void *dirent, filldir_t filldir)
116 struct jffs2_inode_info *f;
117 struct jffs2_sb_info *c;
118 struct inode *inode = filp->f_dentry->d_inode;
119 struct jffs2_full_dirent *fd;
120 unsigned long offset, curofs;
122 D1(printk(KERN_DEBUG "jffs2_readdir() for dir_i #%lu\n", filp->f_dentry->d_inode->i_ino));
124 f = JFFS2_INODE_INFO(inode);
125 c = JFFS2_SB_INFO(inode->i_sb);
127 offset = filp->f_pos;
129 if (offset == 0) {
130 D1(printk(KERN_DEBUG "Dirent 0: \".\", ino #%lu\n", inode->i_ino));
131 if (filldir(dirent, ".", 1, 0, inode->i_ino, DT_DIR) < 0)
132 goto out;
133 offset++;
135 if (offset == 1) {
136 unsigned long pino = parent_ino(filp->f_dentry);
137 D1(printk(KERN_DEBUG "Dirent 1: \"..\", ino #%lu\n", pino));
138 if (filldir(dirent, "..", 2, 1, pino, DT_DIR) < 0)
139 goto out;
140 offset++;
143 curofs=1;
144 down(&f->sem);
145 for (fd = f->dents; fd; fd = fd->next) {
147 curofs++;
148 /* First loop: curofs = 2; offset = 2 */
149 if (curofs < offset) {
150 D2(printk(KERN_DEBUG "Skipping dirent: \"%s\", ino #%u, type %d, because curofs %ld < offset %ld\n",
151 fd->name, fd->ino, fd->type, curofs, offset));
152 continue;
154 if (!fd->ino) {
155 D2(printk(KERN_DEBUG "Skipping deletion dirent \"%s\"\n", fd->name));
156 offset++;
157 continue;
159 D2(printk(KERN_DEBUG "Dirent %ld: \"%s\", ino #%u, type %d\n", offset, fd->name, fd->ino, fd->type));
160 if (filldir(dirent, fd->name, strlen(fd->name), offset, fd->ino, fd->type) < 0)
161 break;
162 offset++;
164 up(&f->sem);
165 out:
166 filp->f_pos = offset;
167 return 0;
170 /***********************************************************************/
173 static int jffs2_create(struct inode *dir_i, struct dentry *dentry, int mode,
174 struct nameidata *nd)
176 struct jffs2_raw_inode *ri;
177 struct jffs2_inode_info *f, *dir_f;
178 struct jffs2_sb_info *c;
179 struct inode *inode;
180 int ret;
182 ri = jffs2_alloc_raw_inode();
183 if (!ri)
184 return -ENOMEM;
186 c = JFFS2_SB_INFO(dir_i->i_sb);
188 D1(printk(KERN_DEBUG "jffs2_create()\n"));
190 inode = jffs2_new_inode(dir_i, mode, ri);
192 if (IS_ERR(inode)) {
193 D1(printk(KERN_DEBUG "jffs2_new_inode() failed\n"));
194 jffs2_free_raw_inode(ri);
195 return PTR_ERR(inode);
198 inode->i_op = &jffs2_file_inode_operations;
199 inode->i_fop = &jffs2_file_operations;
200 inode->i_mapping->a_ops = &jffs2_file_address_operations;
201 inode->i_mapping->nrpages = 0;
203 f = JFFS2_INODE_INFO(inode);
204 dir_f = JFFS2_INODE_INFO(dir_i);
206 ret = jffs2_do_create(c, dir_f, f, ri,
207 dentry->d_name.name, dentry->d_name.len);
209 if (ret) {
210 make_bad_inode(inode);
211 iput(inode);
212 jffs2_free_raw_inode(ri);
213 return ret;
216 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(ri->ctime));
218 jffs2_free_raw_inode(ri);
219 d_instantiate(dentry, inode);
221 D1(printk(KERN_DEBUG "jffs2_create: Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n",
222 inode->i_ino, inode->i_mode, inode->i_nlink, f->inocache->nlink, inode->i_mapping->nrpages));
223 return 0;
226 /***********************************************************************/
229 static int jffs2_unlink(struct inode *dir_i, struct dentry *dentry)
231 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
232 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
233 struct jffs2_inode_info *dead_f = JFFS2_INODE_INFO(dentry->d_inode);
234 int ret;
235 uint32_t now = get_seconds();
237 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
238 dentry->d_name.len, dead_f, now);
239 if (dead_f->inocache)
240 dentry->d_inode->i_nlink = dead_f->inocache->nlink;
241 if (!ret)
242 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
243 return ret;
245 /***********************************************************************/
248 static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry)
250 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dentry->d_inode->i_sb);
251 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
252 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
253 int ret;
254 uint8_t type;
255 uint32_t now;
257 /* Don't let people make hard links to bad inodes. */
258 if (!f->inocache)
259 return -EIO;
261 if (S_ISDIR(old_dentry->d_inode->i_mode))
262 return -EPERM;
264 /* XXX: This is ugly */
265 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
266 if (!type) type = DT_REG;
268 now = get_seconds();
269 ret = jffs2_do_link(c, dir_f, f->inocache->ino, type, dentry->d_name.name, dentry->d_name.len, now);
271 if (!ret) {
272 down(&f->sem);
273 old_dentry->d_inode->i_nlink = ++f->inocache->nlink;
274 up(&f->sem);
275 d_instantiate(dentry, old_dentry->d_inode);
276 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
277 atomic_inc(&old_dentry->d_inode->i_count);
279 return ret;
282 /***********************************************************************/
284 static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char *target)
286 struct jffs2_inode_info *f, *dir_f;
287 struct jffs2_sb_info *c;
288 struct inode *inode;
289 struct jffs2_raw_inode *ri;
290 struct jffs2_raw_dirent *rd;
291 struct jffs2_full_dnode *fn;
292 struct jffs2_full_dirent *fd;
293 int namelen;
294 uint32_t alloclen, phys_ofs;
295 int ret, targetlen = strlen(target);
297 /* FIXME: If you care. We'd need to use frags for the target
298 if it grows much more than this */
299 if (targetlen > 254)
300 return -EINVAL;
302 ri = jffs2_alloc_raw_inode();
304 if (!ri)
305 return -ENOMEM;
307 c = JFFS2_SB_INFO(dir_i->i_sb);
309 /* Try to reserve enough space for both node and dirent.
310 * Just the node will do for now, though
312 namelen = dentry->d_name.len;
313 ret = jffs2_reserve_space(c, sizeof(*ri) + targetlen, &phys_ofs, &alloclen,
314 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
316 if (ret) {
317 jffs2_free_raw_inode(ri);
318 return ret;
321 inode = jffs2_new_inode(dir_i, S_IFLNK | S_IRWXUGO, ri);
323 if (IS_ERR(inode)) {
324 jffs2_free_raw_inode(ri);
325 jffs2_complete_reservation(c);
326 return PTR_ERR(inode);
329 inode->i_op = &jffs2_symlink_inode_operations;
331 f = JFFS2_INODE_INFO(inode);
333 inode->i_size = targetlen;
334 ri->isize = ri->dsize = ri->csize = cpu_to_je32(inode->i_size);
335 ri->totlen = cpu_to_je32(sizeof(*ri) + inode->i_size);
336 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
338 ri->compr = JFFS2_COMPR_NONE;
339 ri->data_crc = cpu_to_je32(crc32(0, target, targetlen));
340 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
342 fn = jffs2_write_dnode(c, f, ri, target, targetlen, phys_ofs, ALLOC_NORMAL);
344 jffs2_free_raw_inode(ri);
346 if (IS_ERR(fn)) {
347 /* Eeek. Wave bye bye */
348 up(&f->sem);
349 jffs2_complete_reservation(c);
350 jffs2_clear_inode(inode);
351 return PTR_ERR(fn);
354 /* We use f->target field to store the target path. */
355 f->target = kmalloc(targetlen + 1, GFP_KERNEL);
356 if (!f->target) {
357 printk(KERN_WARNING "Can't allocate %d bytes of memory\n", targetlen + 1);
358 up(&f->sem);
359 jffs2_complete_reservation(c);
360 jffs2_clear_inode(inode);
361 return -ENOMEM;
364 memcpy(f->target, target, targetlen + 1);
365 D1(printk(KERN_DEBUG "jffs2_symlink: symlink's target '%s' cached\n", (char *)f->target));
367 /* No data here. Only a metadata node, which will be
368 obsoleted by the first data write
370 f->metadata = fn;
371 up(&f->sem);
373 jffs2_complete_reservation(c);
374 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen,
375 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
376 if (ret) {
377 /* Eep. */
378 jffs2_clear_inode(inode);
379 return ret;
382 rd = jffs2_alloc_raw_dirent();
383 if (!rd) {
384 /* Argh. Now we treat it like a normal delete */
385 jffs2_complete_reservation(c);
386 jffs2_clear_inode(inode);
387 return -ENOMEM;
390 dir_f = JFFS2_INODE_INFO(dir_i);
391 down(&dir_f->sem);
393 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
394 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
395 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
396 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
398 rd->pino = cpu_to_je32(dir_i->i_ino);
399 rd->version = cpu_to_je32(++dir_f->highest_version);
400 rd->ino = cpu_to_je32(inode->i_ino);
401 rd->mctime = cpu_to_je32(get_seconds());
402 rd->nsize = namelen;
403 rd->type = DT_LNK;
404 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
405 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
407 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, phys_ofs, ALLOC_NORMAL);
409 if (IS_ERR(fd)) {
410 /* dirent failed to write. Delete the inode normally
411 as if it were the final unlink() */
412 jffs2_complete_reservation(c);
413 jffs2_free_raw_dirent(rd);
414 up(&dir_f->sem);
415 jffs2_clear_inode(inode);
416 return PTR_ERR(fd);
419 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
421 jffs2_free_raw_dirent(rd);
423 /* Link the fd into the inode's list, obsoleting an old
424 one if necessary. */
425 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
427 up(&dir_f->sem);
428 jffs2_complete_reservation(c);
430 d_instantiate(dentry, inode);
431 return 0;
435 static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode)
437 struct jffs2_inode_info *f, *dir_f;
438 struct jffs2_sb_info *c;
439 struct inode *inode;
440 struct jffs2_raw_inode *ri;
441 struct jffs2_raw_dirent *rd;
442 struct jffs2_full_dnode *fn;
443 struct jffs2_full_dirent *fd;
444 int namelen;
445 uint32_t alloclen, phys_ofs;
446 int ret;
448 mode |= S_IFDIR;
450 ri = jffs2_alloc_raw_inode();
451 if (!ri)
452 return -ENOMEM;
454 c = JFFS2_SB_INFO(dir_i->i_sb);
456 /* Try to reserve enough space for both node and dirent.
457 * Just the node will do for now, though
459 namelen = dentry->d_name.len;
460 ret = jffs2_reserve_space(c, sizeof(*ri), &phys_ofs, &alloclen, ALLOC_NORMAL,
461 JFFS2_SUMMARY_INODE_SIZE);
463 if (ret) {
464 jffs2_free_raw_inode(ri);
465 return ret;
468 inode = jffs2_new_inode(dir_i, mode, ri);
470 if (IS_ERR(inode)) {
471 jffs2_free_raw_inode(ri);
472 jffs2_complete_reservation(c);
473 return PTR_ERR(inode);
476 inode->i_op = &jffs2_dir_inode_operations;
477 inode->i_fop = &jffs2_dir_operations;
478 /* Directories get nlink 2 at start */
479 inode->i_nlink = 2;
481 f = JFFS2_INODE_INFO(inode);
483 ri->data_crc = cpu_to_je32(0);
484 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
486 fn = jffs2_write_dnode(c, f, ri, NULL, 0, phys_ofs, ALLOC_NORMAL);
488 jffs2_free_raw_inode(ri);
490 if (IS_ERR(fn)) {
491 /* Eeek. Wave bye bye */
492 up(&f->sem);
493 jffs2_complete_reservation(c);
494 jffs2_clear_inode(inode);
495 return PTR_ERR(fn);
497 /* No data here. Only a metadata node, which will be
498 obsoleted by the first data write
500 f->metadata = fn;
501 up(&f->sem);
503 jffs2_complete_reservation(c);
504 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen,
505 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
506 if (ret) {
507 /* Eep. */
508 jffs2_clear_inode(inode);
509 return ret;
512 rd = jffs2_alloc_raw_dirent();
513 if (!rd) {
514 /* Argh. Now we treat it like a normal delete */
515 jffs2_complete_reservation(c);
516 jffs2_clear_inode(inode);
517 return -ENOMEM;
520 dir_f = JFFS2_INODE_INFO(dir_i);
521 down(&dir_f->sem);
523 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
524 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
525 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
526 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
528 rd->pino = cpu_to_je32(dir_i->i_ino);
529 rd->version = cpu_to_je32(++dir_f->highest_version);
530 rd->ino = cpu_to_je32(inode->i_ino);
531 rd->mctime = cpu_to_je32(get_seconds());
532 rd->nsize = namelen;
533 rd->type = DT_DIR;
534 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
535 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
537 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, phys_ofs, ALLOC_NORMAL);
539 if (IS_ERR(fd)) {
540 /* dirent failed to write. Delete the inode normally
541 as if it were the final unlink() */
542 jffs2_complete_reservation(c);
543 jffs2_free_raw_dirent(rd);
544 up(&dir_f->sem);
545 jffs2_clear_inode(inode);
546 return PTR_ERR(fd);
549 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
550 dir_i->i_nlink++;
552 jffs2_free_raw_dirent(rd);
554 /* Link the fd into the inode's list, obsoleting an old
555 one if necessary. */
556 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
558 up(&dir_f->sem);
559 jffs2_complete_reservation(c);
561 d_instantiate(dentry, inode);
562 return 0;
565 static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
567 struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
568 struct jffs2_full_dirent *fd;
569 int ret;
571 for (fd = f->dents ; fd; fd = fd->next) {
572 if (fd->ino)
573 return -ENOTEMPTY;
575 ret = jffs2_unlink(dir_i, dentry);
576 if (!ret)
577 dir_i->i_nlink--;
578 return ret;
581 static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, dev_t rdev)
583 struct jffs2_inode_info *f, *dir_f;
584 struct jffs2_sb_info *c;
585 struct inode *inode;
586 struct jffs2_raw_inode *ri;
587 struct jffs2_raw_dirent *rd;
588 struct jffs2_full_dnode *fn;
589 struct jffs2_full_dirent *fd;
590 int namelen;
591 jint16_t dev;
592 int devlen = 0;
593 uint32_t alloclen, phys_ofs;
594 int ret;
596 if (!old_valid_dev(rdev))
597 return -EINVAL;
599 ri = jffs2_alloc_raw_inode();
600 if (!ri)
601 return -ENOMEM;
603 c = JFFS2_SB_INFO(dir_i->i_sb);
605 if (S_ISBLK(mode) || S_ISCHR(mode)) {
606 dev = cpu_to_je16(old_encode_dev(rdev));
607 devlen = sizeof(dev);
610 /* Try to reserve enough space for both node and dirent.
611 * Just the node will do for now, though
613 namelen = dentry->d_name.len;
614 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &phys_ofs, &alloclen,
615 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
617 if (ret) {
618 jffs2_free_raw_inode(ri);
619 return ret;
622 inode = jffs2_new_inode(dir_i, mode, ri);
624 if (IS_ERR(inode)) {
625 jffs2_free_raw_inode(ri);
626 jffs2_complete_reservation(c);
627 return PTR_ERR(inode);
629 inode->i_op = &jffs2_file_inode_operations;
630 init_special_inode(inode, inode->i_mode, rdev);
632 f = JFFS2_INODE_INFO(inode);
634 ri->dsize = ri->csize = cpu_to_je32(devlen);
635 ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
636 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
638 ri->compr = JFFS2_COMPR_NONE;
639 ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
640 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
642 fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, phys_ofs, ALLOC_NORMAL);
644 jffs2_free_raw_inode(ri);
646 if (IS_ERR(fn)) {
647 /* Eeek. Wave bye bye */
648 up(&f->sem);
649 jffs2_complete_reservation(c);
650 jffs2_clear_inode(inode);
651 return PTR_ERR(fn);
653 /* No data here. Only a metadata node, which will be
654 obsoleted by the first data write
656 f->metadata = fn;
657 up(&f->sem);
659 jffs2_complete_reservation(c);
660 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen,
661 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
662 if (ret) {
663 /* Eep. */
664 jffs2_clear_inode(inode);
665 return ret;
668 rd = jffs2_alloc_raw_dirent();
669 if (!rd) {
670 /* Argh. Now we treat it like a normal delete */
671 jffs2_complete_reservation(c);
672 jffs2_clear_inode(inode);
673 return -ENOMEM;
676 dir_f = JFFS2_INODE_INFO(dir_i);
677 down(&dir_f->sem);
679 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
680 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
681 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
682 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
684 rd->pino = cpu_to_je32(dir_i->i_ino);
685 rd->version = cpu_to_je32(++dir_f->highest_version);
686 rd->ino = cpu_to_je32(inode->i_ino);
687 rd->mctime = cpu_to_je32(get_seconds());
688 rd->nsize = namelen;
690 /* XXX: This is ugly. */
691 rd->type = (mode & S_IFMT) >> 12;
693 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
694 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
696 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, phys_ofs, ALLOC_NORMAL);
698 if (IS_ERR(fd)) {
699 /* dirent failed to write. Delete the inode normally
700 as if it were the final unlink() */
701 jffs2_complete_reservation(c);
702 jffs2_free_raw_dirent(rd);
703 up(&dir_f->sem);
704 jffs2_clear_inode(inode);
705 return PTR_ERR(fd);
708 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
710 jffs2_free_raw_dirent(rd);
712 /* Link the fd into the inode's list, obsoleting an old
713 one if necessary. */
714 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
716 up(&dir_f->sem);
717 jffs2_complete_reservation(c);
719 d_instantiate(dentry, inode);
721 return 0;
724 static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
725 struct inode *new_dir_i, struct dentry *new_dentry)
727 int ret;
728 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
729 struct jffs2_inode_info *victim_f = NULL;
730 uint8_t type;
731 uint32_t now;
733 /* The VFS will check for us and prevent trying to rename a
734 * file over a directory and vice versa, but if it's a directory,
735 * the VFS can't check whether the victim is empty. The filesystem
736 * needs to do that for itself.
738 if (new_dentry->d_inode) {
739 victim_f = JFFS2_INODE_INFO(new_dentry->d_inode);
740 if (S_ISDIR(new_dentry->d_inode->i_mode)) {
741 struct jffs2_full_dirent *fd;
743 down(&victim_f->sem);
744 for (fd = victim_f->dents; fd; fd = fd->next) {
745 if (fd->ino) {
746 up(&victim_f->sem);
747 return -ENOTEMPTY;
750 up(&victim_f->sem);
754 /* XXX: We probably ought to alloc enough space for
755 both nodes at the same time. Writing the new link,
756 then getting -ENOSPC, is quite bad :)
759 /* Make a hard link */
761 /* XXX: This is ugly */
762 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
763 if (!type) type = DT_REG;
765 now = get_seconds();
766 ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
767 old_dentry->d_inode->i_ino, type,
768 new_dentry->d_name.name, new_dentry->d_name.len, now);
770 if (ret)
771 return ret;
773 if (victim_f) {
774 /* There was a victim. Kill it off nicely */
775 new_dentry->d_inode->i_nlink--;
776 /* Don't oops if the victim was a dirent pointing to an
777 inode which didn't exist. */
778 if (victim_f->inocache) {
779 down(&victim_f->sem);
780 victim_f->inocache->nlink--;
781 up(&victim_f->sem);
785 /* If it was a directory we moved, and there was no victim,
786 increase i_nlink on its new parent */
787 if (S_ISDIR(old_dentry->d_inode->i_mode) && !victim_f)
788 new_dir_i->i_nlink++;
790 /* Unlink the original */
791 ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
792 old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
794 /* We don't touch inode->i_nlink */
796 if (ret) {
797 /* Oh shit. We really ought to make a single node which can do both atomically */
798 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
799 down(&f->sem);
800 old_dentry->d_inode->i_nlink++;
801 if (f->inocache)
802 f->inocache->nlink++;
803 up(&f->sem);
805 printk(KERN_NOTICE "jffs2_rename(): Link succeeded, unlink failed (err %d). You now have a hard link\n", ret);
806 /* Might as well let the VFS know */
807 d_instantiate(new_dentry, old_dentry->d_inode);
808 atomic_inc(&old_dentry->d_inode->i_count);
809 new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now);
810 return ret;
813 if (S_ISDIR(old_dentry->d_inode->i_mode))
814 old_dir_i->i_nlink--;
816 new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
818 return 0;