Merge tag 'sound-4.5-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai...
[linux/fpc-iii.git] / fs / jffs2 / dir.c
blobd211b8e18566719c873838268217b143966e5965
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 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
15 #include <linux/kernel.h>
16 #include <linux/slab.h>
17 #include <linux/fs.h>
18 #include <linux/crc32.h>
19 #include <linux/jffs2.h>
20 #include "jffs2_fs_i.h"
21 #include "jffs2_fs_sb.h"
22 #include <linux/time.h>
23 #include "nodelist.h"
25 static int jffs2_readdir (struct file *, struct dir_context *);
27 static int jffs2_create (struct inode *,struct dentry *,umode_t,
28 bool);
29 static struct dentry *jffs2_lookup (struct inode *,struct dentry *,
30 unsigned int);
31 static int jffs2_link (struct dentry *,struct inode *,struct dentry *);
32 static int jffs2_unlink (struct inode *,struct dentry *);
33 static int jffs2_symlink (struct inode *,struct dentry *,const char *);
34 static int jffs2_mkdir (struct inode *,struct dentry *,umode_t);
35 static int jffs2_rmdir (struct inode *,struct dentry *);
36 static int jffs2_mknod (struct inode *,struct dentry *,umode_t,dev_t);
37 static int jffs2_rename (struct inode *, struct dentry *,
38 struct inode *, struct dentry *);
40 const struct file_operations jffs2_dir_operations =
42 .read = generic_read_dir,
43 .iterate = jffs2_readdir,
44 .unlocked_ioctl=jffs2_ioctl,
45 .fsync = jffs2_fsync,
46 .llseek = generic_file_llseek,
50 const struct inode_operations jffs2_dir_inode_operations =
52 .create = jffs2_create,
53 .lookup = jffs2_lookup,
54 .link = jffs2_link,
55 .unlink = jffs2_unlink,
56 .symlink = jffs2_symlink,
57 .mkdir = jffs2_mkdir,
58 .rmdir = jffs2_rmdir,
59 .mknod = jffs2_mknod,
60 .rename = jffs2_rename,
61 .get_acl = jffs2_get_acl,
62 .set_acl = jffs2_set_acl,
63 .setattr = jffs2_setattr,
64 .setxattr = jffs2_setxattr,
65 .getxattr = jffs2_getxattr,
66 .listxattr = jffs2_listxattr,
67 .removexattr = jffs2_removexattr
70 /***********************************************************************/
73 /* We keep the dirent list sorted in increasing order of name hash,
74 and we use the same hash function as the dentries. Makes this
75 nice and simple
77 static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,
78 unsigned int flags)
80 struct jffs2_inode_info *dir_f;
81 struct jffs2_full_dirent *fd = NULL, *fd_list;
82 uint32_t ino = 0;
83 struct inode *inode = NULL;
85 jffs2_dbg(1, "jffs2_lookup()\n");
87 if (target->d_name.len > JFFS2_MAX_NAME_LEN)
88 return ERR_PTR(-ENAMETOOLONG);
90 dir_f = JFFS2_INODE_INFO(dir_i);
92 mutex_lock(&dir_f->sem);
94 /* NB: The 2.2 backport will need to explicitly check for '.' and '..' here */
95 for (fd_list = dir_f->dents; fd_list && fd_list->nhash <= target->d_name.hash; fd_list = fd_list->next) {
96 if (fd_list->nhash == target->d_name.hash &&
97 (!fd || fd_list->version > fd->version) &&
98 strlen(fd_list->name) == target->d_name.len &&
99 !strncmp(fd_list->name, target->d_name.name, target->d_name.len)) {
100 fd = fd_list;
103 if (fd)
104 ino = fd->ino;
105 mutex_unlock(&dir_f->sem);
106 if (ino) {
107 inode = jffs2_iget(dir_i->i_sb, ino);
108 if (IS_ERR(inode))
109 pr_warn("iget() failed for ino #%u\n", ino);
112 return d_splice_alias(inode, target);
115 /***********************************************************************/
118 static int jffs2_readdir(struct file *file, struct dir_context *ctx)
120 struct inode *inode = file_inode(file);
121 struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
122 struct jffs2_full_dirent *fd;
123 unsigned long curofs = 1;
125 jffs2_dbg(1, "jffs2_readdir() for dir_i #%lu\n", inode->i_ino);
127 if (!dir_emit_dots(file, ctx))
128 return 0;
130 mutex_lock(&f->sem);
131 for (fd = f->dents; fd; fd = fd->next) {
132 curofs++;
133 /* First loop: curofs = 2; pos = 2 */
134 if (curofs < ctx->pos) {
135 jffs2_dbg(2, "Skipping dirent: \"%s\", ino #%u, type %d, because curofs %ld < offset %ld\n",
136 fd->name, fd->ino, fd->type, curofs, (unsigned long)ctx->pos);
137 continue;
139 if (!fd->ino) {
140 jffs2_dbg(2, "Skipping deletion dirent \"%s\"\n",
141 fd->name);
142 ctx->pos++;
143 continue;
145 jffs2_dbg(2, "Dirent %ld: \"%s\", ino #%u, type %d\n",
146 (unsigned long)ctx->pos, fd->name, fd->ino, fd->type);
147 if (!dir_emit(ctx, fd->name, strlen(fd->name), fd->ino, fd->type))
148 break;
149 ctx->pos++;
151 mutex_unlock(&f->sem);
152 return 0;
155 /***********************************************************************/
158 static int jffs2_create(struct inode *dir_i, struct dentry *dentry,
159 umode_t mode, bool excl)
161 struct jffs2_raw_inode *ri;
162 struct jffs2_inode_info *f, *dir_f;
163 struct jffs2_sb_info *c;
164 struct inode *inode;
165 int ret;
167 ri = jffs2_alloc_raw_inode();
168 if (!ri)
169 return -ENOMEM;
171 c = JFFS2_SB_INFO(dir_i->i_sb);
173 jffs2_dbg(1, "%s()\n", __func__);
175 inode = jffs2_new_inode(dir_i, mode, ri);
177 if (IS_ERR(inode)) {
178 jffs2_dbg(1, "jffs2_new_inode() failed\n");
179 jffs2_free_raw_inode(ri);
180 return PTR_ERR(inode);
183 inode->i_op = &jffs2_file_inode_operations;
184 inode->i_fop = &jffs2_file_operations;
185 inode->i_mapping->a_ops = &jffs2_file_address_operations;
186 inode->i_mapping->nrpages = 0;
188 f = JFFS2_INODE_INFO(inode);
189 dir_f = JFFS2_INODE_INFO(dir_i);
191 /* jffs2_do_create() will want to lock it, _after_ reserving
192 space and taking c-alloc_sem. If we keep it locked here,
193 lockdep gets unhappy (although it's a false positive;
194 nothing else will be looking at this inode yet so there's
195 no chance of AB-BA deadlock involving its f->sem). */
196 mutex_unlock(&f->sem);
198 ret = jffs2_do_create(c, dir_f, f, ri, &dentry->d_name);
199 if (ret)
200 goto fail;
202 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(ri->ctime));
204 jffs2_free_raw_inode(ri);
206 jffs2_dbg(1, "%s(): Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n",
207 __func__, inode->i_ino, inode->i_mode, inode->i_nlink,
208 f->inocache->pino_nlink, inode->i_mapping->nrpages);
210 unlock_new_inode(inode);
211 d_instantiate(dentry, inode);
212 return 0;
214 fail:
215 iget_failed(inode);
216 jffs2_free_raw_inode(ri);
217 return ret;
220 /***********************************************************************/
223 static int jffs2_unlink(struct inode *dir_i, struct dentry *dentry)
225 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
226 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
227 struct jffs2_inode_info *dead_f = JFFS2_INODE_INFO(d_inode(dentry));
228 int ret;
229 uint32_t now = get_seconds();
231 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
232 dentry->d_name.len, dead_f, now);
233 if (dead_f->inocache)
234 set_nlink(d_inode(dentry), dead_f->inocache->pino_nlink);
235 if (!ret)
236 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
237 return ret;
239 /***********************************************************************/
242 static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry)
244 struct jffs2_sb_info *c = JFFS2_SB_INFO(d_inode(old_dentry)->i_sb);
245 struct jffs2_inode_info *f = JFFS2_INODE_INFO(d_inode(old_dentry));
246 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
247 int ret;
248 uint8_t type;
249 uint32_t now;
251 /* Don't let people make hard links to bad inodes. */
252 if (!f->inocache)
253 return -EIO;
255 if (d_is_dir(old_dentry))
256 return -EPERM;
258 /* XXX: This is ugly */
259 type = (d_inode(old_dentry)->i_mode & S_IFMT) >> 12;
260 if (!type) type = DT_REG;
262 now = get_seconds();
263 ret = jffs2_do_link(c, dir_f, f->inocache->ino, type, dentry->d_name.name, dentry->d_name.len, now);
265 if (!ret) {
266 mutex_lock(&f->sem);
267 set_nlink(d_inode(old_dentry), ++f->inocache->pino_nlink);
268 mutex_unlock(&f->sem);
269 d_instantiate(dentry, d_inode(old_dentry));
270 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
271 ihold(d_inode(old_dentry));
273 return ret;
276 /***********************************************************************/
278 static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char *target)
280 struct jffs2_inode_info *f, *dir_f;
281 struct jffs2_sb_info *c;
282 struct inode *inode;
283 struct jffs2_raw_inode *ri;
284 struct jffs2_raw_dirent *rd;
285 struct jffs2_full_dnode *fn;
286 struct jffs2_full_dirent *fd;
287 int namelen;
288 uint32_t alloclen;
289 int ret, targetlen = strlen(target);
291 /* FIXME: If you care. We'd need to use frags for the target
292 if it grows much more than this */
293 if (targetlen > 254)
294 return -ENAMETOOLONG;
296 ri = jffs2_alloc_raw_inode();
298 if (!ri)
299 return -ENOMEM;
301 c = JFFS2_SB_INFO(dir_i->i_sb);
303 /* Try to reserve enough space for both node and dirent.
304 * Just the node will do for now, though
306 namelen = dentry->d_name.len;
307 ret = jffs2_reserve_space(c, sizeof(*ri) + targetlen, &alloclen,
308 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
310 if (ret) {
311 jffs2_free_raw_inode(ri);
312 return ret;
315 inode = jffs2_new_inode(dir_i, S_IFLNK | S_IRWXUGO, ri);
317 if (IS_ERR(inode)) {
318 jffs2_free_raw_inode(ri);
319 jffs2_complete_reservation(c);
320 return PTR_ERR(inode);
323 inode->i_op = &jffs2_symlink_inode_operations;
325 f = JFFS2_INODE_INFO(inode);
327 inode->i_size = targetlen;
328 ri->isize = ri->dsize = ri->csize = cpu_to_je32(inode->i_size);
329 ri->totlen = cpu_to_je32(sizeof(*ri) + inode->i_size);
330 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
332 ri->compr = JFFS2_COMPR_NONE;
333 ri->data_crc = cpu_to_je32(crc32(0, target, targetlen));
334 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
336 fn = jffs2_write_dnode(c, f, ri, target, targetlen, ALLOC_NORMAL);
338 jffs2_free_raw_inode(ri);
340 if (IS_ERR(fn)) {
341 /* Eeek. Wave bye bye */
342 mutex_unlock(&f->sem);
343 jffs2_complete_reservation(c);
344 ret = PTR_ERR(fn);
345 goto fail;
348 /* We use f->target field to store the target path. */
349 f->target = kmemdup(target, targetlen + 1, GFP_KERNEL);
350 if (!f->target) {
351 pr_warn("Can't allocate %d bytes of memory\n", targetlen + 1);
352 mutex_unlock(&f->sem);
353 jffs2_complete_reservation(c);
354 ret = -ENOMEM;
355 goto fail;
357 inode->i_link = f->target;
359 jffs2_dbg(1, "%s(): symlink's target '%s' cached\n",
360 __func__, (char *)f->target);
362 /* No data here. Only a metadata node, which will be
363 obsoleted by the first data write
365 f->metadata = fn;
366 mutex_unlock(&f->sem);
368 jffs2_complete_reservation(c);
370 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
371 if (ret)
372 goto fail;
374 ret = jffs2_init_acl_post(inode);
375 if (ret)
376 goto fail;
378 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
379 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
380 if (ret)
381 goto fail;
383 rd = jffs2_alloc_raw_dirent();
384 if (!rd) {
385 /* Argh. Now we treat it like a normal delete */
386 jffs2_complete_reservation(c);
387 ret = -ENOMEM;
388 goto fail;
391 dir_f = JFFS2_INODE_INFO(dir_i);
392 mutex_lock(&dir_f->sem);
394 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
395 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
396 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
397 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
399 rd->pino = cpu_to_je32(dir_i->i_ino);
400 rd->version = cpu_to_je32(++dir_f->highest_version);
401 rd->ino = cpu_to_je32(inode->i_ino);
402 rd->mctime = cpu_to_je32(get_seconds());
403 rd->nsize = namelen;
404 rd->type = DT_LNK;
405 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
406 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
408 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
410 if (IS_ERR(fd)) {
411 /* dirent failed to write. Delete the inode normally
412 as if it were the final unlink() */
413 jffs2_complete_reservation(c);
414 jffs2_free_raw_dirent(rd);
415 mutex_unlock(&dir_f->sem);
416 ret = PTR_ERR(fd);
417 goto fail;
420 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
422 jffs2_free_raw_dirent(rd);
424 /* Link the fd into the inode's list, obsoleting an old
425 one if necessary. */
426 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
428 mutex_unlock(&dir_f->sem);
429 jffs2_complete_reservation(c);
431 unlock_new_inode(inode);
432 d_instantiate(dentry, inode);
433 return 0;
435 fail:
436 iget_failed(inode);
437 return ret;
441 static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, umode_t mode)
443 struct jffs2_inode_info *f, *dir_f;
444 struct jffs2_sb_info *c;
445 struct inode *inode;
446 struct jffs2_raw_inode *ri;
447 struct jffs2_raw_dirent *rd;
448 struct jffs2_full_dnode *fn;
449 struct jffs2_full_dirent *fd;
450 int namelen;
451 uint32_t alloclen;
452 int ret;
454 mode |= S_IFDIR;
456 ri = jffs2_alloc_raw_inode();
457 if (!ri)
458 return -ENOMEM;
460 c = JFFS2_SB_INFO(dir_i->i_sb);
462 /* Try to reserve enough space for both node and dirent.
463 * Just the node will do for now, though
465 namelen = dentry->d_name.len;
466 ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL,
467 JFFS2_SUMMARY_INODE_SIZE);
469 if (ret) {
470 jffs2_free_raw_inode(ri);
471 return ret;
474 inode = jffs2_new_inode(dir_i, mode, ri);
476 if (IS_ERR(inode)) {
477 jffs2_free_raw_inode(ri);
478 jffs2_complete_reservation(c);
479 return PTR_ERR(inode);
482 inode->i_op = &jffs2_dir_inode_operations;
483 inode->i_fop = &jffs2_dir_operations;
485 f = JFFS2_INODE_INFO(inode);
487 /* Directories get nlink 2 at start */
488 set_nlink(inode, 2);
489 /* but ic->pino_nlink is the parent ino# */
490 f->inocache->pino_nlink = dir_i->i_ino;
492 ri->data_crc = cpu_to_je32(0);
493 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
495 fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL);
497 jffs2_free_raw_inode(ri);
499 if (IS_ERR(fn)) {
500 /* Eeek. Wave bye bye */
501 mutex_unlock(&f->sem);
502 jffs2_complete_reservation(c);
503 ret = PTR_ERR(fn);
504 goto fail;
506 /* No data here. Only a metadata node, which will be
507 obsoleted by the first data write
509 f->metadata = fn;
510 mutex_unlock(&f->sem);
512 jffs2_complete_reservation(c);
514 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
515 if (ret)
516 goto fail;
518 ret = jffs2_init_acl_post(inode);
519 if (ret)
520 goto fail;
522 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
523 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
524 if (ret)
525 goto fail;
527 rd = jffs2_alloc_raw_dirent();
528 if (!rd) {
529 /* Argh. Now we treat it like a normal delete */
530 jffs2_complete_reservation(c);
531 ret = -ENOMEM;
532 goto fail;
535 dir_f = JFFS2_INODE_INFO(dir_i);
536 mutex_lock(&dir_f->sem);
538 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
539 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
540 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
541 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
543 rd->pino = cpu_to_je32(dir_i->i_ino);
544 rd->version = cpu_to_je32(++dir_f->highest_version);
545 rd->ino = cpu_to_je32(inode->i_ino);
546 rd->mctime = cpu_to_je32(get_seconds());
547 rd->nsize = namelen;
548 rd->type = DT_DIR;
549 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
550 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
552 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
554 if (IS_ERR(fd)) {
555 /* dirent failed to write. Delete the inode normally
556 as if it were the final unlink() */
557 jffs2_complete_reservation(c);
558 jffs2_free_raw_dirent(rd);
559 mutex_unlock(&dir_f->sem);
560 ret = PTR_ERR(fd);
561 goto fail;
564 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
565 inc_nlink(dir_i);
567 jffs2_free_raw_dirent(rd);
569 /* Link the fd into the inode's list, obsoleting an old
570 one if necessary. */
571 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
573 mutex_unlock(&dir_f->sem);
574 jffs2_complete_reservation(c);
576 unlock_new_inode(inode);
577 d_instantiate(dentry, inode);
578 return 0;
580 fail:
581 iget_failed(inode);
582 return ret;
585 static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
587 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
588 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
589 struct jffs2_inode_info *f = JFFS2_INODE_INFO(d_inode(dentry));
590 struct jffs2_full_dirent *fd;
591 int ret;
592 uint32_t now = get_seconds();
594 for (fd = f->dents ; fd; fd = fd->next) {
595 if (fd->ino)
596 return -ENOTEMPTY;
599 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
600 dentry->d_name.len, f, now);
601 if (!ret) {
602 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
603 clear_nlink(d_inode(dentry));
604 drop_nlink(dir_i);
606 return ret;
609 static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, umode_t mode, dev_t rdev)
611 struct jffs2_inode_info *f, *dir_f;
612 struct jffs2_sb_info *c;
613 struct inode *inode;
614 struct jffs2_raw_inode *ri;
615 struct jffs2_raw_dirent *rd;
616 struct jffs2_full_dnode *fn;
617 struct jffs2_full_dirent *fd;
618 int namelen;
619 union jffs2_device_node dev;
620 int devlen = 0;
621 uint32_t alloclen;
622 int ret;
624 ri = jffs2_alloc_raw_inode();
625 if (!ri)
626 return -ENOMEM;
628 c = JFFS2_SB_INFO(dir_i->i_sb);
630 if (S_ISBLK(mode) || S_ISCHR(mode))
631 devlen = jffs2_encode_dev(&dev, rdev);
633 /* Try to reserve enough space for both node and dirent.
634 * Just the node will do for now, though
636 namelen = dentry->d_name.len;
637 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &alloclen,
638 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
640 if (ret) {
641 jffs2_free_raw_inode(ri);
642 return ret;
645 inode = jffs2_new_inode(dir_i, mode, ri);
647 if (IS_ERR(inode)) {
648 jffs2_free_raw_inode(ri);
649 jffs2_complete_reservation(c);
650 return PTR_ERR(inode);
652 inode->i_op = &jffs2_file_inode_operations;
653 init_special_inode(inode, inode->i_mode, rdev);
655 f = JFFS2_INODE_INFO(inode);
657 ri->dsize = ri->csize = cpu_to_je32(devlen);
658 ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
659 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
661 ri->compr = JFFS2_COMPR_NONE;
662 ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
663 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
665 fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, ALLOC_NORMAL);
667 jffs2_free_raw_inode(ri);
669 if (IS_ERR(fn)) {
670 /* Eeek. Wave bye bye */
671 mutex_unlock(&f->sem);
672 jffs2_complete_reservation(c);
673 ret = PTR_ERR(fn);
674 goto fail;
676 /* No data here. Only a metadata node, which will be
677 obsoleted by the first data write
679 f->metadata = fn;
680 mutex_unlock(&f->sem);
682 jffs2_complete_reservation(c);
684 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
685 if (ret)
686 goto fail;
688 ret = jffs2_init_acl_post(inode);
689 if (ret)
690 goto fail;
692 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
693 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
694 if (ret)
695 goto fail;
697 rd = jffs2_alloc_raw_dirent();
698 if (!rd) {
699 /* Argh. Now we treat it like a normal delete */
700 jffs2_complete_reservation(c);
701 ret = -ENOMEM;
702 goto fail;
705 dir_f = JFFS2_INODE_INFO(dir_i);
706 mutex_lock(&dir_f->sem);
708 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
709 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
710 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
711 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
713 rd->pino = cpu_to_je32(dir_i->i_ino);
714 rd->version = cpu_to_je32(++dir_f->highest_version);
715 rd->ino = cpu_to_je32(inode->i_ino);
716 rd->mctime = cpu_to_je32(get_seconds());
717 rd->nsize = namelen;
719 /* XXX: This is ugly. */
720 rd->type = (mode & S_IFMT) >> 12;
722 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
723 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
725 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
727 if (IS_ERR(fd)) {
728 /* dirent failed to write. Delete the inode normally
729 as if it were the final unlink() */
730 jffs2_complete_reservation(c);
731 jffs2_free_raw_dirent(rd);
732 mutex_unlock(&dir_f->sem);
733 ret = PTR_ERR(fd);
734 goto fail;
737 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
739 jffs2_free_raw_dirent(rd);
741 /* Link the fd into the inode's list, obsoleting an old
742 one if necessary. */
743 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
745 mutex_unlock(&dir_f->sem);
746 jffs2_complete_reservation(c);
748 unlock_new_inode(inode);
749 d_instantiate(dentry, inode);
750 return 0;
752 fail:
753 iget_failed(inode);
754 return ret;
757 static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
758 struct inode *new_dir_i, struct dentry *new_dentry)
760 int ret;
761 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
762 struct jffs2_inode_info *victim_f = NULL;
763 uint8_t type;
764 uint32_t now;
766 /* The VFS will check for us and prevent trying to rename a
767 * file over a directory and vice versa, but if it's a directory,
768 * the VFS can't check whether the victim is empty. The filesystem
769 * needs to do that for itself.
771 if (d_really_is_positive(new_dentry)) {
772 victim_f = JFFS2_INODE_INFO(d_inode(new_dentry));
773 if (d_is_dir(new_dentry)) {
774 struct jffs2_full_dirent *fd;
776 mutex_lock(&victim_f->sem);
777 for (fd = victim_f->dents; fd; fd = fd->next) {
778 if (fd->ino) {
779 mutex_unlock(&victim_f->sem);
780 return -ENOTEMPTY;
783 mutex_unlock(&victim_f->sem);
787 /* XXX: We probably ought to alloc enough space for
788 both nodes at the same time. Writing the new link,
789 then getting -ENOSPC, is quite bad :)
792 /* Make a hard link */
794 /* XXX: This is ugly */
795 type = (d_inode(old_dentry)->i_mode & S_IFMT) >> 12;
796 if (!type) type = DT_REG;
798 now = get_seconds();
799 ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
800 d_inode(old_dentry)->i_ino, type,
801 new_dentry->d_name.name, new_dentry->d_name.len, now);
803 if (ret)
804 return ret;
806 if (victim_f) {
807 /* There was a victim. Kill it off nicely */
808 if (d_is_dir(new_dentry))
809 clear_nlink(d_inode(new_dentry));
810 else
811 drop_nlink(d_inode(new_dentry));
812 /* Don't oops if the victim was a dirent pointing to an
813 inode which didn't exist. */
814 if (victim_f->inocache) {
815 mutex_lock(&victim_f->sem);
816 if (d_is_dir(new_dentry))
817 victim_f->inocache->pino_nlink = 0;
818 else
819 victim_f->inocache->pino_nlink--;
820 mutex_unlock(&victim_f->sem);
824 /* If it was a directory we moved, and there was no victim,
825 increase i_nlink on its new parent */
826 if (d_is_dir(old_dentry) && !victim_f)
827 inc_nlink(new_dir_i);
829 /* Unlink the original */
830 ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
831 old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
833 /* We don't touch inode->i_nlink */
835 if (ret) {
836 /* Oh shit. We really ought to make a single node which can do both atomically */
837 struct jffs2_inode_info *f = JFFS2_INODE_INFO(d_inode(old_dentry));
838 mutex_lock(&f->sem);
839 inc_nlink(d_inode(old_dentry));
840 if (f->inocache && !d_is_dir(old_dentry))
841 f->inocache->pino_nlink++;
842 mutex_unlock(&f->sem);
844 pr_notice("%s(): Link succeeded, unlink failed (err %d). You now have a hard link\n",
845 __func__, ret);
846 /* Might as well let the VFS know */
847 d_instantiate(new_dentry, d_inode(old_dentry));
848 ihold(d_inode(old_dentry));
849 new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now);
850 return ret;
853 if (d_is_dir(old_dentry))
854 drop_nlink(old_dir_i);
856 new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
858 return 0;