Revert "kconfig: tristate choices with mixed tristate and boolean values"
[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,
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;
9ed437c5 185 struct posix_acl *acl;
1da177e4
LT
186 int ret;
187
188 ri = jffs2_alloc_raw_inode();
189 if (!ri)
190 return -ENOMEM;
182ec4ee 191
1da177e4
LT
192 c = JFFS2_SB_INFO(dir_i->i_sb);
193
194 D1(printk(KERN_DEBUG "jffs2_create()\n"));
195
9ed437c5 196 inode = jffs2_new_inode(dir_i, mode, ri, &acl);
1da177e4
LT
197
198 if (IS_ERR(inode)) {
199 D1(printk(KERN_DEBUG "jffs2_new_inode() failed\n"));
200 jffs2_free_raw_inode(ri);
201 return PTR_ERR(inode);
202 }
203
204 inode->i_op = &jffs2_file_inode_operations;
205 inode->i_fop = &jffs2_file_operations;
206 inode->i_mapping->a_ops = &jffs2_file_address_operations;
207 inode->i_mapping->nrpages = 0;
208
209 f = JFFS2_INODE_INFO(inode);
210 dir_f = JFFS2_INODE_INFO(dir_i);
211
182ec4ee 212 ret = jffs2_do_create(c, dir_f, f, ri,
1da177e4
LT
213 dentry->d_name.name, dentry->d_name.len);
214
aa98d7cf 215 if (ret)
9ed437c5 216 goto fail_acl;
aa98d7cf
KK
217
218 ret = jffs2_init_security(inode, dir_i);
219 if (ret)
9ed437c5
DW
220 goto fail_acl;
221 ret = jffs2_init_acl(inode, acl);
aa98d7cf
KK
222 if (ret)
223 goto fail;
1da177e4
LT
224
225 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(ri->ctime));
226
227 jffs2_free_raw_inode(ri);
228 d_instantiate(dentry, inode);
229
230 D1(printk(KERN_DEBUG "jffs2_create: Created ino #%lu with mode %o, nlink %d(%d). nrpages %ld\n",
231 inode->i_ino, inode->i_mode, inode->i_nlink, f->inocache->nlink, inode->i_mapping->nrpages));
232 return 0;
aa98d7cf 233
9ed437c5
DW
234 fail_acl:
235 posix_acl_release(acl);
aa98d7cf
KK
236 fail:
237 make_bad_inode(inode);
238 iput(inode);
239 jffs2_free_raw_inode(ri);
240 return ret;
1da177e4
LT
241}
242
243/***********************************************************************/
244
245
246static int jffs2_unlink(struct inode *dir_i, struct dentry *dentry)
247{
248 struct jffs2_sb_info *c = JFFS2_SB_INFO(dir_i->i_sb);
249 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
250 struct jffs2_inode_info *dead_f = JFFS2_INODE_INFO(dentry->d_inode);
251 int ret;
3a69e0cd 252 uint32_t now = get_seconds();
1da177e4 253
182ec4ee 254 ret = jffs2_do_unlink(c, dir_f, dentry->d_name.name,
3a69e0cd 255 dentry->d_name.len, dead_f, now);
1da177e4
LT
256 if (dead_f->inocache)
257 dentry->d_inode->i_nlink = dead_f->inocache->nlink;
3a69e0cd
AB
258 if (!ret)
259 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
1da177e4
LT
260 return ret;
261}
262/***********************************************************************/
263
264
265static int jffs2_link (struct dentry *old_dentry, struct inode *dir_i, struct dentry *dentry)
266{
267 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dentry->d_inode->i_sb);
268 struct jffs2_inode_info *f = JFFS2_INODE_INFO(old_dentry->d_inode);
269 struct jffs2_inode_info *dir_f = JFFS2_INODE_INFO(dir_i);
270 int ret;
271 uint8_t type;
3a69e0cd 272 uint32_t now;
1da177e4
LT
273
274 /* Don't let people make hard links to bad inodes. */
275 if (!f->inocache)
276 return -EIO;
277
278 if (S_ISDIR(old_dentry->d_inode->i_mode))
279 return -EPERM;
280
281 /* XXX: This is ugly */
282 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
283 if (!type) type = DT_REG;
284
3a69e0cd
AB
285 now = get_seconds();
286 ret = jffs2_do_link(c, dir_f, f->inocache->ino, type, dentry->d_name.name, dentry->d_name.len, now);
1da177e4
LT
287
288 if (!ret) {
289 down(&f->sem);
290 old_dentry->d_inode->i_nlink = ++f->inocache->nlink;
291 up(&f->sem);
292 d_instantiate(dentry, old_dentry->d_inode);
3a69e0cd 293 dir_i->i_mtime = dir_i->i_ctime = ITIME(now);
1da177e4
LT
294 atomic_inc(&old_dentry->d_inode->i_count);
295 }
296 return ret;
297}
298
299/***********************************************************************/
300
301static int jffs2_symlink (struct inode *dir_i, struct dentry *dentry, const char *target)
302{
303 struct jffs2_inode_info *f, *dir_f;
304 struct jffs2_sb_info *c;
305 struct inode *inode;
306 struct jffs2_raw_inode *ri;
307 struct jffs2_raw_dirent *rd;
308 struct jffs2_full_dnode *fn;
309 struct jffs2_full_dirent *fd;
310 int namelen;
9fe4854c 311 uint32_t alloclen;
9ed437c5 312 struct posix_acl *acl;
32f1a95d 313 int ret, targetlen = strlen(target);
1da177e4
LT
314
315 /* FIXME: If you care. We'd need to use frags for the target
316 if it grows much more than this */
32f1a95d 317 if (targetlen > 254)
1da177e4
LT
318 return -EINVAL;
319
320 ri = jffs2_alloc_raw_inode();
321
322 if (!ri)
323 return -ENOMEM;
182ec4ee 324
1da177e4 325 c = JFFS2_SB_INFO(dir_i->i_sb);
182ec4ee
TG
326
327 /* Try to reserve enough space for both node and dirent.
328 * Just the node will do for now, though
1da177e4
LT
329 */
330 namelen = dentry->d_name.len;
9fe4854c
DW
331 ret = jffs2_reserve_space(c, sizeof(*ri) + targetlen, &alloclen,
332 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
333
334 if (ret) {
335 jffs2_free_raw_inode(ri);
336 return ret;
337 }
338
9ed437c5 339 inode = jffs2_new_inode(dir_i, S_IFLNK | S_IRWXUGO, ri, &acl);
1da177e4
LT
340
341 if (IS_ERR(inode)) {
342 jffs2_free_raw_inode(ri);
343 jffs2_complete_reservation(c);
344 return PTR_ERR(inode);
345 }
346
347 inode->i_op = &jffs2_symlink_inode_operations;
348
349 f = JFFS2_INODE_INFO(inode);
350
32f1a95d 351 inode->i_size = targetlen;
1da177e4
LT
352 ri->isize = ri->dsize = ri->csize = cpu_to_je32(inode->i_size);
353 ri->totlen = cpu_to_je32(sizeof(*ri) + inode->i_size);
354 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
355
356 ri->compr = JFFS2_COMPR_NONE;
32f1a95d 357 ri->data_crc = cpu_to_je32(crc32(0, target, targetlen));
1da177e4 358 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 359
9fe4854c 360 fn = jffs2_write_dnode(c, f, ri, target, targetlen, ALLOC_NORMAL);
1da177e4
LT
361
362 jffs2_free_raw_inode(ri);
363
364 if (IS_ERR(fn)) {
365 /* Eeek. Wave bye bye */
366 up(&f->sem);
367 jffs2_complete_reservation(c);
368 jffs2_clear_inode(inode);
9ed437c5 369 posix_acl_release(acl);
1da177e4
LT
370 return PTR_ERR(fn);
371 }
32f1a95d 372
2b79adcc
AB
373 /* We use f->target field to store the target path. */
374 f->target = kmalloc(targetlen + 1, GFP_KERNEL);
375 if (!f->target) {
32f1a95d
AB
376 printk(KERN_WARNING "Can't allocate %d bytes of memory\n", targetlen + 1);
377 up(&f->sem);
378 jffs2_complete_reservation(c);
379 jffs2_clear_inode(inode);
9ed437c5 380 posix_acl_release(acl);
32f1a95d
AB
381 return -ENOMEM;
382 }
383
2b79adcc
AB
384 memcpy(f->target, target, targetlen + 1);
385 D1(printk(KERN_DEBUG "jffs2_symlink: symlink's target '%s' cached\n", (char *)f->target));
32f1a95d 386
182ec4ee 387 /* No data here. Only a metadata node, which will be
1da177e4
LT
388 obsoleted by the first data write
389 */
390 f->metadata = fn;
391 up(&f->sem);
392
393 jffs2_complete_reservation(c);
aa98d7cf
KK
394
395 ret = jffs2_init_security(inode, dir_i);
396 if (ret) {
397 jffs2_clear_inode(inode);
9ed437c5 398 posix_acl_release(acl);
aa98d7cf
KK
399 return ret;
400 }
9ed437c5 401 ret = jffs2_init_acl(inode, acl);
aa98d7cf
KK
402 if (ret) {
403 jffs2_clear_inode(inode);
404 return ret;
405 }
406
9fe4854c
DW
407 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
408 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
1da177e4
LT
409 if (ret) {
410 /* Eep. */
411 jffs2_clear_inode(inode);
412 return ret;
413 }
414
415 rd = jffs2_alloc_raw_dirent();
416 if (!rd) {
417 /* Argh. Now we treat it like a normal delete */
418 jffs2_complete_reservation(c);
419 jffs2_clear_inode(inode);
420 return -ENOMEM;
421 }
422
423 dir_f = JFFS2_INODE_INFO(dir_i);
424 down(&dir_f->sem);
425
426 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
427 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
428 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
429 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
430
431 rd->pino = cpu_to_je32(dir_i->i_ino);
432 rd->version = cpu_to_je32(++dir_f->highest_version);
433 rd->ino = cpu_to_je32(inode->i_ino);
434 rd->mctime = cpu_to_je32(get_seconds());
435 rd->nsize = namelen;
436 rd->type = DT_LNK;
437 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
438 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
439
9fe4854c 440 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
1da177e4
LT
441
442 if (IS_ERR(fd)) {
182ec4ee 443 /* dirent failed to write. Delete the inode normally
1da177e4
LT
444 as if it were the final unlink() */
445 jffs2_complete_reservation(c);
446 jffs2_free_raw_dirent(rd);
447 up(&dir_f->sem);
448 jffs2_clear_inode(inode);
449 return PTR_ERR(fd);
450 }
451
452 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
453
454 jffs2_free_raw_dirent(rd);
455
456 /* Link the fd into the inode's list, obsoleting an old
457 one if necessary. */
458 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
459
460 up(&dir_f->sem);
461 jffs2_complete_reservation(c);
462
463 d_instantiate(dentry, inode);
464 return 0;
465}
466
467
468static int jffs2_mkdir (struct inode *dir_i, struct dentry *dentry, int mode)
469{
470 struct jffs2_inode_info *f, *dir_f;
471 struct jffs2_sb_info *c;
472 struct inode *inode;
473 struct jffs2_raw_inode *ri;
474 struct jffs2_raw_dirent *rd;
475 struct jffs2_full_dnode *fn;
476 struct jffs2_full_dirent *fd;
477 int namelen;
9fe4854c 478 uint32_t alloclen;
9ed437c5 479 struct posix_acl *acl;
1da177e4
LT
480 int ret;
481
482 mode |= S_IFDIR;
483
484 ri = jffs2_alloc_raw_inode();
485 if (!ri)
486 return -ENOMEM;
182ec4ee 487
1da177e4
LT
488 c = JFFS2_SB_INFO(dir_i->i_sb);
489
182ec4ee
TG
490 /* Try to reserve enough space for both node and dirent.
491 * Just the node will do for now, though
1da177e4
LT
492 */
493 namelen = dentry->d_name.len;
9fe4854c
DW
494 ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL,
495 JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
496
497 if (ret) {
498 jffs2_free_raw_inode(ri);
499 return ret;
500 }
501
9ed437c5 502 inode = jffs2_new_inode(dir_i, mode, ri, &acl);
1da177e4
LT
503
504 if (IS_ERR(inode)) {
505 jffs2_free_raw_inode(ri);
506 jffs2_complete_reservation(c);
507 return PTR_ERR(inode);
508 }
509
510 inode->i_op = &jffs2_dir_inode_operations;
511 inode->i_fop = &jffs2_dir_operations;
512 /* Directories get nlink 2 at start */
513 inode->i_nlink = 2;
514
515 f = JFFS2_INODE_INFO(inode);
516
517 ri->data_crc = cpu_to_je32(0);
518 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 519
9fe4854c 520 fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL);
1da177e4
LT
521
522 jffs2_free_raw_inode(ri);
523
524 if (IS_ERR(fn)) {
525 /* Eeek. Wave bye bye */
526 up(&f->sem);
527 jffs2_complete_reservation(c);
528 jffs2_clear_inode(inode);
9ed437c5 529 posix_acl_release(acl);
1da177e4
LT
530 return PTR_ERR(fn);
531 }
182ec4ee 532 /* No data here. Only a metadata node, which will be
1da177e4
LT
533 obsoleted by the first data write
534 */
535 f->metadata = fn;
536 up(&f->sem);
537
538 jffs2_complete_reservation(c);
aa98d7cf
KK
539
540 ret = jffs2_init_security(inode, dir_i);
541 if (ret) {
542 jffs2_clear_inode(inode);
9ed437c5 543 posix_acl_release(acl);
aa98d7cf
KK
544 return ret;
545 }
9ed437c5 546 ret = jffs2_init_acl(inode, acl);
aa98d7cf
KK
547 if (ret) {
548 jffs2_clear_inode(inode);
549 return ret;
550 }
551
9fe4854c
DW
552 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
553 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
1da177e4
LT
554 if (ret) {
555 /* Eep. */
556 jffs2_clear_inode(inode);
557 return ret;
558 }
182ec4ee 559
1da177e4
LT
560 rd = jffs2_alloc_raw_dirent();
561 if (!rd) {
562 /* Argh. Now we treat it like a normal delete */
563 jffs2_complete_reservation(c);
564 jffs2_clear_inode(inode);
565 return -ENOMEM;
566 }
567
568 dir_f = JFFS2_INODE_INFO(dir_i);
569 down(&dir_f->sem);
570
571 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
572 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
573 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
574 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
575
576 rd->pino = cpu_to_je32(dir_i->i_ino);
577 rd->version = cpu_to_je32(++dir_f->highest_version);
578 rd->ino = cpu_to_je32(inode->i_ino);
579 rd->mctime = cpu_to_je32(get_seconds());
580 rd->nsize = namelen;
581 rd->type = DT_DIR;
582 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
583 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
584
9fe4854c 585 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
182ec4ee 586
1da177e4 587 if (IS_ERR(fd)) {
182ec4ee 588 /* dirent failed to write. Delete the inode normally
1da177e4
LT
589 as if it were the final unlink() */
590 jffs2_complete_reservation(c);
591 jffs2_free_raw_dirent(rd);
592 up(&dir_f->sem);
593 jffs2_clear_inode(inode);
594 return PTR_ERR(fd);
595 }
596
597 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
d8c76e6f 598 inc_nlink(dir_i);
1da177e4
LT
599
600 jffs2_free_raw_dirent(rd);
601
602 /* Link the fd into the inode's list, obsoleting an old
603 one if necessary. */
604 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
605
606 up(&dir_f->sem);
607 jffs2_complete_reservation(c);
608
609 d_instantiate(dentry, inode);
610 return 0;
611}
612
613static int jffs2_rmdir (struct inode *dir_i, struct dentry *dentry)
614{
615 struct jffs2_inode_info *f = JFFS2_INODE_INFO(dentry->d_inode);
616 struct jffs2_full_dirent *fd;
617 int ret;
618
619 for (fd = f->dents ; fd; fd = fd->next) {
620 if (fd->ino)
621 return -ENOTEMPTY;
622 }
623 ret = jffs2_unlink(dir_i, dentry);
624 if (!ret)
9a53c3a7 625 drop_nlink(dir_i);
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;
9ed437c5 642 struct posix_acl *acl;
1da177e4
LT
643 int ret;
644
aef9ab47 645 if (!new_valid_dev(rdev))
1da177e4
LT
646 return -EINVAL;
647
648 ri = jffs2_alloc_raw_inode();
649 if (!ri)
650 return -ENOMEM;
182ec4ee 651
1da177e4 652 c = JFFS2_SB_INFO(dir_i->i_sb);
182ec4ee 653
aef9ab47
DW
654 if (S_ISBLK(mode) || S_ISCHR(mode))
655 devlen = jffs2_encode_dev(&dev, rdev);
182ec4ee
TG
656
657 /* Try to reserve enough space for both node and dirent.
658 * Just the node will do for now, though
1da177e4
LT
659 */
660 namelen = dentry->d_name.len;
9fe4854c 661 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &alloclen,
aef9ab47 662 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
1da177e4
LT
663
664 if (ret) {
665 jffs2_free_raw_inode(ri);
666 return ret;
667 }
668
9ed437c5 669 inode = jffs2_new_inode(dir_i, mode, ri, &acl);
1da177e4
LT
670
671 if (IS_ERR(inode)) {
672 jffs2_free_raw_inode(ri);
673 jffs2_complete_reservation(c);
674 return PTR_ERR(inode);
675 }
676 inode->i_op = &jffs2_file_inode_operations;
677 init_special_inode(inode, inode->i_mode, rdev);
678
679 f = JFFS2_INODE_INFO(inode);
680
681 ri->dsize = ri->csize = cpu_to_je32(devlen);
682 ri->totlen = cpu_to_je32(sizeof(*ri) + devlen);
683 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
684
685 ri->compr = JFFS2_COMPR_NONE;
686 ri->data_crc = cpu_to_je32(crc32(0, &dev, devlen));
687 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
182ec4ee 688
9fe4854c 689 fn = jffs2_write_dnode(c, f, ri, (char *)&dev, devlen, ALLOC_NORMAL);
1da177e4
LT
690
691 jffs2_free_raw_inode(ri);
692
693 if (IS_ERR(fn)) {
694 /* Eeek. Wave bye bye */
695 up(&f->sem);
696 jffs2_complete_reservation(c);
697 jffs2_clear_inode(inode);
9ed437c5 698 posix_acl_release(acl);
1da177e4
LT
699 return PTR_ERR(fn);
700 }
182ec4ee 701 /* No data here. Only a metadata node, which will be
1da177e4
LT
702 obsoleted by the first data write
703 */
704 f->metadata = fn;
705 up(&f->sem);
706
707 jffs2_complete_reservation(c);
aa98d7cf
KK
708
709 ret = jffs2_init_security(inode, dir_i);
710 if (ret) {
711 jffs2_clear_inode(inode);
9ed437c5 712 posix_acl_release(acl);
aa98d7cf
KK
713 return ret;
714 }
9ed437c5 715 ret = jffs2_init_acl(inode, acl);
aa98d7cf
KK
716 if (ret) {
717 jffs2_clear_inode(inode);
718 return ret;
719 }
720
9fe4854c
DW
721 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
722 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
1da177e4
LT
723 if (ret) {
724 /* Eep. */
725 jffs2_clear_inode(inode);
726 return ret;
727 }
728
729 rd = jffs2_alloc_raw_dirent();
730 if (!rd) {
731 /* Argh. Now we treat it like a normal delete */
732 jffs2_complete_reservation(c);
733 jffs2_clear_inode(inode);
734 return -ENOMEM;
735 }
736
737 dir_f = JFFS2_INODE_INFO(dir_i);
738 down(&dir_f->sem);
739
740 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
741 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
742 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
743 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
744
745 rd->pino = cpu_to_je32(dir_i->i_ino);
746 rd->version = cpu_to_je32(++dir_f->highest_version);
747 rd->ino = cpu_to_je32(inode->i_ino);
748 rd->mctime = cpu_to_je32(get_seconds());
749 rd->nsize = namelen;
750
751 /* XXX: This is ugly. */
752 rd->type = (mode & S_IFMT) >> 12;
753
754 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
755 rd->name_crc = cpu_to_je32(crc32(0, dentry->d_name.name, namelen));
756
9fe4854c 757 fd = jffs2_write_dirent(c, dir_f, rd, dentry->d_name.name, namelen, ALLOC_NORMAL);
182ec4ee 758
1da177e4 759 if (IS_ERR(fd)) {
182ec4ee 760 /* dirent failed to write. Delete the inode normally
1da177e4
LT
761 as if it were the final unlink() */
762 jffs2_complete_reservation(c);
763 jffs2_free_raw_dirent(rd);
764 up(&dir_f->sem);
765 jffs2_clear_inode(inode);
766 return PTR_ERR(fd);
767 }
768
769 dir_i->i_mtime = dir_i->i_ctime = ITIME(je32_to_cpu(rd->mctime));
770
771 jffs2_free_raw_dirent(rd);
772
773 /* Link the fd into the inode's list, obsoleting an old
774 one if necessary. */
775 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
776
777 up(&dir_f->sem);
778 jffs2_complete_reservation(c);
779
780 d_instantiate(dentry, inode);
781
782 return 0;
783}
784
785static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
ef53cb02 786 struct inode *new_dir_i, struct dentry *new_dentry)
1da177e4
LT
787{
788 int ret;
789 struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
790 struct jffs2_inode_info *victim_f = NULL;
791 uint8_t type;
3a69e0cd 792 uint32_t now;
1da177e4 793
182ec4ee 794 /* The VFS will check for us and prevent trying to rename a
1da177e4
LT
795 * file over a directory and vice versa, but if it's a directory,
796 * the VFS can't check whether the victim is empty. The filesystem
797 * needs to do that for itself.
798 */
799 if (new_dentry->d_inode) {
800 victim_f = JFFS2_INODE_INFO(new_dentry->d_inode);
801 if (S_ISDIR(new_dentry->d_inode->i_mode)) {
802 struct jffs2_full_dirent *fd;
803
804 down(&victim_f->sem);
805 for (fd = victim_f->dents; fd; fd = fd->next) {
806 if (fd->ino) {
807 up(&victim_f->sem);
808 return -ENOTEMPTY;
809 }
810 }
811 up(&victim_f->sem);
812 }
813 }
814
815 /* XXX: We probably ought to alloc enough space for
182ec4ee 816 both nodes at the same time. Writing the new link,
1da177e4
LT
817 then getting -ENOSPC, is quite bad :)
818 */
819
820 /* Make a hard link */
182ec4ee 821
1da177e4
LT
822 /* XXX: This is ugly */
823 type = (old_dentry->d_inode->i_mode & S_IFMT) >> 12;
824 if (!type) type = DT_REG;
825
3a69e0cd 826 now = get_seconds();
182ec4ee 827 ret = jffs2_do_link(c, JFFS2_INODE_INFO(new_dir_i),
1da177e4 828 old_dentry->d_inode->i_ino, type,
3a69e0cd 829 new_dentry->d_name.name, new_dentry->d_name.len, now);
1da177e4
LT
830
831 if (ret)
832 return ret;
833
834 if (victim_f) {
835 /* There was a victim. Kill it off nicely */
9a53c3a7 836 drop_nlink(new_dentry->d_inode);
1da177e4
LT
837 /* Don't oops if the victim was a dirent pointing to an
838 inode which didn't exist. */
839 if (victim_f->inocache) {
840 down(&victim_f->sem);
841 victim_f->inocache->nlink--;
842 up(&victim_f->sem);
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);
860 down(&f->sem);
d8c76e6f 861 inc_nlink(old_dentry->d_inode);
1da177e4
LT
862 if (f->inocache)
863 f->inocache->nlink++;
864 up(&f->sem);
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
This page took 0.23715 seconds and 5 git commands to generate.