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