Blame view
fs/nilfs2/namei.c
13 KB
d25006523 nilfs2: pathname ... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/* * namei.c - NILFS pathname lookup operations. * * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * |
4b420ab4e nilfs2: clean up ... |
16 |
* Modified for NILFS by Amagai Yoshiji and Ryusuke Konishi. |
d25006523 nilfs2: pathname ... |
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
*/ /* * linux/fs/ext2/namei.c * * Copyright (C) 1992, 1993, 1994, 1995 * Remy Card (card@masi.ibp.fr) * Laboratoire MASI - Institut Blaise Pascal * Universite Pierre et Marie Curie (Paris VI) * * from * * linux/fs/minix/namei.c * * Copyright (C) 1991, 1992 Linus Torvalds * * Big-endian to little-endian byte-swapping/bitmaps by * David S. Miller (davem@caip.rutgers.edu), 1995 */ #include <linux/pagemap.h> #include "nilfs.h" |
8e656fd51 nilfs2: make snap... |
38 |
#include "export.h" |
d25006523 nilfs2: pathname ... |
39 |
|
8e656fd51 nilfs2: make snap... |
40 41 42 |
#define NILFS_FID_SIZE_NON_CONNECTABLE \ (offsetof(struct nilfs_fid, parent_gen) / 4) #define NILFS_FID_SIZE_CONNECTABLE (sizeof(struct nilfs_fid) / 4) |
d25006523 nilfs2: pathname ... |
43 44 45 46 |
static inline int nilfs_add_nondir(struct dentry *dentry, struct inode *inode) { int err = nilfs_add_link(dentry, inode); |
4ad364ca1 nilfs2: add missi... |
47 |
|
d25006523 nilfs2: pathname ... |
48 49 |
if (!err) { d_instantiate(dentry, inode); |
705304a86 nilfs2: fix the n... |
50 |
unlock_new_inode(inode); |
d25006523 nilfs2: pathname ... |
51 52 53 |
return 0; } inode_dec_link_count(inode); |
705304a86 nilfs2: fix the n... |
54 |
unlock_new_inode(inode); |
d25006523 nilfs2: pathname ... |
55 56 57 58 59 60 61 62 63 |
iput(inode); return err; } /* * Methods themselves. */ static struct dentry * |
00cd8dd3b stop passing name... |
64 |
nilfs_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags) |
d25006523 nilfs2: pathname ... |
65 66 67 68 69 70 |
{ struct inode *inode; ino_t ino; if (dentry->d_name.len > NILFS_NAME_LEN) return ERR_PTR(-ENAMETOOLONG); |
0319003d0 nilfs really shou... |
71 |
ino = nilfs_inode_by_name(dir, &dentry->d_name); |
a9049376e make d_splice_ali... |
72 |
inode = ino ? nilfs_iget(dir->i_sb, NILFS_I(dir)->i_root, ino) : NULL; |
d25006523 nilfs2: pathname ... |
73 74 |
return d_splice_alias(inode, dentry); } |
d25006523 nilfs2: pathname ... |
75 76 77 78 79 80 81 82 |
/* * By the time this is called, we already have created * the directory cache entry for the new file, but it * is so far negative - it has no inode. * * If the create succeeds, we fill in the inode information * with d_instantiate(). */ |
4acdaf27e switch ->create()... |
83 |
static int nilfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, |
ebfc3b49a don't pass nameid... |
84 |
bool excl) |
d25006523 nilfs2: pathname ... |
85 86 87 |
{ struct inode *inode; struct nilfs_transaction_info ti; |
47420c799 nilfs2: avoid dou... |
88 |
int err; |
d25006523 nilfs2: pathname ... |
89 90 91 92 93 94 95 96 97 98 |
err = nilfs_transaction_begin(dir->i_sb, &ti, 1); if (err) return err; inode = nilfs_new_inode(dir, mode); err = PTR_ERR(inode); if (!IS_ERR(inode)) { inode->i_op = &nilfs_file_inode_operations; inode->i_fop = &nilfs_file_operations; inode->i_mapping->a_ops = &nilfs_aops; |
abdb318b7 nilfs2: replace m... |
99 |
nilfs_mark_inode_dirty(inode); |
d25006523 nilfs2: pathname ... |
100 101 |
err = nilfs_add_nondir(dentry, inode); } |
47420c799 nilfs2: avoid dou... |
102 103 104 105 106 107 |
if (!err) err = nilfs_transaction_commit(dir->i_sb); else nilfs_transaction_abort(dir->i_sb); return err; |
d25006523 nilfs2: pathname ... |
108 109 110 |
} static int |
1a67aafb5 switch ->mknod() ... |
111 |
nilfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t rdev) |
d25006523 nilfs2: pathname ... |
112 113 114 |
{ struct inode *inode; struct nilfs_transaction_info ti; |
47420c799 nilfs2: avoid dou... |
115 |
int err; |
d25006523 nilfs2: pathname ... |
116 |
|
d25006523 nilfs2: pathname ... |
117 118 119 120 121 122 123 |
err = nilfs_transaction_begin(dir->i_sb, &ti, 1); if (err) return err; inode = nilfs_new_inode(dir, mode); err = PTR_ERR(inode); if (!IS_ERR(inode)) { init_special_inode(inode, inode->i_mode, rdev); |
abdb318b7 nilfs2: replace m... |
124 |
nilfs_mark_inode_dirty(inode); |
d25006523 nilfs2: pathname ... |
125 126 |
err = nilfs_add_nondir(dentry, inode); } |
47420c799 nilfs2: avoid dou... |
127 128 129 130 131 132 |
if (!err) err = nilfs_transaction_commit(dir->i_sb); else nilfs_transaction_abort(dir->i_sb); return err; |
d25006523 nilfs2: pathname ... |
133 134 135 136 137 138 139 |
} static int nilfs_symlink(struct inode *dir, struct dentry *dentry, const char *symname) { struct nilfs_transaction_info ti; struct super_block *sb = dir->i_sb; |
0c6c44cb9 nilfs2: avoid bar... |
140 |
unsigned int l = strlen(symname) + 1; |
d25006523 nilfs2: pathname ... |
141 |
struct inode *inode; |
47420c799 nilfs2: avoid dou... |
142 |
int err; |
d25006523 nilfs2: pathname ... |
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
if (l > sb->s_blocksize) return -ENAMETOOLONG; err = nilfs_transaction_begin(dir->i_sb, &ti, 1); if (err) return err; inode = nilfs_new_inode(dir, S_IFLNK | S_IRWXUGO); err = PTR_ERR(inode); if (IS_ERR(inode)) goto out; /* slow symlink */ inode->i_op = &nilfs_symlink_inode_operations; |
21fc61c73 don't put symlink... |
158 |
inode_nohighmem(inode); |
d25006523 nilfs2: pathname ... |
159 160 161 162 163 164 |
inode->i_mapping->a_ops = &nilfs_aops; err = page_symlink(inode, symname, l); if (err) goto out_fail; /* mark_inode_dirty(inode); */ |
9ca941d4b nilfs2: delete ma... |
165 |
/* page_symlink() do this */ |
d25006523 nilfs2: pathname ... |
166 167 168 |
err = nilfs_add_nondir(dentry, inode); out: |
47420c799 nilfs2: avoid dou... |
169 170 171 172 173 174 |
if (!err) err = nilfs_transaction_commit(dir->i_sb); else nilfs_transaction_abort(dir->i_sb); return err; |
d25006523 nilfs2: pathname ... |
175 176 |
out_fail: |
565de406e nilfs2: expand in... |
177 |
drop_nlink(inode); |
abdb318b7 nilfs2: replace m... |
178 |
nilfs_mark_inode_dirty(inode); |
705304a86 nilfs2: fix the n... |
179 |
unlock_new_inode(inode); |
d25006523 nilfs2: pathname ... |
180 181 182 183 184 185 186 |
iput(inode); goto out; } static int nilfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) { |
2b0143b5c VFS: normal files... |
187 |
struct inode *inode = d_inode(old_dentry); |
d25006523 nilfs2: pathname ... |
188 |
struct nilfs_transaction_info ti; |
47420c799 nilfs2: avoid dou... |
189 |
int err; |
d25006523 nilfs2: pathname ... |
190 |
|
d25006523 nilfs2: pathname ... |
191 192 193 |
err = nilfs_transaction_begin(dir->i_sb, &ti, 1); if (err) return err; |
078cd8279 fs: Replace CURRE... |
194 |
inode->i_ctime = current_time(inode); |
d25006523 nilfs2: pathname ... |
195 |
inode_inc_link_count(inode); |
7de9c6ee3 new helper: ihold() |
196 |
ihold(inode); |
d25006523 nilfs2: pathname ... |
197 |
|
705304a86 nilfs2: fix the n... |
198 199 200 |
err = nilfs_add_link(dentry, inode); if (!err) { d_instantiate(dentry, inode); |
47420c799 nilfs2: avoid dou... |
201 |
err = nilfs_transaction_commit(dir->i_sb); |
705304a86 nilfs2: fix the n... |
202 203 204 |
} else { inode_dec_link_count(inode); iput(inode); |
47420c799 nilfs2: avoid dou... |
205 |
nilfs_transaction_abort(dir->i_sb); |
705304a86 nilfs2: fix the n... |
206 |
} |
47420c799 nilfs2: avoid dou... |
207 208 |
return err; |
d25006523 nilfs2: pathname ... |
209 |
} |
18bb1db3e switch vfs_mkdir(... |
210 |
static int nilfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) |
d25006523 nilfs2: pathname ... |
211 212 213 |
{ struct inode *inode; struct nilfs_transaction_info ti; |
47420c799 nilfs2: avoid dou... |
214 |
int err; |
d25006523 nilfs2: pathname ... |
215 |
|
d25006523 nilfs2: pathname ... |
216 217 218 |
err = nilfs_transaction_begin(dir->i_sb, &ti, 1); if (err) return err; |
565de406e nilfs2: expand in... |
219 |
inc_nlink(dir); |
d25006523 nilfs2: pathname ... |
220 221 222 223 224 225 226 227 228 |
inode = nilfs_new_inode(dir, S_IFDIR | mode); err = PTR_ERR(inode); if (IS_ERR(inode)) goto out_dir; inode->i_op = &nilfs_dir_inode_operations; inode->i_fop = &nilfs_dir_operations; inode->i_mapping->a_ops = &nilfs_aops; |
565de406e nilfs2: expand in... |
229 |
inc_nlink(inode); |
d25006523 nilfs2: pathname ... |
230 231 232 233 234 235 236 237 |
err = nilfs_make_empty(inode, dir); if (err) goto out_fail; err = nilfs_add_link(dentry, inode); if (err) goto out_fail; |
abdb318b7 nilfs2: replace m... |
238 |
nilfs_mark_inode_dirty(inode); |
d25006523 nilfs2: pathname ... |
239 |
d_instantiate(dentry, inode); |
705304a86 nilfs2: fix the n... |
240 |
unlock_new_inode(inode); |
d25006523 nilfs2: pathname ... |
241 |
out: |
47420c799 nilfs2: avoid dou... |
242 243 244 245 246 247 |
if (!err) err = nilfs_transaction_commit(dir->i_sb); else nilfs_transaction_abort(dir->i_sb); return err; |
d25006523 nilfs2: pathname ... |
248 249 |
out_fail: |
565de406e nilfs2: expand in... |
250 |
drop_nlink(inode); |
565de406e nilfs2: expand in... |
251 |
drop_nlink(inode); |
abdb318b7 nilfs2: replace m... |
252 |
nilfs_mark_inode_dirty(inode); |
705304a86 nilfs2: fix the n... |
253 |
unlock_new_inode(inode); |
d25006523 nilfs2: pathname ... |
254 255 |
iput(inode); out_dir: |
565de406e nilfs2: expand in... |
256 |
drop_nlink(dir); |
abdb318b7 nilfs2: replace m... |
257 |
nilfs_mark_inode_dirty(dir); |
d25006523 nilfs2: pathname ... |
258 259 |
goto out; } |
4cd76c3c9 nilfs2: split nil... |
260 |
static int nilfs_do_unlink(struct inode *dir, struct dentry *dentry) |
d25006523 nilfs2: pathname ... |
261 262 263 264 |
{ struct inode *inode; struct nilfs_dir_entry *de; struct page *page; |
47420c799 nilfs2: avoid dou... |
265 |
int err; |
d25006523 nilfs2: pathname ... |
266 |
|
d25006523 nilfs2: pathname ... |
267 |
err = -ENOENT; |
0319003d0 nilfs really shou... |
268 |
de = nilfs_find_entry(dir, &dentry->d_name, &page); |
d25006523 nilfs2: pathname ... |
269 270 |
if (!de) goto out; |
2b0143b5c VFS: normal files... |
271 |
inode = d_inode(dentry); |
d25006523 nilfs2: pathname ... |
272 273 274 275 276 |
err = -EIO; if (le64_to_cpu(de->inode) != inode->i_ino) goto out; if (!inode->i_nlink) { |
d6517deb0 nilfs2: replace n... |
277 278 279 |
nilfs_msg(inode->i_sb, KERN_WARNING, "deleting nonexistent file (ino=%lu), %d", inode->i_ino, inode->i_nlink); |
bfe868486 filesystems: add ... |
280 |
set_nlink(inode, 1); |
d25006523 nilfs2: pathname ... |
281 282 283 284 285 286 |
} err = nilfs_delete_entry(de, page); if (err) goto out; inode->i_ctime = dir->i_ctime; |
565de406e nilfs2: expand in... |
287 |
drop_nlink(inode); |
d25006523 nilfs2: pathname ... |
288 289 |
err = 0; out: |
4cd76c3c9 nilfs2: split nil... |
290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 |
return err; } static int nilfs_unlink(struct inode *dir, struct dentry *dentry) { struct nilfs_transaction_info ti; int err; err = nilfs_transaction_begin(dir->i_sb, &ti, 0); if (err) return err; err = nilfs_do_unlink(dir, dentry); if (!err) { |
abdb318b7 nilfs2: replace m... |
305 |
nilfs_mark_inode_dirty(dir); |
2b0143b5c VFS: normal files... |
306 |
nilfs_mark_inode_dirty(d_inode(dentry)); |
47420c799 nilfs2: avoid dou... |
307 |
err = nilfs_transaction_commit(dir->i_sb); |
4cd76c3c9 nilfs2: split nil... |
308 |
} else |
47420c799 nilfs2: avoid dou... |
309 310 311 |
nilfs_transaction_abort(dir->i_sb); return err; |
d25006523 nilfs2: pathname ... |
312 313 314 315 |
} static int nilfs_rmdir(struct inode *dir, struct dentry *dentry) { |
2b0143b5c VFS: normal files... |
316 |
struct inode *inode = d_inode(dentry); |
d25006523 nilfs2: pathname ... |
317 |
struct nilfs_transaction_info ti; |
47420c799 nilfs2: avoid dou... |
318 |
int err; |
d25006523 nilfs2: pathname ... |
319 320 321 322 323 324 325 |
err = nilfs_transaction_begin(dir->i_sb, &ti, 0); if (err) return err; err = -ENOTEMPTY; if (nilfs_empty_dir(inode)) { |
4cd76c3c9 nilfs2: split nil... |
326 |
err = nilfs_do_unlink(dir, dentry); |
d25006523 nilfs2: pathname ... |
327 328 |
if (!err) { inode->i_size = 0; |
565de406e nilfs2: expand in... |
329 |
drop_nlink(inode); |
abdb318b7 nilfs2: replace m... |
330 |
nilfs_mark_inode_dirty(inode); |
565de406e nilfs2: expand in... |
331 |
drop_nlink(dir); |
abdb318b7 nilfs2: replace m... |
332 |
nilfs_mark_inode_dirty(dir); |
d25006523 nilfs2: pathname ... |
333 334 |
} } |
47420c799 nilfs2: avoid dou... |
335 336 337 338 339 340 |
if (!err) err = nilfs_transaction_commit(dir->i_sb); else nilfs_transaction_abort(dir->i_sb); return err; |
d25006523 nilfs2: pathname ... |
341 342 343 |
} static int nilfs_rename(struct inode *old_dir, struct dentry *old_dentry, |
f03b8ad8d fs: support RENAM... |
344 345 |
struct inode *new_dir, struct dentry *new_dentry, unsigned int flags) |
d25006523 nilfs2: pathname ... |
346 |
{ |
2b0143b5c VFS: normal files... |
347 348 |
struct inode *old_inode = d_inode(old_dentry); struct inode *new_inode = d_inode(new_dentry); |
d25006523 nilfs2: pathname ... |
349 350 351 352 353 354 |
struct page *dir_page = NULL; struct nilfs_dir_entry *dir_de = NULL; struct page *old_page; struct nilfs_dir_entry *old_de; struct nilfs_transaction_info ti; int err; |
f03b8ad8d fs: support RENAM... |
355 356 |
if (flags & ~RENAME_NOREPLACE) return -EINVAL; |
d25006523 nilfs2: pathname ... |
357 358 359 360 361 |
err = nilfs_transaction_begin(old_dir->i_sb, &ti, 1); if (unlikely(err)) return err; err = -ENOENT; |
0319003d0 nilfs really shou... |
362 |
old_de = nilfs_find_entry(old_dir, &old_dentry->d_name, &old_page); |
d25006523 nilfs2: pathname ... |
363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 |
if (!old_de) goto out; if (S_ISDIR(old_inode->i_mode)) { err = -EIO; dir_de = nilfs_dotdot(old_inode, &dir_page); if (!dir_de) goto out_old; } if (new_inode) { struct page *new_page; struct nilfs_dir_entry *new_de; err = -ENOTEMPTY; if (dir_de && !nilfs_empty_dir(new_inode)) goto out_dir; err = -ENOENT; |
0319003d0 nilfs really shou... |
382 |
new_de = nilfs_find_entry(new_dir, &new_dentry->d_name, &new_page); |
d25006523 nilfs2: pathname ... |
383 384 |
if (!new_de) goto out_dir; |
d25006523 nilfs2: pathname ... |
385 |
nilfs_set_link(new_dir, new_de, new_page, old_inode); |
abdb318b7 nilfs2: replace m... |
386 |
nilfs_mark_inode_dirty(new_dir); |
078cd8279 fs: Replace CURRE... |
387 |
new_inode->i_ctime = current_time(new_inode); |
d25006523 nilfs2: pathname ... |
388 389 |
if (dir_de) drop_nlink(new_inode); |
565de406e nilfs2: expand in... |
390 |
drop_nlink(new_inode); |
abdb318b7 nilfs2: replace m... |
391 |
nilfs_mark_inode_dirty(new_inode); |
d25006523 nilfs2: pathname ... |
392 |
} else { |
d25006523 nilfs2: pathname ... |
393 |
err = nilfs_add_link(new_dentry, old_inode); |
30eb43d31 nilfs2: i_nlink r... |
394 |
if (err) |
d25006523 nilfs2: pathname ... |
395 |
goto out_dir; |
565de406e nilfs2: expand in... |
396 397 |
if (dir_de) { inc_nlink(new_dir); |
abdb318b7 nilfs2: replace m... |
398 |
nilfs_mark_inode_dirty(new_dir); |
565de406e nilfs2: expand in... |
399 |
} |
d25006523 nilfs2: pathname ... |
400 401 402 403 404 |
} /* * Like most other Unix systems, set the ctime for inodes on a * rename. |
d25006523 nilfs2: pathname ... |
405 |
*/ |
078cd8279 fs: Replace CURRE... |
406 |
old_inode->i_ctime = current_time(old_inode); |
d25006523 nilfs2: pathname ... |
407 408 |
nilfs_delete_entry(old_de, old_page); |
d25006523 nilfs2: pathname ... |
409 410 411 |
if (dir_de) { nilfs_set_link(old_inode, dir_de, dir_page, new_dir); |
565de406e nilfs2: expand in... |
412 |
drop_nlink(old_dir); |
d25006523 nilfs2: pathname ... |
413 |
} |
abdb318b7 nilfs2: replace m... |
414 415 |
nilfs_mark_inode_dirty(old_dir); nilfs_mark_inode_dirty(old_inode); |
d25006523 nilfs2: pathname ... |
416 |
|
47420c799 nilfs2: avoid dou... |
417 |
err = nilfs_transaction_commit(old_dir->i_sb); |
d25006523 nilfs2: pathname ... |
418 419 420 421 422 |
return err; out_dir: if (dir_de) { kunmap(dir_page); |
09cbfeaf1 mm, fs: get rid o... |
423 |
put_page(dir_page); |
d25006523 nilfs2: pathname ... |
424 425 426 |
} out_old: kunmap(old_page); |
09cbfeaf1 mm, fs: get rid o... |
427 |
put_page(old_page); |
d25006523 nilfs2: pathname ... |
428 |
out: |
47420c799 nilfs2: avoid dou... |
429 |
nilfs_transaction_abort(old_dir->i_sb); |
d25006523 nilfs2: pathname ... |
430 431 |
return err; } |
8e656fd51 nilfs2: make snap... |
432 433 434 435 436 437 438 |
/* * Export operations */ static struct dentry *nilfs_get_parent(struct dentry *child) { unsigned long ino; struct inode *inode; |
26fe57502 vfs: make it poss... |
439 |
struct qstr dotdot = QSTR_INIT("..", 2); |
8e656fd51 nilfs2: make snap... |
440 |
struct nilfs_root *root; |
2b0143b5c VFS: normal files... |
441 |
ino = nilfs_inode_by_name(d_inode(child), &dotdot); |
8e656fd51 nilfs2: make snap... |
442 443 |
if (!ino) return ERR_PTR(-ENOENT); |
2b0143b5c VFS: normal files... |
444 |
root = NILFS_I(d_inode(child))->i_root; |
8e656fd51 nilfs2: make snap... |
445 |
|
fc64005c9 don't bother with... |
446 |
inode = nilfs_iget(child->d_sb, root, ino); |
8e656fd51 nilfs2: make snap... |
447 448 449 450 451 452 453 454 455 456 457 458 459 460 |
if (IS_ERR(inode)) return ERR_CAST(inode); return d_obtain_alias(inode); } static struct dentry *nilfs_get_dentry(struct super_block *sb, u64 cno, u64 ino, u32 gen) { struct nilfs_root *root; struct inode *inode; if (ino < NILFS_FIRST_INO(sb) && ino != NILFS_ROOT_INO) return ERR_PTR(-ESTALE); |
e3154e974 nilfs2: get rid o... |
461 |
root = nilfs_lookup_root(sb->s_fs_info, cno); |
8e656fd51 nilfs2: make snap... |
462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 |
if (!root) return ERR_PTR(-ESTALE); inode = nilfs_iget(sb, root, ino); nilfs_put_root(root); if (IS_ERR(inode)) return ERR_CAST(inode); if (gen && inode->i_generation != gen) { iput(inode); return ERR_PTR(-ESTALE); } return d_obtain_alias(inode); } static struct dentry *nilfs_fh_to_dentry(struct super_block *sb, struct fid *fh, int fh_len, int fh_type) { struct nilfs_fid *fid = (struct nilfs_fid *)fh; |
f73c2f1f8 NILFS2: support N... |
481 |
if (fh_len < NILFS_FID_SIZE_NON_CONNECTABLE || |
8e656fd51 nilfs2: make snap... |
482 483 484 485 486 487 488 489 490 491 492 |
(fh_type != FILEID_NILFS_WITH_PARENT && fh_type != FILEID_NILFS_WITHOUT_PARENT)) return NULL; return nilfs_get_dentry(sb, fid->cno, fid->ino, fid->gen); } static struct dentry *nilfs_fh_to_parent(struct super_block *sb, struct fid *fh, int fh_len, int fh_type) { struct nilfs_fid *fid = (struct nilfs_fid *)fh; |
f73c2f1f8 NILFS2: support N... |
493 |
if (fh_len < NILFS_FID_SIZE_CONNECTABLE || |
8e656fd51 nilfs2: make snap... |
494 495 496 497 498 |
fh_type != FILEID_NILFS_WITH_PARENT) return NULL; return nilfs_get_dentry(sb, fid->cno, fid->parent_ino, fid->parent_gen); } |
b0b0382bb ->encode_fh() API... |
499 500 |
static int nilfs_encode_fh(struct inode *inode, __u32 *fh, int *lenp, struct inode *parent) |
8e656fd51 nilfs2: make snap... |
501 502 |
{ struct nilfs_fid *fid = (struct nilfs_fid *)fh; |
8e656fd51 nilfs2: make snap... |
503 504 |
struct nilfs_root *root = NILFS_I(inode)->i_root; int type; |
b0b0382bb ->encode_fh() API... |
505 506 |
if (parent && *lenp < NILFS_FID_SIZE_CONNECTABLE) { *lenp = NILFS_FID_SIZE_CONNECTABLE; |
94e07a759 fs: encode_fh: re... |
507 |
return FILEID_INVALID; |
b0b0382bb ->encode_fh() API... |
508 509 510 |
} if (*lenp < NILFS_FID_SIZE_NON_CONNECTABLE) { *lenp = NILFS_FID_SIZE_NON_CONNECTABLE; |
94e07a759 fs: encode_fh: re... |
511 |
return FILEID_INVALID; |
b0b0382bb ->encode_fh() API... |
512 |
} |
8e656fd51 nilfs2: make snap... |
513 514 515 516 |
fid->cno = root->cno; fid->ino = inode->i_ino; fid->gen = inode->i_generation; |
b0b0382bb ->encode_fh() API... |
517 |
if (parent) { |
8e656fd51 nilfs2: make snap... |
518 519 |
fid->parent_ino = parent->i_ino; fid->parent_gen = parent->i_generation; |
8e656fd51 nilfs2: make snap... |
520 521 522 523 524 525 526 527 528 |
type = FILEID_NILFS_WITH_PARENT; *lenp = NILFS_FID_SIZE_CONNECTABLE; } else { type = FILEID_NILFS_WITHOUT_PARENT; *lenp = NILFS_FID_SIZE_NON_CONNECTABLE; } return type; } |
6e1d5dcc2 const: mark remai... |
529 |
const struct inode_operations nilfs_dir_inode_operations = { |
d25006523 nilfs2: pathname ... |
530 531 532 533 534 535 536 537 538 539 540 |
.create = nilfs_create, .lookup = nilfs_lookup, .link = nilfs_link, .unlink = nilfs_unlink, .symlink = nilfs_symlink, .mkdir = nilfs_mkdir, .rmdir = nilfs_rmdir, .mknod = nilfs_mknod, .rename = nilfs_rename, .setattr = nilfs_setattr, .permission = nilfs_permission, |
622daaff0 nilfs2: fiemap su... |
541 |
.fiemap = nilfs_fiemap, |
d25006523 nilfs2: pathname ... |
542 |
}; |
6e1d5dcc2 const: mark remai... |
543 |
const struct inode_operations nilfs_special_inode_operations = { |
d25006523 nilfs2: pathname ... |
544 545 546 |
.setattr = nilfs_setattr, .permission = nilfs_permission, }; |
6e1d5dcc2 const: mark remai... |
547 |
const struct inode_operations nilfs_symlink_inode_operations = { |
d25006523 nilfs2: pathname ... |
548 |
.readlink = generic_readlink, |
6b2553918 replace ->follow_... |
549 |
.get_link = page_get_link, |
dc3d3b810 nilfs2: deny writ... |
550 |
.permission = nilfs_permission, |
d25006523 nilfs2: pathname ... |
551 |
}; |
8e656fd51 nilfs2: make snap... |
552 553 554 555 556 557 558 |
const struct export_operations nilfs_export_ops = { .encode_fh = nilfs_encode_fh, .fh_to_dentry = nilfs_fh_to_dentry, .fh_to_parent = nilfs_fh_to_parent, .get_parent = nilfs_get_parent, }; |