Merge branch 'v6v7' into devel
[linux/fpc-iii.git] / fs / jffs2 / dir.c
blob92978658ed1803bc289840500e8a220cbf032ffa
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 = kmemdup(target, 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 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 mutex_unlock(&f->sem);
387 jffs2_complete_reservation(c);
389 ret = jffs2_init_security(inode, dir_i);
390 if (ret)
391 goto fail;
393 ret = jffs2_init_acl_post(inode);
394 if (ret)
395 goto fail;
397 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
398 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
399 if (ret)
400 goto fail;
402 rd = jffs2_alloc_raw_dirent();
403 if (!rd) {
404 /* Argh. Now we treat it like a normal delete */
405 jffs2_complete_reservation(c);
406 ret = -ENOMEM;
407 goto fail;
410 dir_f = JFFS2_INODE_INFO(dir_i);
411 mutex_lock(&dir_f->sem);
413 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
414 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
415 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
416 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
418 rd->pino = cpu_to_je32(dir_i->i_ino);
419 rd->version = cpu_to_je32(++dir_f->highest_version);
420 rd->ino = cpu_to_je32(inode->i_ino);
421 rd->mctime = cpu_to_je32(get_seconds());
422 rd->nsize = namelen;
423 rd->type = DT_LNK;
424 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
425 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
427 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
429 if (IS_ERR(fd)) {
430 /* dirent failed to write. Delete the inode normally
431 as if it were the final unlink() */
432 jffs2_complete_reservation(c);
433 jffs2_free_raw_dirent(rd);
434 mutex_unlock(&dir_f->sem);
435 ret = PTR_ERR(fd);
436 goto fail;
439 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
441 jffs2_free_raw_dirent(rd);
443 /* Link the fd into the inode's list, obsoleting an old
444 one if necessary. */
445 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
447 mutex_unlock(&dir_f->sem);
448 jffs2_complete_reservation(c);
450 d_instantiate(dentry, inode);
451 unlock_new_inode(inode);
452 return 0;
454 fail:
455 iget_failed(inode);
456 return ret;
460 static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode)
462 struct jffs2_inode_info *f, *dir_f;
463 struct jffs2_sb_info *c;
464 struct inode *inode;
465 struct jffs2_raw_inode *ri;
466 struct jffs2_raw_dirent *rd;
467 struct jffs2_full_dnode *fn;
468 struct jffs2_full_dirent *fd;
469 int namelen;
470 uint32_t alloclen;
471 int ret;
473 mode |= S_IFDIR;
475 ri = jffs2_alloc_raw_inode();
476 if (!ri)
477 return -ENOMEM;
479 c = JFFS2_SB_INFO(dir_i->i_sb);
481 /* Try to reserve enough space for both node and dirent.
482 * Just the node will do for now, though
484 namelen = dentry->d_name.len;
485 ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL,
486 JFFS2_SUMMARY_INODE_SIZE);
488 if (ret) {
489 jffs2_free_raw_inode(ri);
490 return ret;
493 inode = jffs2_new_inode(dir_i, mode, ri);
495 if (IS_ERR(inode)) {
496 jffs2_free_raw_inode(ri);
497 jffs2_complete_reservation(c);
498 return PTR_ERR(inode);
501 inode->i_op = &jffs2_dir_inode_operations;
502 inode->i_fop = &jffs2_dir_operations;
504 f = JFFS2_INODE_INFO(inode);
506 /* Directories get nlink 2 at start */
507 inode->i_nlink = 2;
508 /* but ic->pino_nlink is the parent ino# */
509 f->inocache->pino_nlink = dir_i->i_ino;
511 ri->data_crc = cpu_to_je32(0);
512 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
514 fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL);
516 jffs2_free_raw_inode(ri);
518 if (IS_ERR(fn)) {
519 /* Eeek. Wave bye bye */
520 mutex_unlock(&f->sem);
521 jffs2_complete_reservation(c);
522 ret = PTR_ERR(fn);
523 goto fail;
525 /* No data here. Only a metadata node, which will be
526 obsoleted by the first data write
528 f->metadata = fn;
529 mutex_unlock(&f->sem);
531 jffs2_complete_reservation(c);
533 ret = jffs2_init_security(inode, dir_i);
534 if (ret)
535 goto fail;
537 ret = jffs2_init_acl_post(inode);
538 if (ret)
539 goto fail;
541 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
542 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
543 if (ret)
544 goto fail;
546 rd = jffs2_alloc_raw_dirent();
547 if (!rd) {
548 /* Argh. Now we treat it like a normal delete */
549 jffs2_complete_reservation(c);
550 ret = -ENOMEM;
551 goto fail;
554 dir_f = JFFS2_INODE_INFO(dir_i);
555 mutex_lock(&dir_f->sem);
557 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
558 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
559 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
560 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
562 rd->pino = cpu_to_je32(dir_i->i_ino);
563 rd->version = cpu_to_je32(++dir_f->highest_version);
564 rd->ino = cpu_to_je32(inode->i_ino);
565 rd->mctime = cpu_to_je32(get_seconds());
566 rd->nsize = namelen;
567 rd->type = DT_DIR;
568 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
569 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
571 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
573 if (IS_ERR(fd)) {
574 /* dirent failed to write. Delete the inode normally
575 as if it were the final unlink() */
576 jffs2_complete_reservation(c);
577 jffs2_free_raw_dirent(rd);
578 mutex_unlock(&dir_f->sem);
579 ret = PTR_ERR(fd);
580 goto fail;
583 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
584 inc_nlink(dir_i);
586 jffs2_free_raw_dirent(rd);
588 /* Link the fd into the inode's list, obsoleting an old
589 one if necessary. */
590 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
592 mutex_unlock(&dir_f->sem);
593 jffs2_complete_reservation(c);
595 d_instantiate(dentry, inode);
596 unlock_new_inode(inode);
597 return 0;
599 fail:
600 iget_failed(inode);
601 return ret;
604 static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
606 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
607 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
608 struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
609 struct jffs2_full_dirent *fd;
610 int ret;
611 uint32_t now = get_seconds();
613 for (fd = f->dents ; fd; fd = fd->next) {
614 if (fd->ino)
615 return -ENOTEMPTY;
618 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
619 dentry->d_name.len, f, now);
620 if (!ret) {
621 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
622 clear_nlink(dentry->d_inode);
623 drop_nlink(dir_i);
625 return ret;
628 static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, dev_t rdev)
630 struct jffs2_inode_info *f, *dir_f;
631 struct jffs2_sb_info *c;
632 struct inode *inode;
633 struct jffs2_raw_inode *ri;
634 struct jffs2_raw_dirent *rd;
635 struct jffs2_full_dnode *fn;
636 struct jffs2_full_dirent *fd;
637 int namelen;
638 union jffs2_device_node dev;
639 int devlen = 0;
640 uint32_t alloclen;
641 int ret;
643 if (!new_valid_dev(rdev))
644 return -EINVAL;
646 ri = jffs2_alloc_raw_inode();
647 if (!ri)
648 return -ENOMEM;
650 c = JFFS2_SB_INFO(dir_i->i_sb);
652 if (S_ISBLK(mode) || S_ISCHR(mode))
653 devlen = jffs2_encode_dev(&dev, rdev);
655 /* Try to reserve enough space for both node and dirent.
656 * Just the node will do for now, though
658 namelen = dentry->d_name.len;
659 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &alloclen,
660 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
662 if (ret) {
663 jffs2_free_raw_inode(ri);
664 return ret;
667 inode = jffs2_new_inode(dir_i, mode, ri);
669 if (IS_ERR(inode)) {
670 jffs2_free_raw_inode(ri);
671 jffs2_complete_reservation(c);
672 return PTR_ERR(inode);
674 inode->i_op = &jffs2_file_inode_operations;
675 init_special_inode(inode, inode->i_mode, rdev);
677 f = JFFS2_INODE_INFO(inode);
679 ri->dsize = ri->csize = cpu_to_je32(devlen);
680 ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
681 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
683 ri->compr = JFFS2_COMPR_NONE;
684 ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
685 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
687 fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, ALLOC_NORMAL);
689 jffs2_free_raw_inode(ri);
691 if (IS_ERR(fn)) {
692 /* Eeek. Wave bye bye */
693 mutex_unlock(&f->sem);
694 jffs2_complete_reservation(c);
695 ret = PTR_ERR(fn);
696 goto fail;
698 /* No data here. Only a metadata node, which will be
699 obsoleted by the first data write
701 f->metadata = fn;
702 mutex_unlock(&f->sem);
704 jffs2_complete_reservation(c);
706 ret = jffs2_init_security(inode, dir_i);
707 if (ret)
708 goto fail;
710 ret = jffs2_init_acl_post(inode);
711 if (ret)
712 goto fail;
714 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
715 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
716 if (ret)
717 goto fail;
719 rd = jffs2_alloc_raw_dirent();
720 if (!rd) {
721 /* Argh. Now we treat it like a normal delete */
722 jffs2_complete_reservation(c);
723 ret = -ENOMEM;
724 goto fail;
727 dir_f = JFFS2_INODE_INFO(dir_i);
728 mutex_lock(&dir_f->sem);
730 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
731 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
732 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
733 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
735 rd->pino = cpu_to_je32(dir_i->i_ino);
736 rd->version = cpu_to_je32(++dir_f->highest_version);
737 rd->ino = cpu_to_je32(inode->i_ino);
738 rd->mctime = cpu_to_je32(get_seconds());
739 rd->nsize = namelen;
741 /* XXX: This is ugly. */
742 rd->type = (mode & S_IFMT) >> 12;
744 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
745 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
747 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
749 if (IS_ERR(fd)) {
750 /* dirent failed to write. Delete the inode normally
751 as if it were the final unlink() */
752 jffs2_complete_reservation(c);
753 jffs2_free_raw_dirent(rd);
754 mutex_unlock(&dir_f->sem);
755 ret = PTR_ERR(fd);
756 goto fail;
759 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
761 jffs2_free_raw_dirent(rd);
763 /* Link the fd into the inode's list, obsoleting an old
764 one if necessary. */
765 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
767 mutex_unlock(&dir_f->sem);
768 jffs2_complete_reservation(c);
770 d_instantiate(dentry, inode);
771 unlock_new_inode(inode);
772 return 0;
774 fail:
775 iget_failed(inode);
776 return ret;
779 static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
780 struct inode *new_dir_i, struct dentry *new_dentry)
782 int ret;
783 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
784 struct jffs2_inode_info *victim_f = NULL;
785 uint8_t type;
786 uint32_t now;
788 /* The VFS will check for us and prevent trying to rename a
789 * file over a directory and vice versa, but if it's a directory,
790 * the VFS can't check whether the victim is empty. The filesystem
791 * needs to do that for itself.
793 if (new_dentry->d_inode) {
794 victim_f = JFFS2_INODE_INFO(new_dentry->d_inode);
795 if (S_ISDIR(new_dentry->d_inode->i_mode)) {
796 struct jffs2_full_dirent *fd;
798 mutex_lock(&victim_f->sem);
799 for (fd = victim_f->dents; fd; fd = fd->next) {
800 if (fd->ino) {
801 mutex_unlock(&victim_f->sem);
802 return -ENOTEMPTY;
805 mutex_unlock(&victim_f->sem);
809 /* XXX: We probably ought to alloc enough space for
810 both nodes at the same time. Writing the new link,
811 then getting -ENOSPC, is quite bad :)
814 /* Make a hard link */
816 /* XXX: This is ugly */
817 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
818 if (!type) type = DT_REG;
820 now = get_seconds();
821 ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
822 old_dentry->d_inode->i_ino, type,
823 new_dentry->d_name.name, new_dentry->d_name.len, now);
825 if (ret)
826 return ret;
828 if (victim_f) {
829 /* There was a victim. Kill it off nicely */
830 drop_nlink(new_dentry->d_inode);
831 /* Don't oops if the victim was a dirent pointing to an
832 inode which didn't exist. */
833 if (victim_f->inocache) {
834 mutex_lock(&victim_f->sem);
835 if (S_ISDIR(new_dentry->d_inode->i_mode))
836 victim_f->inocache->pino_nlink = 0;
837 else
838 victim_f->inocache->pino_nlink--;
839 mutex_unlock(&victim_f->sem);
843 /* If it was a directory we moved, and there was no victim,
844 increase i_nlink on its new parent */
845 if (S_ISDIR(old_dentry->d_inode->i_mode) && !victim_f)
846 inc_nlink(new_dir_i);
848 /* Unlink the original */
849 ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
850 old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
852 /* We don't touch inode->i_nlink */
854 if (ret) {
855 /* Oh shit. We really ought to make a single node which can do both atomically */
856 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
857 mutex_lock(&f->sem);
858 inc_nlink(old_dentry->d_inode);
859 if (f->inocache && !S_ISDIR(old_dentry->d_inode->i_mode))
860 f->inocache->pino_nlink++;
861 mutex_unlock(&f->sem);
863 printk(KERN_NOTICE "jffs2_rename(): Link succeeded, unlink failed (err %d). You now have a hard link\n", ret);
864 /* Might as well let the VFS know */
865 d_instantiate(new_dentry, old_dentry->d_inode);
866 ihold(old_dentry->d_inode);
867 new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now);
868 return ret;
871 if (S_ISDIR(old_dentry->d_inode->i_mode))
872 drop_nlink(old_dir_i);
874 new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
876 return 0;