root/fs/nilfs2/namei.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. nilfs_lookup
  2. nilfs_create
  3. nilfs_mknod
  4. nilfs_symlink
  5. nilfs_link
  6. nilfs_mkdir
  7. nilfs_do_unlink
  8. nilfs_unlink
  9. nilfs_rmdir
  10. nilfs_rename
  11. nilfs_get_parent
  12. nilfs_get_dentry
  13. nilfs_fh_to_dentry
  14. nilfs_fh_to_parent
  15. nilfs_encode_fh

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

/* [<][>][^][v][top][bottom][index][help] */