]> bbs.cooldavid.org Git - net-next-2.6.git/blame - fs/jffs2/dir.c
[JFFS2] Tidy up licensing/copyright boilerplate.
[net-next-2.6.git] / fs / jffs2 / dir.c
CommitLineData
1da177e4
LT
1/*
2 * JFFS2 -- Journalling Flash File System, Version 2.
3 *
c00c310e 4 * Copyright © 2001-2007 Red Hat, Inc.
1da177e4
LT
5 *
6 * Created by David Woodhouse <dwmw2@infradead.org>
7 *
8 * For licensing information, see the file 'LICENCE' in this directory.
9 *
1da177e4
LT
10 */
11
12#include <linux/kernel.h>
13#include <linux/slab.h>
1da177e4
LT
14#include <linux/fs.h>
15#include <linux/crc32.h>
16#include <linux/jffs2.h>
cbb9a561
DW
17#include "jffs2_fs_i.h"
18#include "jffs2_fs_sb.h"
1da177e4
LT
19#include <linux/time.h>
20#include "nodelist.h"
21
1da177e4
LT
22static int jffs2_readdir (struct file *, void *, filldir_t);
23
24static int jffs2_create (struct inode *,struct dentry *,int,
25 struct nameidata *);
26static struct dentry *jffs2_lookup (struct inode *,struct dentry *,
27 struct nameidata *);
28static int jffs2_link (struct dentry *,struct inode *,struct dentry *);
29static int jffs2_unlink (struct inode *,struct dentry *);
30static int jffs2_symlink (struct inode *,struct dentry *,const char *);
31static int jffs2_mkdir (struct inode *,struct dentry *,int);
32static int jffs2_rmdir (struct inode *,struct dentry *);
265489f0 33static int jffs2_mknod (struct inode *,struct dentry *,int,dev_t);
1da177e4
LT
34static int jffs2_rename (struct inode *, struct dentry *,
35 struct inode *, struct dentry *);
36
4b6f5d20 37const struct file_operations jffs2_dir_operations =
1da177e4
LT
38{
39 .read = generic_read_dir,
40 .readdir = jffs2_readdir,
41 .ioctl = jffs2_ioctl,
42 .fsync = jffs2_fsync
43};
44
45
92e1d5be 46const struct inode_operations jffs2_dir_inode_operations =
1da177e4 47{
265489f0
DW
48 .create = jffs2_create,
49 .lookup = jffs2_lookup,
1da177e4
LT
50 .link = jffs2_link,
51 .unlink = jffs2_unlink,
52 .symlink = jffs2_symlink,
53 .mkdir = jffs2_mkdir,
54 .rmdir = jffs2_rmdir,
55 .mknod = jffs2_mknod,
56 .rename = jffs2_rename,
aa98d7cf 57 .permission = jffs2_permission,
1da177e4 58 .setattr = jffs2_setattr,
aa98d7cf
KK
59 .setxattr = jffs2_setxattr,
60 .getxattr = jffs2_getxattr,
61 .listxattr = jffs2_listxattr,
62 .removexattr = jffs2_removexattr
1da177e4
LT
63};
64
65/***********************************************************************/
66
67
68/* We keep the dirent list sorted in increasing order of name hash,
182ec4ee 69 and we use the same hash function as the dentries. Makes this
1da177e4
LT
70 nice and simple
71*/
72static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,
73 struct nameidata *nd)
74{
75 struct jffs2_inode_info *dir_f;
76 struct jffs2_sb_info *c;
77 struct jffs2_full_dirent *fd = NULL, *fd_list;
78 uint32_t ino = 0;
79 struct inode *inode = NULL;
80
81 D1(printk(KERN_DEBUG "jffs2_lookup()\n"));
82
373d5e71
RP
83 if (target->d_name.len > JFFS2_MAX_NAME_LEN)
84 return ERR_PTR(-ENAMETOOLONG);
85
1da177e4
LT
86 dir_f = JFFS2_INODE_INFO(dir_i);
87 c = JFFS2_SB_INFO(dir_i->i_sb);
88
89 down(&dir_f->sem);
90
91 /* NB: The 2.2 backport will need to explicitly check for '.' and '..' here */
92 for (fd_list = dir_f->dents; fd_list && fd_list->nhash <= target->d_name.hash; fd_list = fd_list->next) {
182ec4ee 93 if (fd_list->nhash == target->d_name.hash &&
1da177e4
LT
94 (!fd || fd_list->version > fd->version) &&
95 strlen(fd_list->name) == target->d_name.len &&
96 !strncmp(fd_list->name, target->d_name.name, target->d_name.len)) {
97 fd = fd_list;
98 }
99 }
100 if (fd)
101 ino = fd->ino;
102 up(&dir_f->sem);
103 if (ino) {
104 inode = iget(dir_i->i_sb, ino);
105 if (!inode) {
106 printk(KERN_WARNING "iget() failed for ino #%u\n", ino);
107 return (ERR_PTR(-EIO));
108 }
109 }
110
111 d_add(target, inode);
112
113 return NULL;
114}
115
116/***********************************************************************/
117
118
119static int jffs2_readdir(struct file *filp, void *dirent, filldir_t filldir)
120{
121 struct jffs2_inode_info *f;
122 struct jffs2_sb_info *c;
ec2e203c 123 struct inode *inode = filp->f_path.dentry->d_inode;
1da177e4
LT
124 struct jffs2_full_dirent *fd;
125 unsigned long offset, curofs;
126
ec2e203c 127 D1(printk(KERN_DEBUG "jffs2_readdir() for dir_i #%lu\n", filp->f_path.dentry->d_inode->i_ino));
1da177e4
LT
128
129 f = JFFS2_INODE_INFO(inode);
130 c = JFFS2_SB_INFO(inode->i_sb);
131
132 offset = filp->f_pos;
133
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++;
139 }
140 if (offset == 1) {
ec2e203c 141 unsigned long pino = parent_ino(filp->f_path.dentry);
1da177e4
LT
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++;
146 }
147
148 curofs=1;
149 down(&f->sem);
150 for (fd = f->dents; fd; fd = fd->next) {
151
152 curofs++;
153 /* First loop: curofs = 2; offset = 2 */
154 if (curofs < offset) {
182ec4ee 155 D2(printk(KERN_DEBUG "Skipping dirent: \"%s\", ino #%u, type %d, because curofs %ld < offset %ld\n",
1da177e4
LT
156 fd->name, fd->ino, fd->type, curofs, offset));
157 continue;
158 }
159 if (!fd->ino) {
160 D2(printk(KERN_DEBUG "Skipping deletion dirent \"%s\"\n", fd->name));
161 offset++;
162 continue;
163 }
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++;
168 }
169 up(&f->sem);
170 out:
171 filp->f_pos = offset;
172 return 0;
173}
174
175/***********************************************************************/
176
177
178static int jffs2_create(struct inode *dir_i, struct dentry *dentry, int mode,
179 struct nameidata *nd)
180{
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;
186
187 ri = jffs2_alloc_raw_inode();
188 if (!ri)
189 return -ENOMEM;
182ec4ee 190
1da177e4
LT
191 c = JFFS2_SB_INFO(dir_i->i_sb);
192
193 D1(printk(KERN_DEBUG "jffs2_create()\n"));
194
195 inode = jffs2_new_inode(dir_i, mode, ri);
196
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);
201 }
202
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;
207
208 f = JFFS2_INODE_INFO(inode);
209 dir_f = JFFS2_INODE_INFO(dir_i);
210
182ec4ee 211 ret = jffs2_do_create(c, dir_f, f, ri,
1da177e4
LT
212 dentry->d_name.name, dentry->d_name.len);
213
aa98d7cf
KK
214 if (ret)
215 goto fail;
216
217 ret = jffs2_init_security(inode, dir_i);
218 if (ret)
219 goto fail;
220 ret = jffs2_init_acl(inode, dir_i);
221 if (ret)
222 goto fail;
1da177e4
LT
223
224 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(ri->ctime));
225
226 jffs2_free_raw_inode(ri);
227 d_instantiate(dentry, inode);
228
229 D1(printk(KERN_DEBUG "jffs2_create: Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n",
230 inode->i_ino, inode->i_mode, inode->i_nlink, f->inocache->nlink, inode->i_mapping->nrpages));
231 return 0;
aa98d7cf
KK
232
233 fail:
234 make_bad_inode(inode);
235 iput(inode);
236 jffs2_free_raw_inode(ri);
237 return ret;
1da177e4
LT
238}
239
240/***********************************************************************/
241
242
243static int jffs2_unlink(struct inode *dir_i, struct dentry *dentry)
244{
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;
3a69e0cd 249 uint32_t now = get_seconds();
1da177e4 250
182ec4ee 251 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
3a69e0cd 252 dentry->d_name.len, dead_f, now);
1da177e4
LT
253 if (dead_f->inocache)
254 dentry->d_inode->i_nlink = dead_f->inocache->nlink;
3a69e0cd
AB
255 if (!ret)
256 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
1da177e4
LT
257 return ret;
258}
259/***********************************************************************/
260
261
262static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry)
263{
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;
3a69e0cd 269 uint32_t now;
1da177e4
LT
270
271 /* Don't let people make hard links to bad inodes. */
272 if (!f->inocache)
273 return -EIO;
274
275 if (S_ISDIR(old_dentry->d_inode->i_mode))
276 return -EPERM;
277
278 /* XXX: This is ugly */
279 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
280 if (!type) type = DT_REG;
281
3a69e0cd
AB
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);
1da177e4
LT
284
285 if (!ret) {
286 down(&f->sem);
287 old_dentry->d_inode->i_nlink = ++f->inocache->nlink;
288 up(&f->sem);
289 d_instantiate(dentry, old_dentry->d_inode);
3a69e0cd 290 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
1da177e4
LT
291 atomic_inc(&old_dentry->d_inode->i_count);
292 }
293 return ret;
294}
295
296/***********************************************************************/
297
298static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char *target)
299{
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;
9fe4854c 308 uint32_t alloclen;
32f1a95d 309 int ret, targetlen = strlen(target);
1da177e4
LT
310
311 /* FIXME: If you care. We'd need to use frags for the target
312 if it grows much more than this */
32f1a95d 313 if (targetlen > 254)
1da177e4
LT
314 return -EINVAL;
315
316 ri = jffs2_alloc_raw_inode();
317
318 if (!ri)
319 return -ENOMEM;
182ec4ee 320
1da177e4 321 c = JFFS2_SB_INFO(dir_i->i_sb);
182ec4ee
TG
322
323 /* Try to reserve enough space for both node and dirent.
324 * Just the node will do for now, though
1da177e4
LT
325 */
326 namelen = dentry->d_name.len;
9fe4854c
DW
327 ret = jffs2_reserve_space(c, sizeof(*ri) + targetlen, &alloclen,
328 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
329
330 if (ret) {
331 jffs2_free_raw_inode(ri);
332 return ret;
333 }
334
335 inode = jffs2_new_inode(dir_i, S_IFLNK | S_IRWXUGO, ri);
336
337 if (IS_ERR(inode)) {
338 jffs2_free_raw_inode(ri);
339 jffs2_complete_reservation(c);
340 return PTR_ERR(inode);
341 }
342
343 inode->i_op = &jffs2_symlink_inode_operations;
344
345 f = JFFS2_INODE_INFO(inode);
346
32f1a95d 347 inode->i_size = targetlen;
1da177e4
LT
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));
351
352 ri->compr = JFFS2_COMPR_NONE;
32f1a95d 353 ri->data_crc = cpu_to_je32(crc32(0, target, targetlen));
1da177e4 354 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 355
9fe4854c 356 fn = jffs2_write_dnode(c, f, ri, target, targetlen, ALLOC_NORMAL);
1da177e4
LT
357
358 jffs2_free_raw_inode(ri);
359
360 if (IS_ERR(fn)) {
361 /* Eeek. Wave bye bye */
362 up(&f->sem);
363 jffs2_complete_reservation(c);
364 jffs2_clear_inode(inode);
365 return PTR_ERR(fn);
366 }
32f1a95d 367
2b79adcc
AB
368 /* We use f->target field to store the target path. */
369 f->target = kmalloc(targetlen + 1, GFP_KERNEL);
370 if (!f->target) {
32f1a95d
AB
371 printk(KERN_WARNING "Can't allocate %d bytes of memory\n", targetlen + 1);
372 up(&f->sem);
373 jffs2_complete_reservation(c);
374 jffs2_clear_inode(inode);
375 return -ENOMEM;
376 }
377
2b79adcc
AB
378 memcpy(f->target, target, targetlen + 1);
379 D1(printk(KERN_DEBUG "jffs2_symlink: symlink's target '%s' cached\n", (char *)f->target));
32f1a95d 380
182ec4ee 381 /* No data here. Only a metadata node, which will be
1da177e4
LT
382 obsoleted by the first data write
383 */
384 f->metadata = fn;
385 up(&f->sem);
386
387 jffs2_complete_reservation(c);
aa98d7cf
KK
388
389 ret = jffs2_init_security(inode, dir_i);
390 if (ret) {
391 jffs2_clear_inode(inode);
392 return ret;
393 }
394 ret = jffs2_init_acl(inode, dir_i);
395 if (ret) {
396 jffs2_clear_inode(inode);
397 return ret;
398 }
399
9fe4854c
DW
400 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
401 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
1da177e4
LT
402 if (ret) {
403 /* Eep. */
404 jffs2_clear_inode(inode);
405 return ret;
406 }
407
408 rd = jffs2_alloc_raw_dirent();
409 if (!rd) {
410 /* Argh. Now we treat it like a normal delete */
411 jffs2_complete_reservation(c);
412 jffs2_clear_inode(inode);
413 return -ENOMEM;
414 }
415
416 dir_f = JFFS2_INODE_INFO(dir_i);
417 down(&dir_f->sem);
418
419 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
420 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
421 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
422 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
423
424 rd->pino = cpu_to_je32(dir_i->i_ino);
425 rd->version = cpu_to_je32(++dir_f->highest_version);
426 rd->ino = cpu_to_je32(inode->i_ino);
427 rd->mctime = cpu_to_je32(get_seconds());
428 rd->nsize = namelen;
429 rd->type = DT_LNK;
430 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
431 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
432
9fe4854c 433 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
1da177e4
LT
434
435 if (IS_ERR(fd)) {
182ec4ee 436 /* dirent failed to write. Delete the inode normally
1da177e4
LT
437 as if it were the final unlink() */
438 jffs2_complete_reservation(c);
439 jffs2_free_raw_dirent(rd);
440 up(&dir_f->sem);
441 jffs2_clear_inode(inode);
442 return PTR_ERR(fd);
443 }
444
445 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
446
447 jffs2_free_raw_dirent(rd);
448
449 /* Link the fd into the inode's list, obsoleting an old
450 one if necessary. */
451 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
452
453 up(&dir_f->sem);
454 jffs2_complete_reservation(c);
455
456 d_instantiate(dentry, inode);
457 return 0;
458}
459
460
461static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode)
462{
463 struct jffs2_inode_info *f, *dir_f;
464 struct jffs2_sb_info *c;
465 struct inode *inode;
466 struct jffs2_raw_inode *ri;
467 struct jffs2_raw_dirent *rd;
468 struct jffs2_full_dnode *fn;
469 struct jffs2_full_dirent *fd;
470 int namelen;
9fe4854c 471 uint32_t alloclen;
1da177e4
LT
472 int ret;
473
474 mode |= S_IFDIR;
475
476 ri = jffs2_alloc_raw_inode();
477 if (!ri)
478 return -ENOMEM;
182ec4ee 479
1da177e4
LT
480 c = JFFS2_SB_INFO(dir_i->i_sb);
481
182ec4ee
TG
482 /* Try to reserve enough space for both node and dirent.
483 * Just the node will do for now, though
1da177e4
LT
484 */
485 namelen = dentry->d_name.len;
9fe4854c
DW
486 ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL,
487 JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
488
489 if (ret) {
490 jffs2_free_raw_inode(ri);
491 return ret;
492 }
493
494 inode = jffs2_new_inode(dir_i, mode, ri);
495
496 if (IS_ERR(inode)) {
497 jffs2_free_raw_inode(ri);
498 jffs2_complete_reservation(c);
499 return PTR_ERR(inode);
500 }
501
502 inode->i_op = &jffs2_dir_inode_operations;
503 inode->i_fop = &jffs2_dir_operations;
504 /* Directories get nlink 2 at start */
505 inode->i_nlink = 2;
506
507 f = JFFS2_INODE_INFO(inode);
508
509 ri->data_crc = cpu_to_je32(0);
510 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 511
9fe4854c 512 fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL);
1da177e4
LT
513
514 jffs2_free_raw_inode(ri);
515
516 if (IS_ERR(fn)) {
517 /* Eeek. Wave bye bye */
518 up(&f->sem);
519 jffs2_complete_reservation(c);
520 jffs2_clear_inode(inode);
521 return PTR_ERR(fn);
522 }
182ec4ee 523 /* No data here. Only a metadata node, which will be
1da177e4
LT
524 obsoleted by the first data write
525 */
526 f->metadata = fn;
527 up(&f->sem);
528
529 jffs2_complete_reservation(c);
aa98d7cf
KK
530
531 ret = jffs2_init_security(inode, dir_i);
532 if (ret) {
533 jffs2_clear_inode(inode);
534 return ret;
535 }
536 ret = jffs2_init_acl(inode, dir_i);
537 if (ret) {
538 jffs2_clear_inode(inode);
539 return ret;
540 }
541
9fe4854c
DW
542 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
543 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
1da177e4
LT
544 if (ret) {
545 /* Eep. */
546 jffs2_clear_inode(inode);
547 return ret;
548 }
182ec4ee 549
1da177e4
LT
550 rd = jffs2_alloc_raw_dirent();
551 if (!rd) {
552 /* Argh. Now we treat it like a normal delete */
553 jffs2_complete_reservation(c);
554 jffs2_clear_inode(inode);
555 return -ENOMEM;
556 }
557
558 dir_f = JFFS2_INODE_INFO(dir_i);
559 down(&dir_f->sem);
560
561 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
562 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
563 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
564 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
565
566 rd->pino = cpu_to_je32(dir_i->i_ino);
567 rd->version = cpu_to_je32(++dir_f->highest_version);
568 rd->ino = cpu_to_je32(inode->i_ino);
569 rd->mctime = cpu_to_je32(get_seconds());
570 rd->nsize = namelen;
571 rd->type = DT_DIR;
572 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
573 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
574
9fe4854c 575 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
182ec4ee 576
1da177e4 577 if (IS_ERR(fd)) {
182ec4ee 578 /* dirent failed to write. Delete the inode normally
1da177e4
LT
579 as if it were the final unlink() */
580 jffs2_complete_reservation(c);
581 jffs2_free_raw_dirent(rd);
582 up(&dir_f->sem);
583 jffs2_clear_inode(inode);
584 return PTR_ERR(fd);
585 }
586
587 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
d8c76e6f 588 inc_nlink(dir_i);
1da177e4
LT
589
590 jffs2_free_raw_dirent(rd);
591
592 /* Link the fd into the inode's list, obsoleting an old
593 one if necessary. */
594 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
595
596 up(&dir_f->sem);
597 jffs2_complete_reservation(c);
598
599 d_instantiate(dentry, inode);
600 return 0;
601}
602
603static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
604{
605 struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
606 struct jffs2_full_dirent *fd;
607 int ret;
608
609 for (fd = f->dents ; fd; fd = fd->next) {
610 if (fd->ino)
611 return -ENOTEMPTY;
612 }
613 ret = jffs2_unlink(dir_i, dentry);
614 if (!ret)
9a53c3a7 615 drop_nlink(dir_i);
1da177e4
LT
616 return ret;
617}
618
265489f0 619static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, dev_t rdev)
1da177e4
LT
620{
621 struct jffs2_inode_info *f, *dir_f;
622 struct jffs2_sb_info *c;
623 struct inode *inode;
624 struct jffs2_raw_inode *ri;
625 struct jffs2_raw_dirent *rd;
626 struct jffs2_full_dnode *fn;
627 struct jffs2_full_dirent *fd;
628 int namelen;
aef9ab47 629 union jffs2_device_node dev;
1da177e4 630 int devlen = 0;
9fe4854c 631 uint32_t alloclen;
1da177e4
LT
632 int ret;
633
aef9ab47 634 if (!new_valid_dev(rdev))
1da177e4
LT
635 return -EINVAL;
636
637 ri = jffs2_alloc_raw_inode();
638 if (!ri)
639 return -ENOMEM;
182ec4ee 640
1da177e4 641 c = JFFS2_SB_INFO(dir_i->i_sb);
182ec4ee 642
aef9ab47
DW
643 if (S_ISBLK(mode) || S_ISCHR(mode))
644 devlen = jffs2_encode_dev(&dev, rdev);
182ec4ee
TG
645
646 /* Try to reserve enough space for both node and dirent.
647 * Just the node will do for now, though
1da177e4
LT
648 */
649 namelen = dentry->d_name.len;
9fe4854c 650 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &alloclen,
aef9ab47 651 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
652
653 if (ret) {
654 jffs2_free_raw_inode(ri);
655 return ret;
656 }
657
658 inode = jffs2_new_inode(dir_i, mode, ri);
659
660 if (IS_ERR(inode)) {
661 jffs2_free_raw_inode(ri);
662 jffs2_complete_reservation(c);
663 return PTR_ERR(inode);
664 }
665 inode->i_op = &jffs2_file_inode_operations;
666 init_special_inode(inode, inode->i_mode, rdev);
667
668 f = JFFS2_INODE_INFO(inode);
669
670 ri->dsize = ri->csize = cpu_to_je32(devlen);
671 ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
672 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
673
674 ri->compr = JFFS2_COMPR_NONE;
675 ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
676 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 677
9fe4854c 678 fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, ALLOC_NORMAL);
1da177e4
LT
679
680 jffs2_free_raw_inode(ri);
681
682 if (IS_ERR(fn)) {
683 /* Eeek. Wave bye bye */
684 up(&f->sem);
685 jffs2_complete_reservation(c);
686 jffs2_clear_inode(inode);
687 return PTR_ERR(fn);
688 }
182ec4ee 689 /* No data here. Only a metadata node, which will be
1da177e4
LT
690 obsoleted by the first data write
691 */
692 f->metadata = fn;
693 up(&f->sem);
694
695 jffs2_complete_reservation(c);
aa98d7cf
KK
696
697 ret = jffs2_init_security(inode, dir_i);
698 if (ret) {
699 jffs2_clear_inode(inode);
700 return ret;
701 }
702 ret = jffs2_init_acl(inode, dir_i);
703 if (ret) {
704 jffs2_clear_inode(inode);
705 return ret;
706 }
707
9fe4854c
DW
708 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
709 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
1da177e4
LT
710 if (ret) {
711 /* Eep. */
712 jffs2_clear_inode(inode);
713 return ret;
714 }
715
716 rd = jffs2_alloc_raw_dirent();
717 if (!rd) {
718 /* Argh. Now we treat it like a normal delete */
719 jffs2_complete_reservation(c);
720 jffs2_clear_inode(inode);
721 return -ENOMEM;
722 }
723
724 dir_f = JFFS2_INODE_INFO(dir_i);
725 down(&dir_f->sem);
726
727 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
728 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
729 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
730 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
731
732 rd->pino = cpu_to_je32(dir_i->i_ino);
733 rd->version = cpu_to_je32(++dir_f->highest_version);
734 rd->ino = cpu_to_je32(inode->i_ino);
735 rd->mctime = cpu_to_je32(get_seconds());
736 rd->nsize = namelen;
737
738 /* XXX: This is ugly. */
739 rd->type = (mode & S_IFMT) >> 12;
740
741 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
742 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
743
9fe4854c 744 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
182ec4ee 745
1da177e4 746 if (IS_ERR(fd)) {
182ec4ee 747 /* dirent failed to write. Delete the inode normally
1da177e4
LT
748 as if it were the final unlink() */
749 jffs2_complete_reservation(c);
750 jffs2_free_raw_dirent(rd);
751 up(&dir_f->sem);
752 jffs2_clear_inode(inode);
753 return PTR_ERR(fd);
754 }
755
756 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
757
758 jffs2_free_raw_dirent(rd);
759
760 /* Link the fd into the inode's list, obsoleting an old
761 one if necessary. */
762 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
763
764 up(&dir_f->sem);
765 jffs2_complete_reservation(c);
766
767 d_instantiate(dentry, inode);
768
769 return 0;
770}
771
772static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
773 struct inode *new_dir_i, struct dentry *new_dentry)
774{
775 int ret;
776 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
777 struct jffs2_inode_info *victim_f = NULL;
778 uint8_t type;
3a69e0cd 779 uint32_t now;
1da177e4 780
182ec4ee 781 /* The VFS will check for us and prevent trying to rename a
1da177e4
LT
782 * file over a directory and vice versa, but if it's a directory,
783 * the VFS can't check whether the victim is empty. The filesystem
784 * needs to do that for itself.
785 */
786 if (new_dentry->d_inode) {
787 victim_f = JFFS2_INODE_INFO(new_dentry->d_inode);
788 if (S_ISDIR(new_dentry->d_inode->i_mode)) {
789 struct jffs2_full_dirent *fd;
790
791 down(&victim_f->sem);
792 for (fd = victim_f->dents; fd; fd = fd->next) {
793 if (fd->ino) {
794 up(&victim_f->sem);
795 return -ENOTEMPTY;
796 }
797 }
798 up(&victim_f->sem);
799 }
800 }
801
802 /* XXX: We probably ought to alloc enough space for
182ec4ee 803 both nodes at the same time. Writing the new link,
1da177e4
LT
804 then getting -ENOSPC, is quite bad :)
805 */
806
807 /* Make a hard link */
182ec4ee 808
1da177e4
LT
809 /* XXX: This is ugly */
810 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
811 if (!type) type = DT_REG;
812
3a69e0cd 813 now = get_seconds();
182ec4ee 814 ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
1da177e4 815 old_dentry->d_inode->i_ino, type,
3a69e0cd 816 new_dentry->d_name.name, new_dentry->d_name.len, now);
1da177e4
LT
817
818 if (ret)
819 return ret;
820
821 if (victim_f) {
822 /* There was a victim. Kill it off nicely */
9a53c3a7 823 drop_nlink(new_dentry->d_inode);
1da177e4
LT
824 /* Don't oops if the victim was a dirent pointing to an
825 inode which didn't exist. */
826 if (victim_f->inocache) {
827 down(&victim_f->sem);
828 victim_f->inocache->nlink--;
829 up(&victim_f->sem);
830 }
831 }
832
182ec4ee 833 /* If it was a directory we moved, and there was no victim,
1da177e4
LT
834 increase i_nlink on its new parent */
835 if (S_ISDIR(old_dentry->d_inode->i_mode) && !victim_f)
d8c76e6f 836 inc_nlink(new_dir_i);
1da177e4
LT
837
838 /* Unlink the original */
182ec4ee 839 ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
3a69e0cd 840 old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
1da177e4
LT
841
842 /* We don't touch inode->i_nlink */
843
844 if (ret) {
845 /* Oh shit. We really ought to make a single node which can do both atomically */
846 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
847 down(&f->sem);
d8c76e6f 848 inc_nlink(old_dentry->d_inode);
1da177e4
LT
849 if (f->inocache)
850 f->inocache->nlink++;
851 up(&f->sem);
852
853 printk(KERN_NOTICE "jffs2_rename(): Link succeeded, unlink failed (err %d). You now have a hard link\n", ret);
854 /* Might as well let the VFS know */
855 d_instantiate(new_dentry, old_dentry->d_inode);
856 atomic_inc(&old_dentry->d_inode->i_count);
3a69e0cd 857 new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now);
1da177e4
LT
858 return ret;
859 }
860
861 if (S_ISDIR(old_dentry->d_inode->i_mode))
9a53c3a7 862 drop_nlink(old_dir_i);
1da177e4 863
3a69e0cd
AB
864 new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
865
1da177e4
LT
866 return 0;
867}
868