Linux 3.12.5
[linux/fpc-iii.git] / fs / jffs2 / dir.c
blobe3aac222472e1f06e9d998f46323b4d8be0e1071
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 .setattr = jffs2_setattr,
63 .setxattr = jffs2_setxattr,
64 .getxattr = jffs2_getxattr,
65 .listxattr = jffs2_listxattr,
66 .removexattr = jffs2_removexattr
69 /***********************************************************************/
72 /* We keep the dirent list sorted in increasing order of name hash,
73 and we use the same hash function as the dentries. Makes this
74 nice and simple
76 static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,
77 unsigned int flags)
79 struct jffs2_inode_info *dir_f;
80 struct jffs2_full_dirent *fd = NULL, *fd_list;
81 uint32_t ino = 0;
82 struct inode *inode = NULL;
84 jffs2_dbg(1, "jffs2_lookup()\n");
86 if (target->d_name.len > JFFS2_MAX_NAME_LEN)
87 return ERR_PTR(-ENAMETOOLONG);
89 dir_f = JFFS2_INODE_INFO(dir_i);
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 pr_warn("iget() failed for ino #%u\n", ino);
111 return d_splice_alias(inode, target);
114 /***********************************************************************/
117 static int jffs2_readdir(struct file *file, struct dir_context *ctx)
119 struct inode *inode = file_inode(file);
120 struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
121 struct jffs2_full_dirent *fd;
122 unsigned long curofs = 1;
124 jffs2_dbg(1, "jffs2_readdir() for dir_i #%lu\n", inode->i_ino);
126 if (!dir_emit_dots(file, ctx))
127 return 0;
129 mutex_lock(&f->sem);
130 for (fd = f->dents; fd; fd = fd->next) {
131 curofs++;
132 /* First loop: curofs = 2; pos = 2 */
133 if (curofs < ctx->pos) {
134 jffs2_dbg(2, "Skipping dirent: \"%s\", ino #%u, type %d, because curofs %ld < offset %ld\n",
135 fd->name, fd->ino, fd->type, curofs, (unsigned long)ctx->pos);
136 continue;
138 if (!fd->ino) {
139 jffs2_dbg(2, "Skipping deletion dirent \"%s\"\n",
140 fd->name);
141 ctx->pos++;
142 continue;
144 jffs2_dbg(2, "Dirent %ld: \"%s\", ino #%u, type %d\n",
145 (unsigned long)ctx->pos, fd->name, fd->ino, fd->type);
146 if (!dir_emit(ctx, fd->name, strlen(fd->name), fd->ino, fd->type))
147 break;
148 ctx->pos++;
150 mutex_unlock(&f->sem);
151 return 0;
154 /***********************************************************************/
157 static int jffs2_create(struct inode *dir_i, struct dentry *dentry,
158 umode_t mode, bool excl)
160 struct jffs2_raw_inode *ri;
161 struct jffs2_inode_info *f, *dir_f;
162 struct jffs2_sb_info *c;
163 struct inode *inode;
164 int ret;
166 ri = jffs2_alloc_raw_inode();
167 if (!ri)
168 return -ENOMEM;
170 c = JFFS2_SB_INFO(dir_i->i_sb);
172 jffs2_dbg(1, "%s()\n", __func__);
174 inode = jffs2_new_inode(dir_i, mode, ri);
176 if (IS_ERR(inode)) {
177 jffs2_dbg(1, "jffs2_new_inode() failed\n");
178 jffs2_free_raw_inode(ri);
179 return PTR_ERR(inode);
182 inode->i_op = &jffs2_file_inode_operations;
183 inode->i_fop = &jffs2_file_operations;
184 inode->i_mapping->a_ops = &jffs2_file_address_operations;
185 inode->i_mapping->nrpages = 0;
187 f = JFFS2_INODE_INFO(inode);
188 dir_f = JFFS2_INODE_INFO(dir_i);
190 /* jffs2_do_create() will want to lock it, _after_ reserving
191 space and taking c-alloc_sem. If we keep it locked here,
192 lockdep gets unhappy (although it's a false positive;
193 nothing else will be looking at this inode yet so there's
194 no chance of AB-BA deadlock involving its f->sem). */
195 mutex_unlock(&f->sem);
197 ret = jffs2_do_create(c, dir_f, f, ri, &dentry->d_name);
198 if (ret)
199 goto fail;
201 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(ri->ctime));
203 jffs2_free_raw_inode(ri);
205 jffs2_dbg(1, "%s(): Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n",
206 __func__, inode->i_ino, inode->i_mode, inode->i_nlink,
207 f->inocache->pino_nlink, inode->i_mapping->nrpages);
209 unlock_new_inode(inode);
210 d_instantiate(dentry, inode);
211 return 0;
213 fail:
214 iget_failed(inode);
215 jffs2_free_raw_inode(ri);
216 return ret;
219 /***********************************************************************/
222 static int jffs2_unlink(struct inode *dir_i, struct dentry *dentry)
224 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
225 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
226 struct jffs2_inode_info *dead_f = JFFS2_INODE_INFO(dentry->d_inode);
227 int ret;
228 uint32_t now = get_seconds();
230 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
231 dentry->d_name.len, dead_f, now);
232 if (dead_f->inocache)
233 set_nlink(dentry->d_inode, dead_f->inocache->pino_nlink);
234 if (!ret)
235 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
236 return ret;
238 /***********************************************************************/
241 static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry)
243 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dentry->d_inode->i_sb);
244 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
245 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
246 int ret;
247 uint8_t type;
248 uint32_t now;
250 /* Don't let people make hard links to bad inodes. */
251 if (!f->inocache)
252 return -EIO;
254 if (S_ISDIR(old_dentry->d_inode->i_mode))
255 return -EPERM;
257 /* XXX: This is ugly */
258 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
259 if (!type) type = DT_REG;
261 now = get_seconds();
262 ret = jffs2_do_link(c, dir_f, f->inocache->ino, type, dentry->d_name.name, dentry->d_name.len, now);
264 if (!ret) {
265 mutex_lock(&f->sem);
266 set_nlink(old_dentry->d_inode, ++f->inocache->pino_nlink);
267 mutex_unlock(&f->sem);
268 d_instantiate(dentry, old_dentry->d_inode);
269 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
270 ihold(old_dentry->d_inode);
272 return ret;
275 /***********************************************************************/
277 static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char *target)
279 struct jffs2_inode_info *f, *dir_f;
280 struct jffs2_sb_info *c;
281 struct inode *inode;
282 struct jffs2_raw_inode *ri;
283 struct jffs2_raw_dirent *rd;
284 struct jffs2_full_dnode *fn;
285 struct jffs2_full_dirent *fd;
286 int namelen;
287 uint32_t alloclen;
288 int ret, targetlen = strlen(target);
290 /* FIXME: If you care. We'd need to use frags for the target
291 if it grows much more than this */
292 if (targetlen > 254)
293 return -ENAMETOOLONG;
295 ri = jffs2_alloc_raw_inode();
297 if (!ri)
298 return -ENOMEM;
300 c = JFFS2_SB_INFO(dir_i->i_sb);
302 /* Try to reserve enough space for both node and dirent.
303 * Just the node will do for now, though
305 namelen = dentry->d_name.len;
306 ret = jffs2_reserve_space(c, sizeof(*ri) + targetlen, &alloclen,
307 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
309 if (ret) {
310 jffs2_free_raw_inode(ri);
311 return ret;
314 inode = jffs2_new_inode(dir_i, S_IFLNK | S_IRWXUGO, ri);
316 if (IS_ERR(inode)) {
317 jffs2_free_raw_inode(ri);
318 jffs2_complete_reservation(c);
319 return PTR_ERR(inode);
322 inode->i_op = &jffs2_symlink_inode_operations;
324 f = JFFS2_INODE_INFO(inode);
326 inode->i_size = targetlen;
327 ri->isize = ri->dsize = ri->csize = cpu_to_je32(inode->i_size);
328 ri->totlen = cpu_to_je32(sizeof(*ri) + inode->i_size);
329 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
331 ri->compr = JFFS2_COMPR_NONE;
332 ri->data_crc = cpu_to_je32(crc32(0, target, targetlen));
333 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
335 fn = jffs2_write_dnode(c, f, ri, target, targetlen, ALLOC_NORMAL);
337 jffs2_free_raw_inode(ri);
339 if (IS_ERR(fn)) {
340 /* Eeek. Wave bye bye */
341 mutex_unlock(&f->sem);
342 jffs2_complete_reservation(c);
343 ret = PTR_ERR(fn);
344 goto fail;
347 /* We use f->target field to store the target path. */
348 f->target = kmemdup(target, targetlen + 1, GFP_KERNEL);
349 if (!f->target) {
350 pr_warn("Can't allocate %d bytes of memory\n", targetlen + 1);
351 mutex_unlock(&f->sem);
352 jffs2_complete_reservation(c);
353 ret = -ENOMEM;
354 goto fail;
357 jffs2_dbg(1, "%s(): symlink's target '%s' cached\n",
358 __func__, (char *)f->target);
360 /* No data here. Only a metadata node, which will be
361 obsoleted by the first data write
363 f->metadata = fn;
364 mutex_unlock(&f->sem);
366 jffs2_complete_reservation(c);
368 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
369 if (ret)
370 goto fail;
372 ret = jffs2_init_acl_post(inode);
373 if (ret)
374 goto fail;
376 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
377 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
378 if (ret)
379 goto fail;
381 rd = jffs2_alloc_raw_dirent();
382 if (!rd) {
383 /* Argh. Now we treat it like a normal delete */
384 jffs2_complete_reservation(c);
385 ret = -ENOMEM;
386 goto fail;
389 dir_f = JFFS2_INODE_INFO(dir_i);
390 mutex_lock(&dir_f->sem);
392 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
393 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
394 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
395 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
397 rd->pino = cpu_to_je32(dir_i->i_ino);
398 rd->version = cpu_to_je32(++dir_f->highest_version);
399 rd->ino = cpu_to_je32(inode->i_ino);
400 rd->mctime = cpu_to_je32(get_seconds());
401 rd->nsize = namelen;
402 rd->type = DT_LNK;
403 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
404 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
406 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
408 if (IS_ERR(fd)) {
409 /* dirent failed to write. Delete the inode normally
410 as if it were the final unlink() */
411 jffs2_complete_reservation(c);
412 jffs2_free_raw_dirent(rd);
413 mutex_unlock(&dir_f->sem);
414 ret = PTR_ERR(fd);
415 goto fail;
418 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
420 jffs2_free_raw_dirent(rd);
422 /* Link the fd into the inode's list, obsoleting an old
423 one if necessary. */
424 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
426 mutex_unlock(&dir_f->sem);
427 jffs2_complete_reservation(c);
429 unlock_new_inode(inode);
430 d_instantiate(dentry, inode);
431 return 0;
433 fail:
434 iget_failed(inode);
435 return ret;
439 static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, umode_t mode)
441 struct jffs2_inode_info *f, *dir_f;
442 struct jffs2_sb_info *c;
443 struct inode *inode;
444 struct jffs2_raw_inode *ri;
445 struct jffs2_raw_dirent *rd;
446 struct jffs2_full_dnode *fn;
447 struct jffs2_full_dirent *fd;
448 int namelen;
449 uint32_t alloclen;
450 int ret;
452 mode |= S_IFDIR;
454 ri = jffs2_alloc_raw_inode();
455 if (!ri)
456 return -ENOMEM;
458 c = JFFS2_SB_INFO(dir_i->i_sb);
460 /* Try to reserve enough space for both node and dirent.
461 * Just the node will do for now, though
463 namelen = dentry->d_name.len;
464 ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL,
465 JFFS2_SUMMARY_INODE_SIZE);
467 if (ret) {
468 jffs2_free_raw_inode(ri);
469 return ret;
472 inode = jffs2_new_inode(dir_i, mode, ri);
474 if (IS_ERR(inode)) {
475 jffs2_free_raw_inode(ri);
476 jffs2_complete_reservation(c);
477 return PTR_ERR(inode);
480 inode->i_op = &jffs2_dir_inode_operations;
481 inode->i_fop = &jffs2_dir_operations;
483 f = JFFS2_INODE_INFO(inode);
485 /* Directories get nlink 2 at start */
486 set_nlink(inode, 2);
487 /* but ic->pino_nlink is the parent ino# */
488 f->inocache->pino_nlink = dir_i->i_ino;
490 ri->data_crc = cpu_to_je32(0);
491 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
493 fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL);
495 jffs2_free_raw_inode(ri);
497 if (IS_ERR(fn)) {
498 /* Eeek. Wave bye bye */
499 mutex_unlock(&f->sem);
500 jffs2_complete_reservation(c);
501 ret = PTR_ERR(fn);
502 goto fail;
504 /* No data here. Only a metadata node, which will be
505 obsoleted by the first data write
507 f->metadata = fn;
508 mutex_unlock(&f->sem);
510 jffs2_complete_reservation(c);
512 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
513 if (ret)
514 goto fail;
516 ret = jffs2_init_acl_post(inode);
517 if (ret)
518 goto fail;
520 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
521 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
522 if (ret)
523 goto fail;
525 rd = jffs2_alloc_raw_dirent();
526 if (!rd) {
527 /* Argh. Now we treat it like a normal delete */
528 jffs2_complete_reservation(c);
529 ret = -ENOMEM;
530 goto fail;
533 dir_f = JFFS2_INODE_INFO(dir_i);
534 mutex_lock(&dir_f->sem);
536 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
537 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
538 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
539 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
541 rd->pino = cpu_to_je32(dir_i->i_ino);
542 rd->version = cpu_to_je32(++dir_f->highest_version);
543 rd->ino = cpu_to_je32(inode->i_ino);
544 rd->mctime = cpu_to_je32(get_seconds());
545 rd->nsize = namelen;
546 rd->type = DT_DIR;
547 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
548 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
550 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
552 if (IS_ERR(fd)) {
553 /* dirent failed to write. Delete the inode normally
554 as if it were the final unlink() */
555 jffs2_complete_reservation(c);
556 jffs2_free_raw_dirent(rd);
557 mutex_unlock(&dir_f->sem);
558 ret = PTR_ERR(fd);
559 goto fail;
562 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
563 inc_nlink(dir_i);
565 jffs2_free_raw_dirent(rd);
567 /* Link the fd into the inode's list, obsoleting an old
568 one if necessary. */
569 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
571 mutex_unlock(&dir_f->sem);
572 jffs2_complete_reservation(c);
574 unlock_new_inode(inode);
575 d_instantiate(dentry, inode);
576 return 0;
578 fail:
579 iget_failed(inode);
580 return ret;
583 static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
585 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
586 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
587 struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
588 struct jffs2_full_dirent *fd;
589 int ret;
590 uint32_t now = get_seconds();
592 for (fd = f->dents ; fd; fd = fd->next) {
593 if (fd->ino)
594 return -ENOTEMPTY;
597 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
598 dentry->d_name.len, f, now);
599 if (!ret) {
600 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
601 clear_nlink(dentry->d_inode);
602 drop_nlink(dir_i);
604 return ret;
607 static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, umode_t mode, dev_t rdev)
609 struct jffs2_inode_info *f, *dir_f;
610 struct jffs2_sb_info *c;
611 struct inode *inode;
612 struct jffs2_raw_inode *ri;
613 struct jffs2_raw_dirent *rd;
614 struct jffs2_full_dnode *fn;
615 struct jffs2_full_dirent *fd;
616 int namelen;
617 union jffs2_device_node dev;
618 int devlen = 0;
619 uint32_t alloclen;
620 int ret;
622 if (!new_valid_dev(rdev))
623 return -EINVAL;
625 ri = jffs2_alloc_raw_inode();
626 if (!ri)
627 return -ENOMEM;
629 c = JFFS2_SB_INFO(dir_i->i_sb);
631 if (S_ISBLK(mode) || S_ISCHR(mode))
632 devlen = jffs2_encode_dev(&dev, rdev);
634 /* Try to reserve enough space for both node and dirent.
635 * Just the node will do for now, though
637 namelen = dentry->d_name.len;
638 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &alloclen,
639 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
641 if (ret) {
642 jffs2_free_raw_inode(ri);
643 return ret;
646 inode = jffs2_new_inode(dir_i, mode, ri);
648 if (IS_ERR(inode)) {
649 jffs2_free_raw_inode(ri);
650 jffs2_complete_reservation(c);
651 return PTR_ERR(inode);
653 inode->i_op = &jffs2_file_inode_operations;
654 init_special_inode(inode, inode->i_mode, rdev);
656 f = JFFS2_INODE_INFO(inode);
658 ri->dsize = ri->csize = cpu_to_je32(devlen);
659 ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
660 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
662 ri->compr = JFFS2_COMPR_NONE;
663 ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
664 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
666 fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, ALLOC_NORMAL);
668 jffs2_free_raw_inode(ri);
670 if (IS_ERR(fn)) {
671 /* Eeek. Wave bye bye */
672 mutex_unlock(&f->sem);
673 jffs2_complete_reservation(c);
674 ret = PTR_ERR(fn);
675 goto fail;
677 /* No data here. Only a metadata node, which will be
678 obsoleted by the first data write
680 f->metadata = fn;
681 mutex_unlock(&f->sem);
683 jffs2_complete_reservation(c);
685 ret = jffs2_init_security(inode, dir_i, &dentry->d_name);
686 if (ret)
687 goto fail;
689 ret = jffs2_init_acl_post(inode);
690 if (ret)
691 goto fail;
693 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
694 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
695 if (ret)
696 goto fail;
698 rd = jffs2_alloc_raw_dirent();
699 if (!rd) {
700 /* Argh. Now we treat it like a normal delete */
701 jffs2_complete_reservation(c);
702 ret = -ENOMEM;
703 goto fail;
706 dir_f = JFFS2_INODE_INFO(dir_i);
707 mutex_lock(&dir_f->sem);
709 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
710 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
711 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
712 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
714 rd->pino = cpu_to_je32(dir_i->i_ino);
715 rd->version = cpu_to_je32(++dir_f->highest_version);
716 rd->ino = cpu_to_je32(inode->i_ino);
717 rd->mctime = cpu_to_je32(get_seconds());
718 rd->nsize = namelen;
720 /* XXX: This is ugly. */
721 rd->type = (mode & S_IFMT) >> 12;
723 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
724 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
726 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
728 if (IS_ERR(fd)) {
729 /* dirent failed to write. Delete the inode normally
730 as if it were the final unlink() */
731 jffs2_complete_reservation(c);
732 jffs2_free_raw_dirent(rd);
733 mutex_unlock(&dir_f->sem);
734 ret = PTR_ERR(fd);
735 goto fail;
738 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
740 jffs2_free_raw_dirent(rd);
742 /* Link the fd into the inode's list, obsoleting an old
743 one if necessary. */
744 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
746 mutex_unlock(&dir_f->sem);
747 jffs2_complete_reservation(c);
749 unlock_new_inode(inode);
750 d_instantiate(dentry, inode);
751 return 0;
753 fail:
754 iget_failed(inode);
755 return ret;
758 static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
759 struct inode *new_dir_i, struct dentry *new_dentry)
761 int ret;
762 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
763 struct jffs2_inode_info *victim_f = NULL;
764 uint8_t type;
765 uint32_t now;
767 /* The VFS will check for us and prevent trying to rename a
768 * file over a directory and vice versa, but if it's a directory,
769 * the VFS can't check whether the victim is empty. The filesystem
770 * needs to do that for itself.
772 if (new_dentry->d_inode) {
773 victim_f = JFFS2_INODE_INFO(new_dentry->d_inode);
774 if (S_ISDIR(new_dentry->d_inode->i_mode)) {
775 struct jffs2_full_dirent *fd;
777 mutex_lock(&victim_f->sem);
778 for (fd = victim_f->dents; fd; fd = fd->next) {
779 if (fd->ino) {
780 mutex_unlock(&victim_f->sem);
781 return -ENOTEMPTY;
784 mutex_unlock(&victim_f->sem);
788 /* XXX: We probably ought to alloc enough space for
789 both nodes at the same time. Writing the new link,
790 then getting -ENOSPC, is quite bad :)
793 /* Make a hard link */
795 /* XXX: This is ugly */
796 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
797 if (!type) type = DT_REG;
799 now = get_seconds();
800 ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
801 old_dentry->d_inode->i_ino, type,
802 new_dentry->d_name.name, new_dentry->d_name.len, now);
804 if (ret)
805 return ret;
807 if (victim_f) {
808 /* There was a victim. Kill it off nicely */
809 if (S_ISDIR(new_dentry->d_inode->i_mode))
810 clear_nlink(new_dentry->d_inode);
811 else
812 drop_nlink(new_dentry->d_inode);
813 /* Don't oops if the victim was a dirent pointing to an
814 inode which didn't exist. */
815 if (victim_f->inocache) {
816 mutex_lock(&victim_f->sem);
817 if (S_ISDIR(new_dentry->d_inode->i_mode))
818 victim_f->inocache->pino_nlink = 0;
819 else
820 victim_f->inocache->pino_nlink--;
821 mutex_unlock(&victim_f->sem);
825 /* If it was a directory we moved, and there was no victim,
826 increase i_nlink on its new parent */
827 if (S_ISDIR(old_dentry->d_inode->i_mode) && !victim_f)
828 inc_nlink(new_dir_i);
830 /* Unlink the original */
831 ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
832 old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
834 /* We don't touch inode->i_nlink */
836 if (ret) {
837 /* Oh shit. We really ought to make a single node which can do both atomically */
838 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
839 mutex_lock(&f->sem);
840 inc_nlink(old_dentry->d_inode);
841 if (f->inocache && !S_ISDIR(old_dentry->d_inode->i_mode))
842 f->inocache->pino_nlink++;
843 mutex_unlock(&f->sem);
845 pr_notice("%s(): Link succeeded, unlink failed (err %d). You now have a hard link\n",
846 __func__, ret);
847 /* Might as well let the VFS know */
848 d_instantiate(new_dentry, old_dentry->d_inode);
849 ihold(old_dentry->d_inode);
850 new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now);
851 return ret;
854 if (S_ISDIR(old_dentry->d_inode->i_mode))
855 drop_nlink(old_dir_i);
857 new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
859 return 0;