FRV: Use generic show_interrupts()
[cris-mirror.git] / fs / jffs2 / dir.c
blob82faddd1f321b74e8efd4f11fe07449e409d7bbc
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, &dentry->d_name);
219 if (ret)
220 goto fail;
222 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(ri->ctime));
224 jffs2_free_raw_inode(ri);
226 D1(printk(KERN_DEBUG "jffs2_create: Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n",
227 inode->i_ino, inode->i_mode, inode->i_nlink,
228 f->inocache->pino_nlink, inode->i_mapping->nrpages));
230 d_instantiate(dentry, inode);
231 unlock_new_inode(inode);
232 return 0;
234 fail:
235 iget_failed(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->pino_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 mutex_lock(&f->sem);
287 old_dentry->d_inode->i_nlink = ++f->inocache->pino_nlink;
288 mutex_unlock(&f->sem);
289 d_instantiate(dentry, old_dentry->d_inode);
290 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
291 ihold(old_dentry->d_inode);
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 -ENAMETOOLONG;
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 mutex_unlock(&f->sem);
363 jffs2_complete_reservation(c);
364 ret = PTR_ERR(fn);
365 goto fail;
368 /* We use f->target field to store the target path. */
369 f->target = kmemdup(target, targetlen + 1, GFP_KERNEL);
370 if (!f->target) {
371 printk(KERN_WARNING "Can't allocate %d bytes of memory\n", targetlen + 1);
372 mutex_unlock(&f->sem);
373 jffs2_complete_reservation(c);
374 ret = -ENOMEM;
375 goto fail;
378 D1(printk(KERN_DEBUG "jffs2_symlink: symlink's target '%s' cached\n", (char *)f->target));
380 /* No data here. Only a metadata node, which will be
381 obsoleted by the first data write
383 f->metadata = fn;
384 mutex_unlock(&f->sem);
386 jffs2_complete_reservation(c);
388 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
389 if (ret)
390 goto fail;
392 ret = jffs2_init_acl_post(inode);
393 if (ret)
394 goto fail;
396 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
397 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
398 if (ret)
399 goto fail;
401 rd = jffs2_alloc_raw_dirent();
402 if (!rd) {
403 /* Argh. Now we treat it like a normal delete */
404 jffs2_complete_reservation(c);
405 ret = -ENOMEM;
406 goto fail;
409 dir_f = JFFS2_INODE_INFO(dir_i);
410 mutex_lock(&dir_f->sem);
412 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
413 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
414 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
415 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
417 rd->pino = cpu_to_je32(dir_i->i_ino);
418 rd->version = cpu_to_je32(++dir_f->highest_version);
419 rd->ino = cpu_to_je32(inode->i_ino);
420 rd->mctime = cpu_to_je32(get_seconds());
421 rd->nsize = namelen;
422 rd->type = DT_LNK;
423 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
424 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
426 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
428 if (IS_ERR(fd)) {
429 /* dirent failed to write. Delete the inode normally
430 as if it were the final unlink() */
431 jffs2_complete_reservation(c);
432 jffs2_free_raw_dirent(rd);
433 mutex_unlock(&dir_f->sem);
434 ret = PTR_ERR(fd);
435 goto fail;
438 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
440 jffs2_free_raw_dirent(rd);
442 /* Link the fd into the inode's list, obsoleting an old
443 one if necessary. */
444 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
446 mutex_unlock(&dir_f->sem);
447 jffs2_complete_reservation(c);
449 d_instantiate(dentry, inode);
450 unlock_new_inode(inode);
451 return 0;
453 fail:
454 iget_failed(inode);
455 return ret;
459 static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode)
461 struct jffs2_inode_info *f, *dir_f;
462 struct jffs2_sb_info *c;
463 struct inode *inode;
464 struct jffs2_raw_inode *ri;
465 struct jffs2_raw_dirent *rd;
466 struct jffs2_full_dnode *fn;
467 struct jffs2_full_dirent *fd;
468 int namelen;
469 uint32_t alloclen;
470 int ret;
472 mode |= S_IFDIR;
474 ri = jffs2_alloc_raw_inode();
475 if (!ri)
476 return -ENOMEM;
478 c = JFFS2_SB_INFO(dir_i->i_sb);
480 /* Try to reserve enough space for both node and dirent.
481 * Just the node will do for now, though
483 namelen = dentry->d_name.len;
484 ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL,
485 JFFS2_SUMMARY_INODE_SIZE);
487 if (ret) {
488 jffs2_free_raw_inode(ri);
489 return ret;
492 inode = jffs2_new_inode(dir_i, mode, ri);
494 if (IS_ERR(inode)) {
495 jffs2_free_raw_inode(ri);
496 jffs2_complete_reservation(c);
497 return PTR_ERR(inode);
500 inode->i_op = &jffs2_dir_inode_operations;
501 inode->i_fop = &jffs2_dir_operations;
503 f = JFFS2_INODE_INFO(inode);
505 /* Directories get nlink 2 at start */
506 inode->i_nlink = 2;
507 /* but ic->pino_nlink is the parent ino# */
508 f->inocache->pino_nlink = dir_i->i_ino;
510 ri->data_crc = cpu_to_je32(0);
511 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
513 fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL);
515 jffs2_free_raw_inode(ri);
517 if (IS_ERR(fn)) {
518 /* Eeek. Wave bye bye */
519 mutex_unlock(&f->sem);
520 jffs2_complete_reservation(c);
521 ret = PTR_ERR(fn);
522 goto fail;
524 /* No data here. Only a metadata node, which will be
525 obsoleted by the first data write
527 f->metadata = fn;
528 mutex_unlock(&f->sem);
530 jffs2_complete_reservation(c);
532 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
533 if (ret)
534 goto fail;
536 ret = jffs2_init_acl_post(inode);
537 if (ret)
538 goto fail;
540 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
541 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
542 if (ret)
543 goto fail;
545 rd = jffs2_alloc_raw_dirent();
546 if (!rd) {
547 /* Argh. Now we treat it like a normal delete */
548 jffs2_complete_reservation(c);
549 ret = -ENOMEM;
550 goto fail;
553 dir_f = JFFS2_INODE_INFO(dir_i);
554 mutex_lock(&dir_f->sem);
556 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
557 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
558 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
559 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
561 rd->pino = cpu_to_je32(dir_i->i_ino);
562 rd->version = cpu_to_je32(++dir_f->highest_version);
563 rd->ino = cpu_to_je32(inode->i_ino);
564 rd->mctime = cpu_to_je32(get_seconds());
565 rd->nsize = namelen;
566 rd->type = DT_DIR;
567 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
568 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
570 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
572 if (IS_ERR(fd)) {
573 /* dirent failed to write. Delete the inode normally
574 as if it were the final unlink() */
575 jffs2_complete_reservation(c);
576 jffs2_free_raw_dirent(rd);
577 mutex_unlock(&dir_f->sem);
578 ret = PTR_ERR(fd);
579 goto fail;
582 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
583 inc_nlink(dir_i);
585 jffs2_free_raw_dirent(rd);
587 /* Link the fd into the inode's list, obsoleting an old
588 one if necessary. */
589 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
591 mutex_unlock(&dir_f->sem);
592 jffs2_complete_reservation(c);
594 d_instantiate(dentry, inode);
595 unlock_new_inode(inode);
596 return 0;
598 fail:
599 iget_failed(inode);
600 return ret;
603 static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
605 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
606 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
607 struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
608 struct jffs2_full_dirent *fd;
609 int ret;
610 uint32_t now = get_seconds();
612 for (fd = f->dents ; fd; fd = fd->next) {
613 if (fd->ino)
614 return -ENOTEMPTY;
617 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
618 dentry->d_name.len, f, now);
619 if (!ret) {
620 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
621 clear_nlink(dentry->d_inode);
622 drop_nlink(dir_i);
624 return ret;
627 static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, dev_t rdev)
629 struct jffs2_inode_info *f, *dir_f;
630 struct jffs2_sb_info *c;
631 struct inode *inode;
632 struct jffs2_raw_inode *ri;
633 struct jffs2_raw_dirent *rd;
634 struct jffs2_full_dnode *fn;
635 struct jffs2_full_dirent *fd;
636 int namelen;
637 union jffs2_device_node dev;
638 int devlen = 0;
639 uint32_t alloclen;
640 int ret;
642 if (!new_valid_dev(rdev))
643 return -EINVAL;
645 ri = jffs2_alloc_raw_inode();
646 if (!ri)
647 return -ENOMEM;
649 c = JFFS2_SB_INFO(dir_i->i_sb);
651 if (S_ISBLK(mode) || S_ISCHR(mode))
652 devlen = jffs2_encode_dev(&dev, rdev);
654 /* Try to reserve enough space for both node and dirent.
655 * Just the node will do for now, though
657 namelen = dentry->d_name.len;
658 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &alloclen,
659 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
661 if (ret) {
662 jffs2_free_raw_inode(ri);
663 return ret;
666 inode = jffs2_new_inode(dir_i, mode, ri);
668 if (IS_ERR(inode)) {
669 jffs2_free_raw_inode(ri);
670 jffs2_complete_reservation(c);
671 return PTR_ERR(inode);
673 inode->i_op = &jffs2_file_inode_operations;
674 init_special_inode(inode, inode->i_mode, rdev);
676 f = JFFS2_INODE_INFO(inode);
678 ri->dsize = ri->csize = cpu_to_je32(devlen);
679 ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
680 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
682 ri->compr = JFFS2_COMPR_NONE;
683 ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
684 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
686 fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, ALLOC_NORMAL);
688 jffs2_free_raw_inode(ri);
690 if (IS_ERR(fn)) {
691 /* Eeek. Wave bye bye */
692 mutex_unlock(&f->sem);
693 jffs2_complete_reservation(c);
694 ret = PTR_ERR(fn);
695 goto fail;
697 /* No data here. Only a metadata node, which will be
698 obsoleted by the first data write
700 f->metadata = fn;
701 mutex_unlock(&f->sem);
703 jffs2_complete_reservation(c);
705 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
706 if (ret)
707 goto fail;
709 ret = jffs2_init_acl_post(inode);
710 if (ret)
711 goto fail;
713 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
714 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
715 if (ret)
716 goto fail;
718 rd = jffs2_alloc_raw_dirent();
719 if (!rd) {
720 /* Argh. Now we treat it like a normal delete */
721 jffs2_complete_reservation(c);
722 ret = -ENOMEM;
723 goto fail;
726 dir_f = JFFS2_INODE_INFO(dir_i);
727 mutex_lock(&dir_f->sem);
729 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
730 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
731 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
732 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
734 rd->pino = cpu_to_je32(dir_i->i_ino);
735 rd->version = cpu_to_je32(++dir_f->highest_version);
736 rd->ino = cpu_to_je32(inode->i_ino);
737 rd->mctime = cpu_to_je32(get_seconds());
738 rd->nsize = namelen;
740 /* XXX: This is ugly. */
741 rd->type = (mode & S_IFMT) >> 12;
743 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
744 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
746 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
748 if (IS_ERR(fd)) {
749 /* dirent failed to write. Delete the inode normally
750 as if it were the final unlink() */
751 jffs2_complete_reservation(c);
752 jffs2_free_raw_dirent(rd);
753 mutex_unlock(&dir_f->sem);
754 ret = PTR_ERR(fd);
755 goto fail;
758 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
760 jffs2_free_raw_dirent(rd);
762 /* Link the fd into the inode's list, obsoleting an old
763 one if necessary. */
764 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
766 mutex_unlock(&dir_f->sem);
767 jffs2_complete_reservation(c);
769 d_instantiate(dentry, inode);
770 unlock_new_inode(inode);
771 return 0;
773 fail:
774 iget_failed(inode);
775 return ret;
778 static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
779 struct inode *new_dir_i, struct dentry *new_dentry)
781 int ret;
782 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
783 struct jffs2_inode_info *victim_f = NULL;
784 uint8_t type;
785 uint32_t now;
787 /* The VFS will check for us and prevent trying to rename a
788 * file over a directory and vice versa, but if it's a directory,
789 * the VFS can't check whether the victim is empty. The filesystem
790 * needs to do that for itself.
792 if (new_dentry->d_inode) {
793 victim_f = JFFS2_INODE_INFO(new_dentry->d_inode);
794 if (S_ISDIR(new_dentry->d_inode->i_mode)) {
795 struct jffs2_full_dirent *fd;
797 mutex_lock(&victim_f->sem);
798 for (fd = victim_f->dents; fd; fd = fd->next) {
799 if (fd->ino) {
800 mutex_unlock(&victim_f->sem);
801 return -ENOTEMPTY;
804 mutex_unlock(&victim_f->sem);
808 /* XXX: We probably ought to alloc enough space for
809 both nodes at the same time. Writing the new link,
810 then getting -ENOSPC, is quite bad :)
813 /* Make a hard link */
815 /* XXX: This is ugly */
816 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
817 if (!type) type = DT_REG;
819 now = get_seconds();
820 ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
821 old_dentry->d_inode->i_ino, type,
822 new_dentry->d_name.name, new_dentry->d_name.len, now);
824 if (ret)
825 return ret;
827 if (victim_f) {
828 /* There was a victim. Kill it off nicely */
829 drop_nlink(new_dentry->d_inode);
830 /* Don't oops if the victim was a dirent pointing to an
831 inode which didn't exist. */
832 if (victim_f->inocache) {
833 mutex_lock(&victim_f->sem);
834 if (S_ISDIR(new_dentry->d_inode->i_mode))
835 victim_f->inocache->pino_nlink = 0;
836 else
837 victim_f->inocache->pino_nlink--;
838 mutex_unlock(&victim_f->sem);
842 /* If it was a directory we moved, and there was no victim,
843 increase i_nlink on its new parent */
844 if (S_ISDIR(old_dentry->d_inode->i_mode) && !victim_f)
845 inc_nlink(new_dir_i);
847 /* Unlink the original */
848 ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
849 old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
851 /* We don't touch inode->i_nlink */
853 if (ret) {
854 /* Oh shit. We really ought to make a single node which can do both atomically */
855 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
856 mutex_lock(&f->sem);
857 inc_nlink(old_dentry->d_inode);
858 if (f->inocache && !S_ISDIR(old_dentry->d_inode->i_mode))
859 f->inocache->pino_nlink++;
860 mutex_unlock(&f->sem);
862 printk(KERN_NOTICE "jffs2_rename(): Link succeeded, unlink failed (err %d). You now have a hard link\n", ret);
863 /* Might as well let the VFS know */
864 d_instantiate(new_dentry, old_dentry->d_inode);
865 ihold(old_dentry->d_inode);
866 new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now);
867 return ret;
870 if (S_ISDIR(old_dentry->d_inode->i_mode))
871 drop_nlink(old_dir_i);
873 new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
875 return 0;