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