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