[JFFS2] Remove compatibilty cruft for ancient kernels
[linux-2.6/openmoko-kernel/knife-kernel.git] / fs / jffs2 / dir.c
blob3ca0d25eef1d529f82da3ec83d1644c331d629f6
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.86 2005/07/06 12:13:09 dwmw2 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 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;
236 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
237 dentry->d_name.len, dead_f);
238 if (dead_f->inocache)
239 dentry->d_inode->i_nlink = dead_f->inocache->nlink;
240 return ret;
242 /***********************************************************************/
245 static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry)
247 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dentry->d_inode->i_sb);
248 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
249 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
250 int ret;
251 uint8_t type;
253 /* Don't let people make hard links to bad inodes. */
254 if (!f->inocache)
255 return -EIO;
257 if (S_ISDIR(old_dentry->d_inode->i_mode))
258 return -EPERM;
260 /* XXX: This is ugly */
261 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
262 if (!type) type = DT_REG;
264 ret = jffs2_do_link(c, dir_f, f->inocache->ino, type, dentry->d_name.name, dentry->d_name.len);
266 if (!ret) {
267 down(&f->sem);
268 old_dentry->d_inode->i_nlink = ++f->inocache->nlink;
269 up(&f->sem);
270 d_instantiate(dentry, old_dentry->d_inode);
271 atomic_inc(&old_dentry->d_inode->i_count);
273 return ret;
276 /***********************************************************************/
278 static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char *target)
280 struct jffs2_inode_info *f, *dir_f;
281 struct jffs2_sb_info *c;
282 struct inode *inode;
283 struct jffs2_raw_inode *ri;
284 struct jffs2_raw_dirent *rd;
285 struct jffs2_full_dnode *fn;
286 struct jffs2_full_dirent *fd;
287 int namelen;
288 uint32_t alloclen, phys_ofs;
289 int ret, targetlen = strlen(target);
291 /* FIXME: If you care. We'd need to use frags for the target
292 if it grows much more than this */
293 if (targetlen > 254)
294 return -EINVAL;
296 ri = jffs2_alloc_raw_inode();
298 if (!ri)
299 return -ENOMEM;
301 c = JFFS2_SB_INFO(dir_i->i_sb);
303 /* Try to reserve enough space for both node and dirent.
304 * Just the node will do for now, though
306 namelen = dentry->d_name.len;
307 ret = jffs2_reserve_space(c, sizeof(*ri) + targetlen, &phys_ofs, &alloclen, ALLOC_NORMAL);
309 if (ret) {
310 jffs2_free_raw_inode(ri);
311 return ret;
314 inode = jffs2_new_inode(dir_i, S_IFLNK | S_IRWXUGO, ri);
316 if (IS_ERR(inode)) {
317 jffs2_free_raw_inode(ri);
318 jffs2_complete_reservation(c);
319 return PTR_ERR(inode);
322 inode->i_op = &jffs2_symlink_inode_operations;
324 f = JFFS2_INODE_INFO(inode);
326 inode->i_size = targetlen;
327 ri->isize = ri->dsize = ri->csize = cpu_to_je32(inode->i_size);
328 ri->totlen = cpu_to_je32(sizeof(*ri) + inode->i_size);
329 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
331 ri->compr = JFFS2_COMPR_NONE;
332 ri->data_crc = cpu_to_je32(crc32(0, target, targetlen));
333 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
335 fn = jffs2_write_dnode(c, f, ri, target, targetlen, phys_ofs, ALLOC_NORMAL);
337 jffs2_free_raw_inode(ri);
339 if (IS_ERR(fn)) {
340 /* Eeek. Wave bye bye */
341 up(&f->sem);
342 jffs2_complete_reservation(c);
343 jffs2_clear_inode(inode);
344 return PTR_ERR(fn);
347 /* We use f->dents field to store the target path. */
348 f->dents = kmalloc(targetlen + 1, GFP_KERNEL);
349 if (!f->dents) {
350 printk(KERN_WARNING "Can't allocate %d bytes of memory\n", targetlen + 1);
351 up(&f->sem);
352 jffs2_complete_reservation(c);
353 jffs2_clear_inode(inode);
354 return -ENOMEM;
357 memcpy(f->dents, target, targetlen + 1);
358 D1(printk(KERN_DEBUG "jffs2_symlink: symlink's target '%s' cached\n", (char *)f->dents));
360 /* No data here. Only a metadata node, which will be
361 obsoleted by the first data write
363 f->metadata = fn;
364 up(&f->sem);
366 jffs2_complete_reservation(c);
367 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen, ALLOC_NORMAL);
368 if (ret) {
369 /* Eep. */
370 jffs2_clear_inode(inode);
371 return ret;
374 rd = jffs2_alloc_raw_dirent();
375 if (!rd) {
376 /* Argh. Now we treat it like a normal delete */
377 jffs2_complete_reservation(c);
378 jffs2_clear_inode(inode);
379 return -ENOMEM;
382 dir_f = JFFS2_INODE_INFO(dir_i);
383 down(&dir_f->sem);
385 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
386 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
387 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
388 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
390 rd->pino = cpu_to_je32(dir_i->i_ino);
391 rd->version = cpu_to_je32(++dir_f->highest_version);
392 rd->ino = cpu_to_je32(inode->i_ino);
393 rd->mctime = cpu_to_je32(get_seconds());
394 rd->nsize = namelen;
395 rd->type = DT_LNK;
396 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
397 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
399 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, phys_ofs, ALLOC_NORMAL);
401 if (IS_ERR(fd)) {
402 /* dirent failed to write. Delete the inode normally
403 as if it were the final unlink() */
404 jffs2_complete_reservation(c);
405 jffs2_free_raw_dirent(rd);
406 up(&dir_f->sem);
407 jffs2_clear_inode(inode);
408 return PTR_ERR(fd);
411 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
413 jffs2_free_raw_dirent(rd);
415 /* Link the fd into the inode's list, obsoleting an old
416 one if necessary. */
417 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
419 up(&dir_f->sem);
420 jffs2_complete_reservation(c);
422 d_instantiate(dentry, inode);
423 return 0;
427 static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode)
429 struct jffs2_inode_info *f, *dir_f;
430 struct jffs2_sb_info *c;
431 struct inode *inode;
432 struct jffs2_raw_inode *ri;
433 struct jffs2_raw_dirent *rd;
434 struct jffs2_full_dnode *fn;
435 struct jffs2_full_dirent *fd;
436 int namelen;
437 uint32_t alloclen, phys_ofs;
438 int ret;
440 mode |= S_IFDIR;
442 ri = jffs2_alloc_raw_inode();
443 if (!ri)
444 return -ENOMEM;
446 c = JFFS2_SB_INFO(dir_i->i_sb);
448 /* Try to reserve enough space for both node and dirent.
449 * Just the node will do for now, though
451 namelen = dentry->d_name.len;
452 ret = jffs2_reserve_space(c, sizeof(*ri), &phys_ofs, &alloclen, ALLOC_NORMAL);
454 if (ret) {
455 jffs2_free_raw_inode(ri);
456 return ret;
459 inode = jffs2_new_inode(dir_i, mode, ri);
461 if (IS_ERR(inode)) {
462 jffs2_free_raw_inode(ri);
463 jffs2_complete_reservation(c);
464 return PTR_ERR(inode);
467 inode->i_op = &jffs2_dir_inode_operations;
468 inode->i_fop = &jffs2_dir_operations;
469 /* Directories get nlink 2 at start */
470 inode->i_nlink = 2;
472 f = JFFS2_INODE_INFO(inode);
474 ri->data_crc = cpu_to_je32(0);
475 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
477 fn = jffs2_write_dnode(c, f, ri, NULL, 0, phys_ofs, ALLOC_NORMAL);
479 jffs2_free_raw_inode(ri);
481 if (IS_ERR(fn)) {
482 /* Eeek. Wave bye bye */
483 up(&f->sem);
484 jffs2_complete_reservation(c);
485 jffs2_clear_inode(inode);
486 return PTR_ERR(fn);
488 /* No data here. Only a metadata node, which will be
489 obsoleted by the first data write
491 f->metadata = fn;
492 up(&f->sem);
494 jffs2_complete_reservation(c);
495 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen, ALLOC_NORMAL);
496 if (ret) {
497 /* Eep. */
498 jffs2_clear_inode(inode);
499 return ret;
502 rd = jffs2_alloc_raw_dirent();
503 if (!rd) {
504 /* Argh. Now we treat it like a normal delete */
505 jffs2_complete_reservation(c);
506 jffs2_clear_inode(inode);
507 return -ENOMEM;
510 dir_f = JFFS2_INODE_INFO(dir_i);
511 down(&dir_f->sem);
513 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
514 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
515 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
516 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
518 rd->pino = cpu_to_je32(dir_i->i_ino);
519 rd->version = cpu_to_je32(++dir_f->highest_version);
520 rd->ino = cpu_to_je32(inode->i_ino);
521 rd->mctime = cpu_to_je32(get_seconds());
522 rd->nsize = namelen;
523 rd->type = DT_DIR;
524 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
525 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
527 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, phys_ofs, ALLOC_NORMAL);
529 if (IS_ERR(fd)) {
530 /* dirent failed to write. Delete the inode normally
531 as if it were the final unlink() */
532 jffs2_complete_reservation(c);
533 jffs2_free_raw_dirent(rd);
534 up(&dir_f->sem);
535 jffs2_clear_inode(inode);
536 return PTR_ERR(fd);
539 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
540 dir_i->i_nlink++;
542 jffs2_free_raw_dirent(rd);
544 /* Link the fd into the inode's list, obsoleting an old
545 one if necessary. */
546 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
548 up(&dir_f->sem);
549 jffs2_complete_reservation(c);
551 d_instantiate(dentry, inode);
552 return 0;
555 static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
557 struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
558 struct jffs2_full_dirent *fd;
559 int ret;
561 for (fd = f->dents ; fd; fd = fd->next) {
562 if (fd->ino)
563 return -ENOTEMPTY;
565 ret = jffs2_unlink(dir_i, dentry);
566 if (!ret)
567 dir_i->i_nlink--;
568 return ret;
571 static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, dev_t rdev)
573 struct jffs2_inode_info *f, *dir_f;
574 struct jffs2_sb_info *c;
575 struct inode *inode;
576 struct jffs2_raw_inode *ri;
577 struct jffs2_raw_dirent *rd;
578 struct jffs2_full_dnode *fn;
579 struct jffs2_full_dirent *fd;
580 int namelen;
581 jint16_t dev;
582 int devlen = 0;
583 uint32_t alloclen, phys_ofs;
584 int ret;
586 if (!old_valid_dev(rdev))
587 return -EINVAL;
589 ri = jffs2_alloc_raw_inode();
590 if (!ri)
591 return -ENOMEM;
593 c = JFFS2_SB_INFO(dir_i->i_sb);
595 if (S_ISBLK(mode) || S_ISCHR(mode)) {
596 dev = cpu_to_je16(old_encode_dev(rdev));
597 devlen = sizeof(dev);
600 /* Try to reserve enough space for both node and dirent.
601 * Just the node will do for now, though
603 namelen = dentry->d_name.len;
604 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &phys_ofs, &alloclen, ALLOC_NORMAL);
606 if (ret) {
607 jffs2_free_raw_inode(ri);
608 return ret;
611 inode = jffs2_new_inode(dir_i, mode, ri);
613 if (IS_ERR(inode)) {
614 jffs2_free_raw_inode(ri);
615 jffs2_complete_reservation(c);
616 return PTR_ERR(inode);
618 inode->i_op = &jffs2_file_inode_operations;
619 init_special_inode(inode, inode->i_mode, rdev);
621 f = JFFS2_INODE_INFO(inode);
623 ri->dsize = ri->csize = cpu_to_je32(devlen);
624 ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
625 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
627 ri->compr = JFFS2_COMPR_NONE;
628 ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
629 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
631 fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, phys_ofs, ALLOC_NORMAL);
633 jffs2_free_raw_inode(ri);
635 if (IS_ERR(fn)) {
636 /* Eeek. Wave bye bye */
637 up(&f->sem);
638 jffs2_complete_reservation(c);
639 jffs2_clear_inode(inode);
640 return PTR_ERR(fn);
642 /* No data here. Only a metadata node, which will be
643 obsoleted by the first data write
645 f->metadata = fn;
646 up(&f->sem);
648 jffs2_complete_reservation(c);
649 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen, ALLOC_NORMAL);
650 if (ret) {
651 /* Eep. */
652 jffs2_clear_inode(inode);
653 return ret;
656 rd = jffs2_alloc_raw_dirent();
657 if (!rd) {
658 /* Argh. Now we treat it like a normal delete */
659 jffs2_complete_reservation(c);
660 jffs2_clear_inode(inode);
661 return -ENOMEM;
664 dir_f = JFFS2_INODE_INFO(dir_i);
665 down(&dir_f->sem);
667 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
668 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
669 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
670 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
672 rd->pino = cpu_to_je32(dir_i->i_ino);
673 rd->version = cpu_to_je32(++dir_f->highest_version);
674 rd->ino = cpu_to_je32(inode->i_ino);
675 rd->mctime = cpu_to_je32(get_seconds());
676 rd->nsize = namelen;
678 /* XXX: This is ugly. */
679 rd->type = (mode & S_IFMT) >> 12;
681 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
682 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
684 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, phys_ofs, ALLOC_NORMAL);
686 if (IS_ERR(fd)) {
687 /* dirent failed to write. Delete the inode normally
688 as if it were the final unlink() */
689 jffs2_complete_reservation(c);
690 jffs2_free_raw_dirent(rd);
691 up(&dir_f->sem);
692 jffs2_clear_inode(inode);
693 return PTR_ERR(fd);
696 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
698 jffs2_free_raw_dirent(rd);
700 /* Link the fd into the inode's list, obsoleting an old
701 one if necessary. */
702 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
704 up(&dir_f->sem);
705 jffs2_complete_reservation(c);
707 d_instantiate(dentry, inode);
709 return 0;
712 static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
713 struct inode *new_dir_i, struct dentry *new_dentry)
715 int ret;
716 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
717 struct jffs2_inode_info *victim_f = NULL;
718 uint8_t type;
720 /* The VFS will check for us and prevent trying to rename a
721 * file over a directory and vice versa, but if it's a directory,
722 * the VFS can't check whether the victim is empty. The filesystem
723 * needs to do that for itself.
725 if (new_dentry->d_inode) {
726 victim_f = JFFS2_INODE_INFO(new_dentry->d_inode);
727 if (S_ISDIR(new_dentry->d_inode->i_mode)) {
728 struct jffs2_full_dirent *fd;
730 down(&victim_f->sem);
731 for (fd = victim_f->dents; fd; fd = fd->next) {
732 if (fd->ino) {
733 up(&victim_f->sem);
734 return -ENOTEMPTY;
737 up(&victim_f->sem);
741 /* XXX: We probably ought to alloc enough space for
742 both nodes at the same time. Writing the new link,
743 then getting -ENOSPC, is quite bad :)
746 /* Make a hard link */
748 /* XXX: This is ugly */
749 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
750 if (!type) type = DT_REG;
752 ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
753 old_dentry->d_inode->i_ino, type,
754 new_dentry->d_name.name, new_dentry->d_name.len);
756 if (ret)
757 return ret;
759 if (victim_f) {
760 /* There was a victim. Kill it off nicely */
761 new_dentry->d_inode->i_nlink--;
762 /* Don't oops if the victim was a dirent pointing to an
763 inode which didn't exist. */
764 if (victim_f->inocache) {
765 down(&victim_f->sem);
766 victim_f->inocache->nlink--;
767 up(&victim_f->sem);
771 /* If it was a directory we moved, and there was no victim,
772 increase i_nlink on its new parent */
773 if (S_ISDIR(old_dentry->d_inode->i_mode) && !victim_f)
774 new_dir_i->i_nlink++;
776 /* Unlink the original */
777 ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
778 old_dentry->d_name.name, old_dentry->d_name.len, NULL);
780 /* We don't touch inode->i_nlink */
782 if (ret) {
783 /* Oh shit. We really ought to make a single node which can do both atomically */
784 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
785 down(&f->sem);
786 old_dentry->d_inode->i_nlink++;
787 if (f->inocache)
788 f->inocache->nlink++;
789 up(&f->sem);
791 printk(KERN_NOTICE "jffs2_rename(): Link succeeded, unlink failed (err %d). You now have a hard link\n", ret);
792 /* Might as well let the VFS know */
793 d_instantiate(new_dentry, old_dentry->d_inode);
794 atomic_inc(&old_dentry->d_inode->i_count);
795 return ret;
798 if (S_ISDIR(old_dentry->d_inode->i_mode))
799 old_dir_i->i_nlink--;
801 return 0;