ptrace: cleanup arch_ptrace() on sh
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / fs / jffs2 / dir.c
blob79121aa5858b8a4aa02861ba57cf17d9a8dfe13b
1 /*
2 * JFFS2 -- Journalling Flash File System, Version 2.
4 * Copyright © 2001-2007 Red Hat, Inc.
5 * Copyright © 2004-2010 David Woodhouse <dwmw2@infradead.org>
7 * Created by David Woodhouse <dwmw2@infradead.org>
9 * For licensing information, see the file 'LICENCE' in this directory.
13 #include <linux/kernel.h>
14 #include <linux/slab.h>
15 #include <linux/fs.h>
16 #include <linux/crc32.h>
17 #include <linux/jffs2.h>
18 #include "jffs2_fs_i.h"
19 #include "jffs2_fs_sb.h"
20 #include <linux/time.h>
21 #include "nodelist.h"
23 static int jffs2_readdir (struct file *, void *, filldir_t);
25 static int jffs2_create (struct inode *,struct dentry *,int,
26 struct nameidata *);
27 static struct dentry *jffs2_lookup (struct inode *,struct dentry *,
28 struct nameidata *);
29 static int jffs2_link (struct dentry *,struct inode *,struct dentry *);
30 static int jffs2_unlink (struct inode *,struct dentry *);
31 static int jffs2_symlink (struct inode *,struct dentry *,const char *);
32 static int jffs2_mkdir (struct inode *,struct dentry *,int);
33 static int jffs2_rmdir (struct inode *,struct dentry *);
34 static int jffs2_mknod (struct inode *,struct dentry *,int,dev_t);
35 static int jffs2_rename (struct inode *, struct dentry *,
36 struct inode *, struct dentry *);
38 const struct file_operations jffs2_dir_operations =
40 .read = generic_read_dir,
41 .readdir = jffs2_readdir,
42 .unlocked_ioctl=jffs2_ioctl,
43 .fsync = jffs2_fsync,
44 .llseek = generic_file_llseek,
48 const struct inode_operations jffs2_dir_inode_operations =
50 .create = jffs2_create,
51 .lookup = jffs2_lookup,
52 .link = jffs2_link,
53 .unlink = jffs2_unlink,
54 .symlink = jffs2_symlink,
55 .mkdir = jffs2_mkdir,
56 .rmdir = jffs2_rmdir,
57 .mknod = jffs2_mknod,
58 .rename = jffs2_rename,
59 .check_acl = jffs2_check_acl,
60 .setattr = jffs2_setattr,
61 .setxattr = jffs2_setxattr,
62 .getxattr = jffs2_getxattr,
63 .listxattr = jffs2_listxattr,
64 .removexattr = jffs2_removexattr
67 /***********************************************************************/
70 /* We keep the dirent list sorted in increasing order of name hash,
71 and we use the same hash function as the dentries. Makes this
72 nice and simple
74 static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,
75 struct nameidata *nd)
77 struct jffs2_inode_info *dir_f;
78 struct jffs2_sb_info *c;
79 struct jffs2_full_dirent *fd = NULL, *fd_list;
80 uint32_t ino = 0;
81 struct inode *inode = NULL;
83 D1(printk(KERN_DEBUG "jffs2_lookup()\n"));
85 if (target->d_name.len > JFFS2_MAX_NAME_LEN)
86 return ERR_PTR(-ENAMETOOLONG);
88 dir_f = JFFS2_INODE_INFO(dir_i);
89 c = JFFS2_SB_INFO(dir_i->i_sb);
91 mutex_lock(&dir_f->sem);
93 /* NB: The 2.2 backport will need to explicitly check for '.' and '..' here */
94 for (fd_list = dir_f->dents; fd_list && fd_list->nhash <= target->d_name.hash; fd_list = fd_list->next) {
95 if (fd_list->nhash == target->d_name.hash &&
96 (!fd || fd_list->version > fd->version) &&
97 strlen(fd_list->name) == target->d_name.len &&
98 !strncmp(fd_list->name, target->d_name.name, target->d_name.len)) {
99 fd = fd_list;
102 if (fd)
103 ino = fd->ino;
104 mutex_unlock(&dir_f->sem);
105 if (ino) {
106 inode = jffs2_iget(dir_i->i_sb, ino);
107 if (IS_ERR(inode)) {
108 printk(KERN_WARNING "iget() failed for ino #%u\n", ino);
109 return ERR_CAST(inode);
113 return d_splice_alias(inode, target);
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 mutex_lock(&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 mutex_unlock(&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 /* jffs2_do_create() will want to lock it, _after_ reserving
212 space and taking c-alloc_sem. If we keep it locked here,
213 lockdep gets unhappy (although it's a false positive;
214 nothing else will be looking at this inode yet so there's
215 no chance of AB-BA deadlock involving its f->sem). */
216 mutex_unlock(&f->sem);
218 ret = jffs2_do_create(c, dir_f, f, ri,
219 dentry->d_name.name, dentry->d_name.len);
220 if (ret)
221 goto fail;
223 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(ri->ctime));
225 jffs2_free_raw_inode(ri);
227 D1(printk(KERN_DEBUG "jffs2_create: Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n",
228 inode->i_ino, inode->i_mode, inode->i_nlink,
229 f->inocache->pino_nlink, inode->i_mapping->nrpages));
231 d_instantiate(dentry, inode);
232 unlock_new_inode(inode);
233 return 0;
235 fail:
236 iget_failed(inode);
237 jffs2_free_raw_inode(ri);
238 return ret;
241 /***********************************************************************/
244 static int jffs2_unlink(struct inode *dir_i, struct dentry *dentry)
246 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
247 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
248 struct jffs2_inode_info *dead_f = JFFS2_INODE_INFO(dentry->d_inode);
249 int ret;
250 uint32_t now = get_seconds();
252 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
253 dentry->d_name.len, dead_f, now);
254 if (dead_f->inocache)
255 dentry->d_inode->i_nlink = dead_f->inocache->pino_nlink;
256 if (!ret)
257 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
258 return ret;
260 /***********************************************************************/
263 static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry)
265 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dentry->d_inode->i_sb);
266 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
267 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
268 int ret;
269 uint8_t type;
270 uint32_t now;
272 /* Don't let people make hard links to bad inodes. */
273 if (!f->inocache)
274 return -EIO;
276 if (S_ISDIR(old_dentry->d_inode->i_mode))
277 return -EPERM;
279 /* XXX: This is ugly */
280 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
281 if (!type) type = DT_REG;
283 now = get_seconds();
284 ret = jffs2_do_link(c, dir_f, f->inocache->ino, type, dentry->d_name.name, dentry->d_name.len, now);
286 if (!ret) {
287 mutex_lock(&f->sem);
288 old_dentry->d_inode->i_nlink = ++f->inocache->pino_nlink;
289 mutex_unlock(&f->sem);
290 d_instantiate(dentry, old_dentry->d_inode);
291 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
292 ihold(old_dentry->d_inode);
294 return ret;
297 /***********************************************************************/
299 static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char *target)
301 struct jffs2_inode_info *f, *dir_f;
302 struct jffs2_sb_info *c;
303 struct inode *inode;
304 struct jffs2_raw_inode *ri;
305 struct jffs2_raw_dirent *rd;
306 struct jffs2_full_dnode *fn;
307 struct jffs2_full_dirent *fd;
308 int namelen;
309 uint32_t alloclen;
310 int ret, targetlen = strlen(target);
312 /* FIXME: If you care. We'd need to use frags for the target
313 if it grows much more than this */
314 if (targetlen > 254)
315 return -ENAMETOOLONG;
317 ri = jffs2_alloc_raw_inode();
319 if (!ri)
320 return -ENOMEM;
322 c = JFFS2_SB_INFO(dir_i->i_sb);
324 /* Try to reserve enough space for both node and dirent.
325 * Just the node will do for now, though
327 namelen = dentry->d_name.len;
328 ret = jffs2_reserve_space(c, sizeof(*ri) + targetlen, &alloclen,
329 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
331 if (ret) {
332 jffs2_free_raw_inode(ri);
333 return ret;
336 inode = jffs2_new_inode(dir_i, S_IFLNK | S_IRWXUGO, ri);
338 if (IS_ERR(inode)) {
339 jffs2_free_raw_inode(ri);
340 jffs2_complete_reservation(c);
341 return PTR_ERR(inode);
344 inode->i_op = &jffs2_symlink_inode_operations;
346 f = JFFS2_INODE_INFO(inode);
348 inode->i_size = targetlen;
349 ri->isize = ri->dsize = ri->csize = cpu_to_je32(inode->i_size);
350 ri->totlen = cpu_to_je32(sizeof(*ri) + inode->i_size);
351 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
353 ri->compr = JFFS2_COMPR_NONE;
354 ri->data_crc = cpu_to_je32(crc32(0, target, targetlen));
355 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
357 fn = jffs2_write_dnode(c, f, ri, target, targetlen, ALLOC_NORMAL);
359 jffs2_free_raw_inode(ri);
361 if (IS_ERR(fn)) {
362 /* Eeek. Wave bye bye */
363 mutex_unlock(&f->sem);
364 jffs2_complete_reservation(c);
365 ret = PTR_ERR(fn);
366 goto fail;
369 /* We use f->target field to store the target path. */
370 f->target = kmalloc(targetlen + 1, GFP_KERNEL);
371 if (!f->target) {
372 printk(KERN_WARNING "Can't allocate %d bytes of memory\n", targetlen + 1);
373 mutex_unlock(&f->sem);
374 jffs2_complete_reservation(c);
375 ret = -ENOMEM;
376 goto fail;
379 memcpy(f->target, target, targetlen + 1);
380 D1(printk(KERN_DEBUG "jffs2_symlink: symlink's target '%s' cached\n", (char *)f->target));
382 /* No data here. Only a metadata node, which will be
383 obsoleted by the first data write
385 f->metadata = fn;
386 mutex_unlock(&f->sem);
388 jffs2_complete_reservation(c);
390 ret = jffs2_init_security(inode, dir_i);
391 if (ret)
392 goto fail;
394 ret = jffs2_init_acl_post(inode);
395 if (ret)
396 goto fail;
398 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
399 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
400 if (ret)
401 goto fail;
403 rd = jffs2_alloc_raw_dirent();
404 if (!rd) {
405 /* Argh. Now we treat it like a normal delete */
406 jffs2_complete_reservation(c);
407 ret = -ENOMEM;
408 goto fail;
411 dir_f = JFFS2_INODE_INFO(dir_i);
412 mutex_lock(&dir_f->sem);
414 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
415 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
416 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
417 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
419 rd->pino = cpu_to_je32(dir_i->i_ino);
420 rd->version = cpu_to_je32(++dir_f->highest_version);
421 rd->ino = cpu_to_je32(inode->i_ino);
422 rd->mctime = cpu_to_je32(get_seconds());
423 rd->nsize = namelen;
424 rd->type = DT_LNK;
425 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
426 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
428 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
430 if (IS_ERR(fd)) {
431 /* dirent failed to write. Delete the inode normally
432 as if it were the final unlink() */
433 jffs2_complete_reservation(c);
434 jffs2_free_raw_dirent(rd);
435 mutex_unlock(&dir_f->sem);
436 ret = PTR_ERR(fd);
437 goto fail;
440 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
442 jffs2_free_raw_dirent(rd);
444 /* Link the fd into the inode's list, obsoleting an old
445 one if necessary. */
446 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
448 mutex_unlock(&dir_f->sem);
449 jffs2_complete_reservation(c);
451 d_instantiate(dentry, inode);
452 unlock_new_inode(inode);
453 return 0;
455 fail:
456 iget_failed(inode);
457 return ret;
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;
505 f = JFFS2_INODE_INFO(inode);
507 /* Directories get nlink 2 at start */
508 inode->i_nlink = 2;
509 /* but ic->pino_nlink is the parent ino# */
510 f->inocache->pino_nlink = dir_i->i_ino;
512 ri->data_crc = cpu_to_je32(0);
513 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
515 fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL);
517 jffs2_free_raw_inode(ri);
519 if (IS_ERR(fn)) {
520 /* Eeek. Wave bye bye */
521 mutex_unlock(&f->sem);
522 jffs2_complete_reservation(c);
523 ret = PTR_ERR(fn);
524 goto fail;
526 /* No data here. Only a metadata node, which will be
527 obsoleted by the first data write
529 f->metadata = fn;
530 mutex_unlock(&f->sem);
532 jffs2_complete_reservation(c);
534 ret = jffs2_init_security(inode, dir_i);
535 if (ret)
536 goto fail;
538 ret = jffs2_init_acl_post(inode);
539 if (ret)
540 goto fail;
542 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
543 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
544 if (ret)
545 goto fail;
547 rd = jffs2_alloc_raw_dirent();
548 if (!rd) {
549 /* Argh. Now we treat it like a normal delete */
550 jffs2_complete_reservation(c);
551 ret = -ENOMEM;
552 goto fail;
555 dir_f = JFFS2_INODE_INFO(dir_i);
556 mutex_lock(&dir_f->sem);
558 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
559 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
560 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
561 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
563 rd->pino = cpu_to_je32(dir_i->i_ino);
564 rd->version = cpu_to_je32(++dir_f->highest_version);
565 rd->ino = cpu_to_je32(inode->i_ino);
566 rd->mctime = cpu_to_je32(get_seconds());
567 rd->nsize = namelen;
568 rd->type = DT_DIR;
569 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
570 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
572 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
574 if (IS_ERR(fd)) {
575 /* dirent failed to write. Delete the inode normally
576 as if it were the final unlink() */
577 jffs2_complete_reservation(c);
578 jffs2_free_raw_dirent(rd);
579 mutex_unlock(&dir_f->sem);
580 ret = PTR_ERR(fd);
581 goto fail;
584 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
585 inc_nlink(dir_i);
587 jffs2_free_raw_dirent(rd);
589 /* Link the fd into the inode's list, obsoleting an old
590 one if necessary. */
591 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
593 mutex_unlock(&dir_f->sem);
594 jffs2_complete_reservation(c);
596 d_instantiate(dentry, inode);
597 unlock_new_inode(inode);
598 return 0;
600 fail:
601 iget_failed(inode);
602 return ret;
605 static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
607 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
608 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
609 struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
610 struct jffs2_full_dirent *fd;
611 int ret;
612 uint32_t now = get_seconds();
614 for (fd = f->dents ; fd; fd = fd->next) {
615 if (fd->ino)
616 return -ENOTEMPTY;
619 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
620 dentry->d_name.len, f, now);
621 if (!ret) {
622 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
623 clear_nlink(dentry->d_inode);
624 drop_nlink(dir_i);
626 return ret;
629 static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, dev_t rdev)
631 struct jffs2_inode_info *f, *dir_f;
632 struct jffs2_sb_info *c;
633 struct inode *inode;
634 struct jffs2_raw_inode *ri;
635 struct jffs2_raw_dirent *rd;
636 struct jffs2_full_dnode *fn;
637 struct jffs2_full_dirent *fd;
638 int namelen;
639 union jffs2_device_node dev;
640 int devlen = 0;
641 uint32_t alloclen;
642 int ret;
644 if (!new_valid_dev(rdev))
645 return -EINVAL;
647 ri = jffs2_alloc_raw_inode();
648 if (!ri)
649 return -ENOMEM;
651 c = JFFS2_SB_INFO(dir_i->i_sb);
653 if (S_ISBLK(mode) || S_ISCHR(mode))
654 devlen = jffs2_encode_dev(&dev, rdev);
656 /* Try to reserve enough space for both node and dirent.
657 * Just the node will do for now, though
659 namelen = dentry->d_name.len;
660 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &alloclen,
661 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
663 if (ret) {
664 jffs2_free_raw_inode(ri);
665 return ret;
668 inode = jffs2_new_inode(dir_i, mode, ri);
670 if (IS_ERR(inode)) {
671 jffs2_free_raw_inode(ri);
672 jffs2_complete_reservation(c);
673 return PTR_ERR(inode);
675 inode->i_op = &jffs2_file_inode_operations;
676 init_special_inode(inode, inode->i_mode, rdev);
678 f = JFFS2_INODE_INFO(inode);
680 ri->dsize = ri->csize = cpu_to_je32(devlen);
681 ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
682 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
684 ri->compr = JFFS2_COMPR_NONE;
685 ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
686 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
688 fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, ALLOC_NORMAL);
690 jffs2_free_raw_inode(ri);
692 if (IS_ERR(fn)) {
693 /* Eeek. Wave bye bye */
694 mutex_unlock(&f->sem);
695 jffs2_complete_reservation(c);
696 ret = PTR_ERR(fn);
697 goto fail;
699 /* No data here. Only a metadata node, which will be
700 obsoleted by the first data write
702 f->metadata = fn;
703 mutex_unlock(&f->sem);
705 jffs2_complete_reservation(c);
707 ret = jffs2_init_security(inode, dir_i);
708 if (ret)
709 goto fail;
711 ret = jffs2_init_acl_post(inode);
712 if (ret)
713 goto fail;
715 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
716 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
717 if (ret)
718 goto fail;
720 rd = jffs2_alloc_raw_dirent();
721 if (!rd) {
722 /* Argh. Now we treat it like a normal delete */
723 jffs2_complete_reservation(c);
724 ret = -ENOMEM;
725 goto fail;
728 dir_f = JFFS2_INODE_INFO(dir_i);
729 mutex_lock(&dir_f->sem);
731 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
732 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
733 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
734 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
736 rd->pino = cpu_to_je32(dir_i->i_ino);
737 rd->version = cpu_to_je32(++dir_f->highest_version);
738 rd->ino = cpu_to_je32(inode->i_ino);
739 rd->mctime = cpu_to_je32(get_seconds());
740 rd->nsize = namelen;
742 /* XXX: This is ugly. */
743 rd->type = (mode & S_IFMT) >> 12;
745 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
746 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
748 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
750 if (IS_ERR(fd)) {
751 /* dirent failed to write. Delete the inode normally
752 as if it were the final unlink() */
753 jffs2_complete_reservation(c);
754 jffs2_free_raw_dirent(rd);
755 mutex_unlock(&dir_f->sem);
756 ret = PTR_ERR(fd);
757 goto fail;
760 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
762 jffs2_free_raw_dirent(rd);
764 /* Link the fd into the inode's list, obsoleting an old
765 one if necessary. */
766 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
768 mutex_unlock(&dir_f->sem);
769 jffs2_complete_reservation(c);
771 d_instantiate(dentry, inode);
772 unlock_new_inode(inode);
773 return 0;
775 fail:
776 iget_failed(inode);
777 return ret;
780 static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
781 struct inode *new_dir_i, struct dentry *new_dentry)
783 int ret;
784 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
785 struct jffs2_inode_info *victim_f = NULL;
786 uint8_t type;
787 uint32_t now;
789 /* The VFS will check for us and prevent trying to rename a
790 * file over a directory and vice versa, but if it's a directory,
791 * the VFS can't check whether the victim is empty. The filesystem
792 * needs to do that for itself.
794 if (new_dentry->d_inode) {
795 victim_f = JFFS2_INODE_INFO(new_dentry->d_inode);
796 if (S_ISDIR(new_dentry->d_inode->i_mode)) {
797 struct jffs2_full_dirent *fd;
799 mutex_lock(&victim_f->sem);
800 for (fd = victim_f->dents; fd; fd = fd->next) {
801 if (fd->ino) {
802 mutex_unlock(&victim_f->sem);
803 return -ENOTEMPTY;
806 mutex_unlock(&victim_f->sem);
810 /* XXX: We probably ought to alloc enough space for
811 both nodes at the same time. Writing the new link,
812 then getting -ENOSPC, is quite bad :)
815 /* Make a hard link */
817 /* XXX: This is ugly */
818 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
819 if (!type) type = DT_REG;
821 now = get_seconds();
822 ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
823 old_dentry->d_inode->i_ino, type,
824 new_dentry->d_name.name, new_dentry->d_name.len, now);
826 if (ret)
827 return ret;
829 if (victim_f) {
830 /* There was a victim. Kill it off nicely */
831 drop_nlink(new_dentry->d_inode);
832 /* Don't oops if the victim was a dirent pointing to an
833 inode which didn't exist. */
834 if (victim_f->inocache) {
835 mutex_lock(&victim_f->sem);
836 if (S_ISDIR(new_dentry->d_inode->i_mode))
837 victim_f->inocache->pino_nlink = 0;
838 else
839 victim_f->inocache->pino_nlink--;
840 mutex_unlock(&victim_f->sem);
844 /* If it was a directory we moved, and there was no victim,
845 increase i_nlink on its new parent */
846 if (S_ISDIR(old_dentry->d_inode->i_mode) && !victim_f)
847 inc_nlink(new_dir_i);
849 /* Unlink the original */
850 ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
851 old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
853 /* We don't touch inode->i_nlink */
855 if (ret) {
856 /* Oh shit. We really ought to make a single node which can do both atomically */
857 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
858 mutex_lock(&f->sem);
859 inc_nlink(old_dentry->d_inode);
860 if (f->inocache && !S_ISDIR(old_dentry->d_inode->i_mode))
861 f->inocache->pino_nlink++;
862 mutex_unlock(&f->sem);
864 printk(KERN_NOTICE "jffs2_rename(): Link succeeded, unlink failed (err %d). You now have a hard link\n", ret);
865 /* Might as well let the VFS know */
866 d_instantiate(new_dentry, old_dentry->d_inode);
867 ihold(old_dentry->d_inode);
868 new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now);
869 return ret;
872 if (S_ISDIR(old_dentry->d_inode->i_mode))
873 drop_nlink(old_dir_i);
875 new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
877 return 0;