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