jffs2: Fix in-core inode leaks on error paths
[deliverable/linux.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 362 jffs2_complete_reservation(c);
f324e4cb
DW
363 ret = PTR_ERR(fn);
364 goto fail;
1da177e4 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 372 jffs2_complete_reservation(c);
f324e4cb
DW
373 ret = -ENOMEM;
374 goto fail;
32f1a95d
AB
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);
f324e4cb
DW
389 if (ret)
390 goto fail;
391
cfc8dc6f 392 ret = jffs2_init_acl_post(inode);
f324e4cb
DW
393 if (ret)
394 goto fail;
aa98d7cf 395
9fe4854c
DW
396 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
397 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
f324e4cb
DW
398 if (ret)
399 goto fail;
1da177e4
LT
400
401 rd = jffs2_alloc_raw_dirent();
402 if (!rd) {
403 /* Argh. Now we treat it like a normal delete */
404 jffs2_complete_reservation(c);
f324e4cb
DW
405 ret = -ENOMEM;
406 goto fail;
1da177e4
LT
407 }
408
409 dir_f = JFFS2_INODE_INFO(dir_i);
ced22070 410 mutex_lock(&dir_f->sem);
1da177e4
LT
411
412 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
413 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
414 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
415 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
416
417 rd->pino = cpu_to_je32(dir_i->i_ino);
418 rd->version = cpu_to_je32(++dir_f->highest_version);
419 rd->ino = cpu_to_je32(inode->i_ino);
420 rd->mctime = cpu_to_je32(get_seconds());
421 rd->nsize = namelen;
422 rd->type = DT_LNK;
423 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
424 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
425
9fe4854c 426 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
1da177e4
LT
427
428 if (IS_ERR(fd)) {
182ec4ee 429 /* dirent failed to write. Delete the inode normally
1da177e4
LT
430 as if it were the final unlink() */
431 jffs2_complete_reservation(c);
432 jffs2_free_raw_dirent(rd);
ced22070 433 mutex_unlock(&dir_f->sem);
f324e4cb
DW
434 ret = PTR_ERR(fd);
435 goto fail;
1da177e4
LT
436 }
437
438 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
439
440 jffs2_free_raw_dirent(rd);
441
442 /* Link the fd into the inode's list, obsoleting an old
443 one if necessary. */
444 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
445
ced22070 446 mutex_unlock(&dir_f->sem);
1da177e4
LT
447 jffs2_complete_reservation(c);
448
449 d_instantiate(dentry, inode);
450 return 0;
f324e4cb
DW
451
452 fail:
453 make_bad_inode(inode);
454 iput(inode);
455 return ret;
1da177e4
LT
456}
457
458
459static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode)
460{
461 struct jffs2_inode_info *f, *dir_f;
462 struct jffs2_sb_info *c;
463 struct inode *inode;
464 struct jffs2_raw_inode *ri;
465 struct jffs2_raw_dirent *rd;
466 struct jffs2_full_dnode *fn;
467 struct jffs2_full_dirent *fd;
468 int namelen;
9fe4854c 469 uint32_t alloclen;
1da177e4
LT
470 int ret;
471
472 mode |= S_IFDIR;
473
474 ri = jffs2_alloc_raw_inode();
475 if (!ri)
476 return -ENOMEM;
182ec4ee 477
1da177e4
LT
478 c = JFFS2_SB_INFO(dir_i->i_sb);
479
182ec4ee
TG
480 /* Try to reserve enough space for both node and dirent.
481 * Just the node will do for now, though
1da177e4
LT
482 */
483 namelen = dentry->d_name.len;
9fe4854c
DW
484 ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL,
485 JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
486
487 if (ret) {
488 jffs2_free_raw_inode(ri);
489 return ret;
490 }
491
cfc8dc6f 492 inode = jffs2_new_inode(dir_i, mode, ri);
1da177e4
LT
493
494 if (IS_ERR(inode)) {
495 jffs2_free_raw_inode(ri);
496 jffs2_complete_reservation(c);
497 return PTR_ERR(inode);
498 }
499
500 inode->i_op = &jffs2_dir_inode_operations;
501 inode->i_fop = &jffs2_dir_operations;
1da177e4
LT
502
503 f = JFFS2_INODE_INFO(inode);
504
27c72b04
DW
505 /* Directories get nlink 2 at start */
506 inode->i_nlink = 2;
507 /* but ic->pino_nlink is the parent ino# */
508 f->inocache->pino_nlink = dir_i->i_ino;
509
1da177e4
LT
510 ri->data_crc = cpu_to_je32(0);
511 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 512
9fe4854c 513 fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL);
1da177e4
LT
514
515 jffs2_free_raw_inode(ri);
516
517 if (IS_ERR(fn)) {
518 /* Eeek. Wave bye bye */
ced22070 519 mutex_unlock(&f->sem);
1da177e4 520 jffs2_complete_reservation(c);
f324e4cb
DW
521 ret = PTR_ERR(fn);
522 goto fail;
1da177e4 523 }
182ec4ee 524 /* No data here. Only a metadata node, which will be
1da177e4
LT
525 obsoleted by the first data write
526 */
527 f->metadata = fn;
ced22070 528 mutex_unlock(&f->sem);
1da177e4
LT
529
530 jffs2_complete_reservation(c);
aa98d7cf
KK
531
532 ret = jffs2_init_security(inode, dir_i);
f324e4cb
DW
533 if (ret)
534 goto fail;
535
cfc8dc6f 536 ret = jffs2_init_acl_post(inode);
f324e4cb
DW
537 if (ret)
538 goto fail;
aa98d7cf 539
9fe4854c
DW
540 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
541 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
f324e4cb
DW
542 if (ret)
543 goto fail;
182ec4ee 544
1da177e4
LT
545 rd = jffs2_alloc_raw_dirent();
546 if (!rd) {
547 /* Argh. Now we treat it like a normal delete */
548 jffs2_complete_reservation(c);
f324e4cb
DW
549 ret = -ENOMEM;
550 goto fail;
1da177e4
LT
551 }
552
553 dir_f = JFFS2_INODE_INFO(dir_i);
ced22070 554 mutex_lock(&dir_f->sem);
1da177e4
LT
555
556 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
557 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
558 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
559 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
560
561 rd->pino = cpu_to_je32(dir_i->i_ino);
562 rd->version = cpu_to_je32(++dir_f->highest_version);
563 rd->ino = cpu_to_je32(inode->i_ino);
564 rd->mctime = cpu_to_je32(get_seconds());
565 rd->nsize = namelen;
566 rd->type = DT_DIR;
567 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
568 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
569
9fe4854c 570 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
182ec4ee 571
1da177e4 572 if (IS_ERR(fd)) {
182ec4ee 573 /* dirent failed to write. Delete the inode normally
1da177e4
LT
574 as if it were the final unlink() */
575 jffs2_complete_reservation(c);
576 jffs2_free_raw_dirent(rd);
ced22070 577 mutex_unlock(&dir_f->sem);
f324e4cb
DW
578 ret = PTR_ERR(fd);
579 goto fail;
1da177e4
LT
580 }
581
582 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
d8c76e6f 583 inc_nlink(dir_i);
1da177e4
LT
584
585 jffs2_free_raw_dirent(rd);
586
587 /* Link the fd into the inode's list, obsoleting an old
588 one if necessary. */
589 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
590
ced22070 591 mutex_unlock(&dir_f->sem);
1da177e4
LT
592 jffs2_complete_reservation(c);
593
594 d_instantiate(dentry, inode);
595 return 0;
f324e4cb
DW
596
597 fail:
598 make_bad_inode(inode);
599 iput(inode);
600 return ret;
1da177e4
LT
601}
602
603static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
604{
27c72b04
DW
605 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
606 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
1da177e4
LT
607 struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
608 struct jffs2_full_dirent *fd;
609 int ret;
27c72b04 610 uint32_t now = get_seconds();
1da177e4
LT
611
612 for (fd = f->dents ; fd; fd = fd->next) {
613 if (fd->ino)
614 return -ENOTEMPTY;
615 }
27c72b04
DW
616
617 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
618 dentry->d_name.len, f, now);
619 if (!ret) {
620 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
621 clear_nlink(dentry->d_inode);
9a53c3a7 622 drop_nlink(dir_i);
27c72b04 623 }
1da177e4
LT
624 return ret;
625}
626
265489f0 627static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, dev_t rdev)
1da177e4
LT
628{
629 struct jffs2_inode_info *f, *dir_f;
630 struct jffs2_sb_info *c;
631 struct inode *inode;
632 struct jffs2_raw_inode *ri;
633 struct jffs2_raw_dirent *rd;
634 struct jffs2_full_dnode *fn;
635 struct jffs2_full_dirent *fd;
636 int namelen;
aef9ab47 637 union jffs2_device_node dev;
1da177e4 638 int devlen = 0;
9fe4854c 639 uint32_t alloclen;
1da177e4
LT
640 int ret;
641
aef9ab47 642 if (!new_valid_dev(rdev))
1da177e4
LT
643 return -EINVAL;
644
645 ri = jffs2_alloc_raw_inode();
646 if (!ri)
647 return -ENOMEM;
182ec4ee 648
1da177e4 649 c = JFFS2_SB_INFO(dir_i->i_sb);
182ec4ee 650
aef9ab47
DW
651 if (S_ISBLK(mode) || S_ISCHR(mode))
652 devlen = jffs2_encode_dev(&dev, rdev);
182ec4ee
TG
653
654 /* Try to reserve enough space for both node and dirent.
655 * Just the node will do for now, though
1da177e4
LT
656 */
657 namelen = dentry->d_name.len;
9fe4854c 658 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &alloclen,
aef9ab47 659 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
660
661 if (ret) {
662 jffs2_free_raw_inode(ri);
663 return ret;
664 }
665
cfc8dc6f 666 inode = jffs2_new_inode(dir_i, mode, ri);
1da177e4
LT
667
668 if (IS_ERR(inode)) {
669 jffs2_free_raw_inode(ri);
670 jffs2_complete_reservation(c);
671 return PTR_ERR(inode);
672 }
673 inode->i_op = &jffs2_file_inode_operations;
674 init_special_inode(inode, inode->i_mode, rdev);
675
676 f = JFFS2_INODE_INFO(inode);
677
678 ri->dsize = ri->csize = cpu_to_je32(devlen);
679 ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
680 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
681
682 ri->compr = JFFS2_COMPR_NONE;
683 ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
684 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 685
9fe4854c 686 fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, ALLOC_NORMAL);
1da177e4
LT
687
688 jffs2_free_raw_inode(ri);
689
690 if (IS_ERR(fn)) {
691 /* Eeek. Wave bye bye */
ced22070 692 mutex_unlock(&f->sem);
1da177e4 693 jffs2_complete_reservation(c);
f324e4cb
DW
694 ret = PTR_ERR(fn);
695 goto fail;
1da177e4 696 }
182ec4ee 697 /* No data here. Only a metadata node, which will be
1da177e4
LT
698 obsoleted by the first data write
699 */
700 f->metadata = fn;
ced22070 701 mutex_unlock(&f->sem);
1da177e4
LT
702
703 jffs2_complete_reservation(c);
aa98d7cf
KK
704
705 ret = jffs2_init_security(inode, dir_i);
f324e4cb
DW
706 if (ret)
707 goto fail;
708
cfc8dc6f 709 ret = jffs2_init_acl_post(inode);
f324e4cb
DW
710 if (ret)
711 goto fail;
aa98d7cf 712
9fe4854c
DW
713 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
714 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
f324e4cb
DW
715 if (ret)
716 goto fail;
1da177e4
LT
717
718 rd = jffs2_alloc_raw_dirent();
719 if (!rd) {
720 /* Argh. Now we treat it like a normal delete */
721 jffs2_complete_reservation(c);
f324e4cb
DW
722 ret = -ENOMEM;
723 goto fail;
1da177e4
LT
724 }
725
726 dir_f = JFFS2_INODE_INFO(dir_i);
ced22070 727 mutex_lock(&dir_f->sem);
1da177e4
LT
728
729 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
730 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
731 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
732 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
733
734 rd->pino = cpu_to_je32(dir_i->i_ino);
735 rd->version = cpu_to_je32(++dir_f->highest_version);
736 rd->ino = cpu_to_je32(inode->i_ino);
737 rd->mctime = cpu_to_je32(get_seconds());
738 rd->nsize = namelen;
739
740 /* XXX: This is ugly. */
741 rd->type = (mode & S_IFMT) >> 12;
742
743 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
744 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
745
9fe4854c 746 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
182ec4ee 747
1da177e4 748 if (IS_ERR(fd)) {
182ec4ee 749 /* dirent failed to write. Delete the inode normally
1da177e4
LT
750 as if it were the final unlink() */
751 jffs2_complete_reservation(c);
752 jffs2_free_raw_dirent(rd);
ced22070 753 mutex_unlock(&dir_f->sem);
f324e4cb
DW
754 ret = PTR_ERR(fd);
755 goto fail;
1da177e4
LT
756 }
757
758 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
759
760 jffs2_free_raw_dirent(rd);
761
762 /* Link the fd into the inode's list, obsoleting an old
763 one if necessary. */
764 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
765
ced22070 766 mutex_unlock(&dir_f->sem);
1da177e4
LT
767 jffs2_complete_reservation(c);
768
769 d_instantiate(dentry, inode);
770
771 return 0;
f324e4cb
DW
772
773 fail:
774 make_bad_inode(inode);
775 iput(inode);
776 return ret;
1da177e4
LT
777}
778
779static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
ef53cb02 780 struct inode *new_dir_i, struct dentry *new_dentry)
1da177e4
LT
781{
782 int ret;
783 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
784 struct jffs2_inode_info *victim_f = NULL;
785 uint8_t type;
3a69e0cd 786 uint32_t now;
1da177e4 787
182ec4ee 788 /* The VFS will check for us and prevent trying to rename a
1da177e4
LT
789 * file over a directory and vice versa, but if it's a directory,
790 * the VFS can't check whether the victim is empty. The filesystem
791 * needs to do that for itself.
792 */
793 if (new_dentry->d_inode) {
794 victim_f = JFFS2_INODE_INFO(new_dentry->d_inode);
795 if (S_ISDIR(new_dentry->d_inode->i_mode)) {
796 struct jffs2_full_dirent *fd;
797
ced22070 798 mutex_lock(&victim_f->sem);
1da177e4
LT
799 for (fd = victim_f->dents; fd; fd = fd->next) {
800 if (fd->ino) {
ced22070 801 mutex_unlock(&victim_f->sem);
1da177e4
LT
802 return -ENOTEMPTY;
803 }
804 }
ced22070 805 mutex_unlock(&victim_f->sem);
1da177e4
LT
806 }
807 }
808
809 /* XXX: We probably ought to alloc enough space for
182ec4ee 810 both nodes at the same time. Writing the new link,
1da177e4
LT
811 then getting -ENOSPC, is quite bad :)
812 */
813
814 /* Make a hard link */
182ec4ee 815
1da177e4
LT
816 /* XXX: This is ugly */
817 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
818 if (!type) type = DT_REG;
819
3a69e0cd 820 now = get_seconds();
182ec4ee 821 ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
1da177e4 822 old_dentry->d_inode->i_ino, type,
3a69e0cd 823 new_dentry->d_name.name, new_dentry->d_name.len, now);
1da177e4
LT
824
825 if (ret)
826 return ret;
827
828 if (victim_f) {
829 /* There was a victim. Kill it off nicely */
9a53c3a7 830 drop_nlink(new_dentry->d_inode);
1da177e4
LT
831 /* Don't oops if the victim was a dirent pointing to an
832 inode which didn't exist. */
833 if (victim_f->inocache) {
ced22070 834 mutex_lock(&victim_f->sem);
27c72b04
DW
835 if (S_ISDIR(new_dentry->d_inode->i_mode))
836 victim_f->inocache->pino_nlink = 0;
837 else
838 victim_f->inocache->pino_nlink--;
ced22070 839 mutex_unlock(&victim_f->sem);
1da177e4
LT
840 }
841 }
842
182ec4ee 843 /* If it was a directory we moved, and there was no victim,
1da177e4
LT
844 increase i_nlink on its new parent */
845 if (S_ISDIR(old_dentry->d_inode->i_mode) && !victim_f)
d8c76e6f 846 inc_nlink(new_dir_i);
1da177e4
LT
847
848 /* Unlink the original */
182ec4ee 849 ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
3a69e0cd 850 old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
1da177e4
LT
851
852 /* We don't touch inode->i_nlink */
853
854 if (ret) {
855 /* Oh shit. We really ought to make a single node which can do both atomically */
856 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
ced22070 857 mutex_lock(&f->sem);
d8c76e6f 858 inc_nlink(old_dentry->d_inode);
27c72b04
DW
859 if (f->inocache && !S_ISDIR(old_dentry->d_inode->i_mode))
860 f->inocache->pino_nlink++;
ced22070 861 mutex_unlock(&f->sem);
1da177e4
LT
862
863 printk(KERN_NOTICE "jffs2_rename(): Link succeeded, unlink failed (err %d). You now have a hard link\n", ret);
864 /* Might as well let the VFS know */
865 d_instantiate(new_dentry, old_dentry->d_inode);
866 atomic_inc(&old_dentry->d_inode->i_count);
3a69e0cd 867 new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now);
1da177e4
LT
868 return ret;
869 }
870
871 if (S_ISDIR(old_dentry->d_inode->i_mode))
9a53c3a7 872 drop_nlink(old_dir_i);
1da177e4 873
3a69e0cd
AB
874 new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
875
1da177e4
LT
876 return 0;
877}
878
This page took 0.387229 seconds and 5 git commands to generate.