[IPCONFIG]: ip_auto_config fix
[linux-2.6/btrfs-unstable.git] / fs / jffs2 / dir.c
blobc1dfca310dd6089341628d17513fb9efb9f70c1e
1 /*
2 * JFFS2 -- Journalling Flash File System, Version 2.
4 * Copyright © 2001-2007 Red Hat, Inc.
6 * Created by David Woodhouse <dwmw2@infradead.org>
8 * For licensing information, see the file 'LICENCE' in this directory.
12 #include <linux/kernel.h>
13 #include <linux/slab.h>
14 #include <linux/fs.h>
15 #include <linux/crc32.h>
16 #include <linux/jffs2.h>
17 #include "jffs2_fs_i.h"
18 #include "jffs2_fs_sb.h"
19 #include <linux/time.h>
20 #include "nodelist.h"
22 static int jffs2_readdir (struct file *, void *, filldir_t);
24 static int jffs2_create (struct inode *,struct dentry *,int,
25 struct nameidata *);
26 static struct dentry *jffs2_lookup (struct inode *,struct dentry *,
27 struct nameidata *);
28 static int jffs2_link (struct dentry *,struct inode *,struct dentry *);
29 static int jffs2_unlink (struct inode *,struct dentry *);
30 static int jffs2_symlink (struct inode *,struct dentry *,const char *);
31 static int jffs2_mkdir (struct inode *,struct dentry *,int);
32 static int jffs2_rmdir (struct inode *,struct dentry *);
33 static int jffs2_mknod (struct inode *,struct dentry *,int,dev_t);
34 static int jffs2_rename (struct inode *, struct dentry *,
35 struct inode *, struct dentry *);
37 const struct file_operations jffs2_dir_operations =
39 .read = generic_read_dir,
40 .readdir = jffs2_readdir,
41 .ioctl = jffs2_ioctl,
42 .fsync = jffs2_fsync
46 const struct inode_operations jffs2_dir_inode_operations =
48 .create = jffs2_create,
49 .lookup = jffs2_lookup,
50 .link = jffs2_link,
51 .unlink = jffs2_unlink,
52 .symlink = jffs2_symlink,
53 .mkdir = jffs2_mkdir,
54 .rmdir = jffs2_rmdir,
55 .mknod = jffs2_mknod,
56 .rename = jffs2_rename,
57 .permission = jffs2_permission,
58 .setattr = jffs2_setattr,
59 .setxattr = jffs2_setxattr,
60 .getxattr = jffs2_getxattr,
61 .listxattr = jffs2_listxattr,
62 .removexattr = jffs2_removexattr
65 /***********************************************************************/
68 /* We keep the dirent list sorted in increasing order of name hash,
69 and we use the same hash function as the dentries. Makes this
70 nice and simple
72 static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,
73 struct nameidata *nd)
75 struct jffs2_inode_info *dir_f;
76 struct jffs2_sb_info *c;
77 struct jffs2_full_dirent *fd = NULL, *fd_list;
78 uint32_t ino = 0;
79 struct inode *inode = NULL;
81 D1(printk(KERN_DEBUG "jffs2_lookup()\n"));
83 if (target->d_name.len > JFFS2_MAX_NAME_LEN)
84 return ERR_PTR(-ENAMETOOLONG);
86 dir_f = JFFS2_INODE_INFO(dir_i);
87 c = JFFS2_SB_INFO(dir_i->i_sb);
89 down(&dir_f->sem);
91 /* NB: The 2.2 backport will need to explicitly check for '.' and '..' here */
92 for (fd_list = dir_f->dents; fd_list && fd_list->nhash <= target->d_name.hash; fd_list = fd_list->next) {
93 if (fd_list->nhash == target->d_name.hash &&
94 (!fd || fd_list->version > fd->version) &&
95 strlen(fd_list->name) == target->d_name.len &&
96 !strncmp(fd_list->name, target->d_name.name, target->d_name.len)) {
97 fd = fd_list;
100 if (fd)
101 ino = fd->ino;
102 up(&dir_f->sem);
103 if (ino) {
104 inode = iget(dir_i->i_sb, ino);
105 if (!inode) {
106 printk(KERN_WARNING "iget() failed for ino #%u\n", ino);
107 return (ERR_PTR(-EIO));
111 d_add(target, inode);
113 return NULL;
116 /***********************************************************************/
119 static int jffs2_readdir(struct file *filp, void *dirent, filldir_t filldir)
121 struct jffs2_inode_info *f;
122 struct jffs2_sb_info *c;
123 struct inode *inode = filp->f_path.dentry->d_inode;
124 struct jffs2_full_dirent *fd;
125 unsigned long offset, curofs;
127 D1(printk(KERN_DEBUG "jffs2_readdir() for dir_i #%lu\n", filp->f_path.dentry->d_inode->i_ino));
129 f = JFFS2_INODE_INFO(inode);
130 c = JFFS2_SB_INFO(inode->i_sb);
132 offset = filp->f_pos;
134 if (offset == 0) {
135 D1(printk(KERN_DEBUG "Dirent 0: \".\", ino #%lu\n", inode->i_ino));
136 if (filldir(dirent, ".", 1, 0, inode->i_ino, DT_DIR) < 0)
137 goto out;
138 offset++;
140 if (offset == 1) {
141 unsigned long pino = parent_ino(filp->f_path.dentry);
142 D1(printk(KERN_DEBUG "Dirent 1: \"..\", ino #%lu\n", pino));
143 if (filldir(dirent, "..", 2, 1, pino, DT_DIR) < 0)
144 goto out;
145 offset++;
148 curofs=1;
149 down(&f->sem);
150 for (fd = f->dents; fd; fd = fd->next) {
152 curofs++;
153 /* First loop: curofs = 2; offset = 2 */
154 if (curofs < offset) {
155 D2(printk(KERN_DEBUG "Skipping dirent: \"%s\", ino #%u, type %d, because curofs %ld < offset %ld\n",
156 fd->name, fd->ino, fd->type, curofs, offset));
157 continue;
159 if (!fd->ino) {
160 D2(printk(KERN_DEBUG "Skipping deletion dirent \"%s\"\n", fd->name));
161 offset++;
162 continue;
164 D2(printk(KERN_DEBUG "Dirent %ld: \"%s\", ino #%u, type %d\n", offset, fd->name, fd->ino, fd->type));
165 if (filldir(dirent, fd->name, strlen(fd->name), offset, fd->ino, fd->type) < 0)
166 break;
167 offset++;
169 up(&f->sem);
170 out:
171 filp->f_pos = offset;
172 return 0;
175 /***********************************************************************/
178 static int jffs2_create(struct inode *dir_i, struct dentry *dentry, int mode,
179 struct nameidata *nd)
181 struct jffs2_raw_inode *ri;
182 struct jffs2_inode_info *f, *dir_f;
183 struct jffs2_sb_info *c;
184 struct inode *inode;
185 int ret;
187 ri = jffs2_alloc_raw_inode();
188 if (!ri)
189 return -ENOMEM;
191 c = JFFS2_SB_INFO(dir_i->i_sb);
193 D1(printk(KERN_DEBUG "jffs2_create()\n"));
195 inode = jffs2_new_inode(dir_i, mode, ri);
197 if (IS_ERR(inode)) {
198 D1(printk(KERN_DEBUG "jffs2_new_inode() failed\n"));
199 jffs2_free_raw_inode(ri);
200 return PTR_ERR(inode);
203 inode->i_op = &jffs2_file_inode_operations;
204 inode->i_fop = &jffs2_file_operations;
205 inode->i_mapping->a_ops = &jffs2_file_address_operations;
206 inode->i_mapping->nrpages = 0;
208 f = JFFS2_INODE_INFO(inode);
209 dir_f = JFFS2_INODE_INFO(dir_i);
211 ret = jffs2_do_create(c, dir_f, f, ri,
212 dentry->d_name.name, dentry->d_name.len);
214 if (ret)
215 goto fail;
217 ret = jffs2_init_security(inode, dir_i);
218 if (ret)
219 goto fail;
220 ret = jffs2_init_acl(inode, dir_i);
221 if (ret)
222 goto fail;
224 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(ri->ctime));
226 jffs2_free_raw_inode(ri);
227 d_instantiate(dentry, inode);
229 D1(printk(KERN_DEBUG "jffs2_create: Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n",
230 inode->i_ino, inode->i_mode, inode->i_nlink, f->inocache->nlink, inode->i_mapping->nrpages));
231 return 0;
233 fail:
234 make_bad_inode(inode);
235 iput(inode);
236 jffs2_free_raw_inode(ri);
237 return ret;
240 /***********************************************************************/
243 static int jffs2_unlink(struct inode *dir_i, struct dentry *dentry)
245 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
246 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
247 struct jffs2_inode_info *dead_f = JFFS2_INODE_INFO(dentry->d_inode);
248 int ret;
249 uint32_t now = get_seconds();
251 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
252 dentry->d_name.len, dead_f, now);
253 if (dead_f->inocache)
254 dentry->d_inode->i_nlink = dead_f->inocache->nlink;
255 if (!ret)
256 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
257 return ret;
259 /***********************************************************************/
262 static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry)
264 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dentry->d_inode->i_sb);
265 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
266 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
267 int ret;
268 uint8_t type;
269 uint32_t now;
271 /* Don't let people make hard links to bad inodes. */
272 if (!f->inocache)
273 return -EIO;
275 if (S_ISDIR(old_dentry->d_inode->i_mode))
276 return -EPERM;
278 /* XXX: This is ugly */
279 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
280 if (!type) type = DT_REG;
282 now = get_seconds();
283 ret = jffs2_do_link(c, dir_f, f->inocache->ino, type, dentry->d_name.name, dentry->d_name.len, now);
285 if (!ret) {
286 down(&f->sem);
287 old_dentry->d_inode->i_nlink = ++f->inocache->nlink;
288 up(&f->sem);
289 d_instantiate(dentry, old_dentry->d_inode);
290 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
291 atomic_inc(&old_dentry->d_inode->i_count);
293 return ret;
296 /***********************************************************************/
298 static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char *target)
300 struct jffs2_inode_info *f, *dir_f;
301 struct jffs2_sb_info *c;
302 struct inode *inode;
303 struct jffs2_raw_inode *ri;
304 struct jffs2_raw_dirent *rd;
305 struct jffs2_full_dnode *fn;
306 struct jffs2_full_dirent *fd;
307 int namelen;
308 uint32_t alloclen;
309 int ret, targetlen = strlen(target);
311 /* FIXME: If you care. We'd need to use frags for the target
312 if it grows much more than this */
313 if (targetlen > 254)
314 return -EINVAL;
316 ri = jffs2_alloc_raw_inode();
318 if (!ri)
319 return -ENOMEM;
321 c = JFFS2_SB_INFO(dir_i->i_sb);
323 /* Try to reserve enough space for both node and dirent.
324 * Just the node will do for now, though
326 namelen = dentry->d_name.len;
327 ret = jffs2_reserve_space(c, sizeof(*ri) + targetlen, &alloclen,
328 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
330 if (ret) {
331 jffs2_free_raw_inode(ri);
332 return ret;
335 inode = jffs2_new_inode(dir_i, S_IFLNK | S_IRWXUGO, ri);
337 if (IS_ERR(inode)) {
338 jffs2_free_raw_inode(ri);
339 jffs2_complete_reservation(c);
340 return PTR_ERR(inode);
343 inode->i_op = &jffs2_symlink_inode_operations;
345 f = JFFS2_INODE_INFO(inode);
347 inode->i_size = targetlen;
348 ri->isize = ri->dsize = ri->csize = cpu_to_je32(inode->i_size);
349 ri->totlen = cpu_to_je32(sizeof(*ri) + inode->i_size);
350 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
352 ri->compr = JFFS2_COMPR_NONE;
353 ri->data_crc = cpu_to_je32(crc32(0, target, targetlen));
354 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
356 fn = jffs2_write_dnode(c, f, ri, target, targetlen, ALLOC_NORMAL);
358 jffs2_free_raw_inode(ri);
360 if (IS_ERR(fn)) {
361 /* Eeek. Wave bye bye */
362 up(&f->sem);
363 jffs2_complete_reservation(c);
364 jffs2_clear_inode(inode);
365 return PTR_ERR(fn);
368 /* We use f->target field to store the target path. */
369 f->target = kmalloc(targetlen + 1, GFP_KERNEL);
370 if (!f->target) {
371 printk(KERN_WARNING "Can't allocate %d bytes of memory\n", targetlen + 1);
372 up(&f->sem);
373 jffs2_complete_reservation(c);
374 jffs2_clear_inode(inode);
375 return -ENOMEM;
378 memcpy(f->target, target, targetlen + 1);
379 D1(printk(KERN_DEBUG "jffs2_symlink: symlink's target '%s' cached\n", (char *)f->target));
381 /* No data here. Only a metadata node, which will be
382 obsoleted by the first data write
384 f->metadata = fn;
385 up(&f->sem);
387 jffs2_complete_reservation(c);
389 ret = jffs2_init_security(inode, dir_i);
390 if (ret) {
391 jffs2_clear_inode(inode);
392 return ret;
394 ret = jffs2_init_acl(inode, dir_i);
395 if (ret) {
396 jffs2_clear_inode(inode);
397 return ret;
400 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
401 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
402 if (ret) {
403 /* Eep. */
404 jffs2_clear_inode(inode);
405 return ret;
408 rd = jffs2_alloc_raw_dirent();
409 if (!rd) {
410 /* Argh. Now we treat it like a normal delete */
411 jffs2_complete_reservation(c);
412 jffs2_clear_inode(inode);
413 return -ENOMEM;
416 dir_f = JFFS2_INODE_INFO(dir_i);
417 down(&dir_f->sem);
419 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
420 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
421 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
422 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
424 rd->pino = cpu_to_je32(dir_i->i_ino);
425 rd->version = cpu_to_je32(++dir_f->highest_version);
426 rd->ino = cpu_to_je32(inode->i_ino);
427 rd->mctime = cpu_to_je32(get_seconds());
428 rd->nsize = namelen;
429 rd->type = DT_LNK;
430 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
431 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
433 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
435 if (IS_ERR(fd)) {
436 /* dirent failed to write. Delete the inode normally
437 as if it were the final unlink() */
438 jffs2_complete_reservation(c);
439 jffs2_free_raw_dirent(rd);
440 up(&dir_f->sem);
441 jffs2_clear_inode(inode);
442 return PTR_ERR(fd);
445 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
447 jffs2_free_raw_dirent(rd);
449 /* Link the fd into the inode's list, obsoleting an old
450 one if necessary. */
451 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
453 up(&dir_f->sem);
454 jffs2_complete_reservation(c);
456 d_instantiate(dentry, inode);
457 return 0;
461 static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode)
463 struct jffs2_inode_info *f, *dir_f;
464 struct jffs2_sb_info *c;
465 struct inode *inode;
466 struct jffs2_raw_inode *ri;
467 struct jffs2_raw_dirent *rd;
468 struct jffs2_full_dnode *fn;
469 struct jffs2_full_dirent *fd;
470 int namelen;
471 uint32_t alloclen;
472 int ret;
474 mode |= S_IFDIR;
476 ri = jffs2_alloc_raw_inode();
477 if (!ri)
478 return -ENOMEM;
480 c = JFFS2_SB_INFO(dir_i->i_sb);
482 /* Try to reserve enough space for both node and dirent.
483 * Just the node will do for now, though
485 namelen = dentry->d_name.len;
486 ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL,
487 JFFS2_SUMMARY_INODE_SIZE);
489 if (ret) {
490 jffs2_free_raw_inode(ri);
491 return ret;
494 inode = jffs2_new_inode(dir_i, mode, ri);
496 if (IS_ERR(inode)) {
497 jffs2_free_raw_inode(ri);
498 jffs2_complete_reservation(c);
499 return PTR_ERR(inode);
502 inode->i_op = &jffs2_dir_inode_operations;
503 inode->i_fop = &jffs2_dir_operations;
504 /* Directories get nlink 2 at start */
505 inode->i_nlink = 2;
507 f = JFFS2_INODE_INFO(inode);
509 ri->data_crc = cpu_to_je32(0);
510 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
512 fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL);
514 jffs2_free_raw_inode(ri);
516 if (IS_ERR(fn)) {
517 /* Eeek. Wave bye bye */
518 up(&f->sem);
519 jffs2_complete_reservation(c);
520 jffs2_clear_inode(inode);
521 return PTR_ERR(fn);
523 /* No data here. Only a metadata node, which will be
524 obsoleted by the first data write
526 f->metadata = fn;
527 up(&f->sem);
529 jffs2_complete_reservation(c);
531 ret = jffs2_init_security(inode, dir_i);
532 if (ret) {
533 jffs2_clear_inode(inode);
534 return ret;
536 ret = jffs2_init_acl(inode, dir_i);
537 if (ret) {
538 jffs2_clear_inode(inode);
539 return ret;
542 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
543 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
544 if (ret) {
545 /* Eep. */
546 jffs2_clear_inode(inode);
547 return ret;
550 rd = jffs2_alloc_raw_dirent();
551 if (!rd) {
552 /* Argh. Now we treat it like a normal delete */
553 jffs2_complete_reservation(c);
554 jffs2_clear_inode(inode);
555 return -ENOMEM;
558 dir_f = JFFS2_INODE_INFO(dir_i);
559 down(&dir_f->sem);
561 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
562 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
563 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
564 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
566 rd->pino = cpu_to_je32(dir_i->i_ino);
567 rd->version = cpu_to_je32(++dir_f->highest_version);
568 rd->ino = cpu_to_je32(inode->i_ino);
569 rd->mctime = cpu_to_je32(get_seconds());
570 rd->nsize = namelen;
571 rd->type = DT_DIR;
572 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
573 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
575 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
577 if (IS_ERR(fd)) {
578 /* dirent failed to write. Delete the inode normally
579 as if it were the final unlink() */
580 jffs2_complete_reservation(c);
581 jffs2_free_raw_dirent(rd);
582 up(&dir_f->sem);
583 jffs2_clear_inode(inode);
584 return PTR_ERR(fd);
587 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
588 inc_nlink(dir_i);
590 jffs2_free_raw_dirent(rd);
592 /* Link the fd into the inode's list, obsoleting an old
593 one if necessary. */
594 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
596 up(&dir_f->sem);
597 jffs2_complete_reservation(c);
599 d_instantiate(dentry, inode);
600 return 0;
603 static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
605 struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
606 struct jffs2_full_dirent *fd;
607 int ret;
609 for (fd = f->dents ; fd; fd = fd->next) {
610 if (fd->ino)
611 return -ENOTEMPTY;
613 ret = jffs2_unlink(dir_i, dentry);
614 if (!ret)
615 drop_nlink(dir_i);
616 return ret;
619 static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, dev_t rdev)
621 struct jffs2_inode_info *f, *dir_f;
622 struct jffs2_sb_info *c;
623 struct inode *inode;
624 struct jffs2_raw_inode *ri;
625 struct jffs2_raw_dirent *rd;
626 struct jffs2_full_dnode *fn;
627 struct jffs2_full_dirent *fd;
628 int namelen;
629 union jffs2_device_node dev;
630 int devlen = 0;
631 uint32_t alloclen;
632 int ret;
634 if (!new_valid_dev(rdev))
635 return -EINVAL;
637 ri = jffs2_alloc_raw_inode();
638 if (!ri)
639 return -ENOMEM;
641 c = JFFS2_SB_INFO(dir_i->i_sb);
643 if (S_ISBLK(mode) || S_ISCHR(mode))
644 devlen = jffs2_encode_dev(&dev, rdev);
646 /* Try to reserve enough space for both node and dirent.
647 * Just the node will do for now, though
649 namelen = dentry->d_name.len;
650 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &alloclen,
651 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
653 if (ret) {
654 jffs2_free_raw_inode(ri);
655 return ret;
658 inode = jffs2_new_inode(dir_i, mode, ri);
660 if (IS_ERR(inode)) {
661 jffs2_free_raw_inode(ri);
662 jffs2_complete_reservation(c);
663 return PTR_ERR(inode);
665 inode->i_op = &jffs2_file_inode_operations;
666 init_special_inode(inode, inode->i_mode, rdev);
668 f = JFFS2_INODE_INFO(inode);
670 ri->dsize = ri->csize = cpu_to_je32(devlen);
671 ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
672 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
674 ri->compr = JFFS2_COMPR_NONE;
675 ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
676 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
678 fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, ALLOC_NORMAL);
680 jffs2_free_raw_inode(ri);
682 if (IS_ERR(fn)) {
683 /* Eeek. Wave bye bye */
684 up(&f->sem);
685 jffs2_complete_reservation(c);
686 jffs2_clear_inode(inode);
687 return PTR_ERR(fn);
689 /* No data here. Only a metadata node, which will be
690 obsoleted by the first data write
692 f->metadata = fn;
693 up(&f->sem);
695 jffs2_complete_reservation(c);
697 ret = jffs2_init_security(inode, dir_i);
698 if (ret) {
699 jffs2_clear_inode(inode);
700 return ret;
702 ret = jffs2_init_acl(inode, dir_i);
703 if (ret) {
704 jffs2_clear_inode(inode);
705 return ret;
708 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
709 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
710 if (ret) {
711 /* Eep. */
712 jffs2_clear_inode(inode);
713 return ret;
716 rd = jffs2_alloc_raw_dirent();
717 if (!rd) {
718 /* Argh. Now we treat it like a normal delete */
719 jffs2_complete_reservation(c);
720 jffs2_clear_inode(inode);
721 return -ENOMEM;
724 dir_f = JFFS2_INODE_INFO(dir_i);
725 down(&dir_f->sem);
727 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
728 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
729 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
730 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
732 rd->pino = cpu_to_je32(dir_i->i_ino);
733 rd->version = cpu_to_je32(++dir_f->highest_version);
734 rd->ino = cpu_to_je32(inode->i_ino);
735 rd->mctime = cpu_to_je32(get_seconds());
736 rd->nsize = namelen;
738 /* XXX: This is ugly. */
739 rd->type = (mode & S_IFMT) >> 12;
741 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
742 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
744 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
746 if (IS_ERR(fd)) {
747 /* dirent failed to write. Delete the inode normally
748 as if it were the final unlink() */
749 jffs2_complete_reservation(c);
750 jffs2_free_raw_dirent(rd);
751 up(&dir_f->sem);
752 jffs2_clear_inode(inode);
753 return PTR_ERR(fd);
756 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
758 jffs2_free_raw_dirent(rd);
760 /* Link the fd into the inode's list, obsoleting an old
761 one if necessary. */
762 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
764 up(&dir_f->sem);
765 jffs2_complete_reservation(c);
767 d_instantiate(dentry, inode);
769 return 0;
772 static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
773 struct inode *new_dir_i, struct dentry *new_dentry)
775 int ret;
776 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
777 struct jffs2_inode_info *victim_f = NULL;
778 uint8_t type;
779 uint32_t now;
781 /* The VFS will check for us and prevent trying to rename a
782 * file over a directory and vice versa, but if it's a directory,
783 * the VFS can't check whether the victim is empty. The filesystem
784 * needs to do that for itself.
786 if (new_dentry->d_inode) {
787 victim_f = JFFS2_INODE_INFO(new_dentry->d_inode);
788 if (S_ISDIR(new_dentry->d_inode->i_mode)) {
789 struct jffs2_full_dirent *fd;
791 down(&victim_f->sem);
792 for (fd = victim_f->dents; fd; fd = fd->next) {
793 if (fd->ino) {
794 up(&victim_f->sem);
795 return -ENOTEMPTY;
798 up(&victim_f->sem);
802 /* XXX: We probably ought to alloc enough space for
803 both nodes at the same time. Writing the new link,
804 then getting -ENOSPC, is quite bad :)
807 /* Make a hard link */
809 /* XXX: This is ugly */
810 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
811 if (!type) type = DT_REG;
813 now = get_seconds();
814 ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
815 old_dentry->d_inode->i_ino, type,
816 new_dentry->d_name.name, new_dentry->d_name.len, now);
818 if (ret)
819 return ret;
821 if (victim_f) {
822 /* There was a victim. Kill it off nicely */
823 drop_nlink(new_dentry->d_inode);
824 /* Don't oops if the victim was a dirent pointing to an
825 inode which didn't exist. */
826 if (victim_f->inocache) {
827 down(&victim_f->sem);
828 victim_f->inocache->nlink--;
829 up(&victim_f->sem);
833 /* If it was a directory we moved, and there was no victim,
834 increase i_nlink on its new parent */
835 if (S_ISDIR(old_dentry->d_inode->i_mode) && !victim_f)
836 inc_nlink(new_dir_i);
838 /* Unlink the original */
839 ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
840 old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
842 /* We don't touch inode->i_nlink */
844 if (ret) {
845 /* Oh shit. We really ought to make a single node which can do both atomically */
846 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
847 down(&f->sem);
848 inc_nlink(old_dentry->d_inode);
849 if (f->inocache)
850 f->inocache->nlink++;
851 up(&f->sem);
853 printk(KERN_NOTICE "jffs2_rename(): Link succeeded, unlink failed (err %d). You now have a hard link\n", ret);
854 /* Might as well let the VFS know */
855 d_instantiate(new_dentry, old_dentry->d_inode);
856 atomic_inc(&old_dentry->d_inode->i_count);
857 new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now);
858 return ret;
861 if (S_ISDIR(old_dentry->d_inode->i_mode))
862 drop_nlink(old_dir_i);
864 new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
866 return 0;