root/fs/hostfs/hostfs_kern.c

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

DEFINITIONS

This source file includes following definitions.
  1. HOSTFS_I
  2. hostfs_args
  3. __dentry_name
  4. dentry_name
  5. inode_name
  6. follow_link
  7. hostfs_iget
  8. hostfs_statfs
  9. hostfs_alloc_inode
  10. hostfs_evict_inode
  11. hostfs_free_inode
  12. hostfs_show_options
  13. hostfs_readdir
  14. hostfs_open
  15. hostfs_file_release
  16. hostfs_fsync
  17. hostfs_writepage
  18. hostfs_readpage
  19. hostfs_write_begin
  20. hostfs_write_end
  21. read_name
  22. hostfs_create
  23. hostfs_lookup
  24. hostfs_link
  25. hostfs_unlink
  26. hostfs_symlink
  27. hostfs_mkdir
  28. hostfs_rmdir
  29. hostfs_mknod
  30. hostfs_rename2
  31. hostfs_permission
  32. hostfs_setattr
  33. hostfs_get_link
  34. hostfs_fill_sb_common
  35. hostfs_read_sb
  36. hostfs_kill_sb
  37. init_hostfs
  38. exit_hostfs

   1 /*
   2  * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
   3  * Licensed under the GPL
   4  *
   5  * Ported the filesystem routines to 2.5.
   6  * 2003-02-10 Petr Baudis <pasky@ucw.cz>
   7  */
   8 
   9 #include <linux/fs.h>
  10 #include <linux/magic.h>
  11 #include <linux/module.h>
  12 #include <linux/mm.h>
  13 #include <linux/pagemap.h>
  14 #include <linux/statfs.h>
  15 #include <linux/slab.h>
  16 #include <linux/seq_file.h>
  17 #include <linux/mount.h>
  18 #include <linux/namei.h>
  19 #include "hostfs.h"
  20 #include <init.h>
  21 #include <kern.h>
  22 
  23 struct hostfs_inode_info {
  24         int fd;
  25         fmode_t mode;
  26         struct inode vfs_inode;
  27         struct mutex open_mutex;
  28 };
  29 
  30 static inline struct hostfs_inode_info *HOSTFS_I(struct inode *inode)
  31 {
  32         return list_entry(inode, struct hostfs_inode_info, vfs_inode);
  33 }
  34 
  35 #define FILE_HOSTFS_I(file) HOSTFS_I(file_inode(file))
  36 
  37 /* Changed in hostfs_args before the kernel starts running */
  38 static char *root_ino = "";
  39 static int append = 0;
  40 
  41 static const struct inode_operations hostfs_iops;
  42 static const struct inode_operations hostfs_dir_iops;
  43 static const struct inode_operations hostfs_link_iops;
  44 
  45 #ifndef MODULE
  46 static int __init hostfs_args(char *options, int *add)
  47 {
  48         char *ptr;
  49 
  50         ptr = strchr(options, ',');
  51         if (ptr != NULL)
  52                 *ptr++ = '\0';
  53         if (*options != '\0')
  54                 root_ino = options;
  55 
  56         options = ptr;
  57         while (options) {
  58                 ptr = strchr(options, ',');
  59                 if (ptr != NULL)
  60                         *ptr++ = '\0';
  61                 if (*options != '\0') {
  62                         if (!strcmp(options, "append"))
  63                                 append = 1;
  64                         else printf("hostfs_args - unsupported option - %s\n",
  65                                     options);
  66                 }
  67                 options = ptr;
  68         }
  69         return 0;
  70 }
  71 
  72 __uml_setup("hostfs=", hostfs_args,
  73 "hostfs=<root dir>,<flags>,...\n"
  74 "    This is used to set hostfs parameters.  The root directory argument\n"
  75 "    is used to confine all hostfs mounts to within the specified directory\n"
  76 "    tree on the host.  If this isn't specified, then a user inside UML can\n"
  77 "    mount anything on the host that's accessible to the user that's running\n"
  78 "    it.\n"
  79 "    The only flag currently supported is 'append', which specifies that all\n"
  80 "    files opened by hostfs will be opened in append mode.\n\n"
  81 );
  82 #endif
  83 
  84 static char *__dentry_name(struct dentry *dentry, char *name)
  85 {
  86         char *p = dentry_path_raw(dentry, name, PATH_MAX);
  87         char *root;
  88         size_t len;
  89 
  90         root = dentry->d_sb->s_fs_info;
  91         len = strlen(root);
  92         if (IS_ERR(p)) {
  93                 __putname(name);
  94                 return NULL;
  95         }
  96 
  97         /*
  98          * This function relies on the fact that dentry_path_raw() will place
  99          * the path name at the end of the provided buffer.
 100          */
 101         BUG_ON(p + strlen(p) + 1 != name + PATH_MAX);
 102 
 103         strlcpy(name, root, PATH_MAX);
 104         if (len > p - name) {
 105                 __putname(name);
 106                 return NULL;
 107         }
 108 
 109         if (p > name + len)
 110                 strcpy(name + len, p);
 111 
 112         return name;
 113 }
 114 
 115 static char *dentry_name(struct dentry *dentry)
 116 {
 117         char *name = __getname();
 118         if (!name)
 119                 return NULL;
 120 
 121         return __dentry_name(dentry, name);
 122 }
 123 
 124 static char *inode_name(struct inode *ino)
 125 {
 126         struct dentry *dentry;
 127         char *name;
 128 
 129         dentry = d_find_alias(ino);
 130         if (!dentry)
 131                 return NULL;
 132 
 133         name = dentry_name(dentry);
 134 
 135         dput(dentry);
 136 
 137         return name;
 138 }
 139 
 140 static char *follow_link(char *link)
 141 {
 142         int len, n;
 143         char *name, *resolved, *end;
 144 
 145         name = __getname();
 146         if (!name) {
 147                 n = -ENOMEM;
 148                 goto out_free;
 149         }
 150 
 151         n = hostfs_do_readlink(link, name, PATH_MAX);
 152         if (n < 0)
 153                 goto out_free;
 154         else if (n == PATH_MAX) {
 155                 n = -E2BIG;
 156                 goto out_free;
 157         }
 158 
 159         if (*name == '/')
 160                 return name;
 161 
 162         end = strrchr(link, '/');
 163         if (end == NULL)
 164                 return name;
 165 
 166         *(end + 1) = '\0';
 167         len = strlen(link) + strlen(name) + 1;
 168 
 169         resolved = kmalloc(len, GFP_KERNEL);
 170         if (resolved == NULL) {
 171                 n = -ENOMEM;
 172                 goto out_free;
 173         }
 174 
 175         sprintf(resolved, "%s%s", link, name);
 176         __putname(name);
 177         kfree(link);
 178         return resolved;
 179 
 180  out_free:
 181         __putname(name);
 182         return ERR_PTR(n);
 183 }
 184 
 185 static struct inode *hostfs_iget(struct super_block *sb)
 186 {
 187         struct inode *inode = new_inode(sb);
 188         if (!inode)
 189                 return ERR_PTR(-ENOMEM);
 190         return inode;
 191 }
 192 
 193 static int hostfs_statfs(struct dentry *dentry, struct kstatfs *sf)
 194 {
 195         /*
 196          * do_statfs uses struct statfs64 internally, but the linux kernel
 197          * struct statfs still has 32-bit versions for most of these fields,
 198          * so we convert them here
 199          */
 200         int err;
 201         long long f_blocks;
 202         long long f_bfree;
 203         long long f_bavail;
 204         long long f_files;
 205         long long f_ffree;
 206 
 207         err = do_statfs(dentry->d_sb->s_fs_info,
 208                         &sf->f_bsize, &f_blocks, &f_bfree, &f_bavail, &f_files,
 209                         &f_ffree, &sf->f_fsid, sizeof(sf->f_fsid),
 210                         &sf->f_namelen);
 211         if (err)
 212                 return err;
 213         sf->f_blocks = f_blocks;
 214         sf->f_bfree = f_bfree;
 215         sf->f_bavail = f_bavail;
 216         sf->f_files = f_files;
 217         sf->f_ffree = f_ffree;
 218         sf->f_type = HOSTFS_SUPER_MAGIC;
 219         return 0;
 220 }
 221 
 222 static struct inode *hostfs_alloc_inode(struct super_block *sb)
 223 {
 224         struct hostfs_inode_info *hi;
 225 
 226         hi = kmalloc(sizeof(*hi), GFP_KERNEL_ACCOUNT);
 227         if (hi == NULL)
 228                 return NULL;
 229         hi->fd = -1;
 230         hi->mode = 0;
 231         inode_init_once(&hi->vfs_inode);
 232         mutex_init(&hi->open_mutex);
 233         return &hi->vfs_inode;
 234 }
 235 
 236 static void hostfs_evict_inode(struct inode *inode)
 237 {
 238         truncate_inode_pages_final(&inode->i_data);
 239         clear_inode(inode);
 240         if (HOSTFS_I(inode)->fd != -1) {
 241                 close_file(&HOSTFS_I(inode)->fd);
 242                 HOSTFS_I(inode)->fd = -1;
 243         }
 244 }
 245 
 246 static void hostfs_free_inode(struct inode *inode)
 247 {
 248         kfree(HOSTFS_I(inode));
 249 }
 250 
 251 static int hostfs_show_options(struct seq_file *seq, struct dentry *root)
 252 {
 253         const char *root_path = root->d_sb->s_fs_info;
 254         size_t offset = strlen(root_ino) + 1;
 255 
 256         if (strlen(root_path) > offset)
 257                 seq_show_option(seq, root_path + offset, NULL);
 258 
 259         if (append)
 260                 seq_puts(seq, ",append");
 261 
 262         return 0;
 263 }
 264 
 265 static const struct super_operations hostfs_sbops = {
 266         .alloc_inode    = hostfs_alloc_inode,
 267         .free_inode     = hostfs_free_inode,
 268         .evict_inode    = hostfs_evict_inode,
 269         .statfs         = hostfs_statfs,
 270         .show_options   = hostfs_show_options,
 271 };
 272 
 273 static int hostfs_readdir(struct file *file, struct dir_context *ctx)
 274 {
 275         void *dir;
 276         char *name;
 277         unsigned long long next, ino;
 278         int error, len;
 279         unsigned int type;
 280 
 281         name = dentry_name(file->f_path.dentry);
 282         if (name == NULL)
 283                 return -ENOMEM;
 284         dir = open_dir(name, &error);
 285         __putname(name);
 286         if (dir == NULL)
 287                 return -error;
 288         next = ctx->pos;
 289         seek_dir(dir, next);
 290         while ((name = read_dir(dir, &next, &ino, &len, &type)) != NULL) {
 291                 if (!dir_emit(ctx, name, len, ino, type))
 292                         break;
 293                 ctx->pos = next;
 294         }
 295         close_dir(dir);
 296         return 0;
 297 }
 298 
 299 static int hostfs_open(struct inode *ino, struct file *file)
 300 {
 301         char *name;
 302         fmode_t mode;
 303         int err;
 304         int r, w, fd;
 305 
 306         mode = file->f_mode & (FMODE_READ | FMODE_WRITE);
 307         if ((mode & HOSTFS_I(ino)->mode) == mode)
 308                 return 0;
 309 
 310         mode |= HOSTFS_I(ino)->mode;
 311 
 312 retry:
 313         r = w = 0;
 314 
 315         if (mode & FMODE_READ)
 316                 r = 1;
 317         if (mode & FMODE_WRITE)
 318                 r = w = 1;
 319 
 320         name = dentry_name(file->f_path.dentry);
 321         if (name == NULL)
 322                 return -ENOMEM;
 323 
 324         fd = open_file(name, r, w, append);
 325         __putname(name);
 326         if (fd < 0)
 327                 return fd;
 328 
 329         mutex_lock(&HOSTFS_I(ino)->open_mutex);
 330         /* somebody else had handled it first? */
 331         if ((mode & HOSTFS_I(ino)->mode) == mode) {
 332                 mutex_unlock(&HOSTFS_I(ino)->open_mutex);
 333                 close_file(&fd);
 334                 return 0;
 335         }
 336         if ((mode | HOSTFS_I(ino)->mode) != mode) {
 337                 mode |= HOSTFS_I(ino)->mode;
 338                 mutex_unlock(&HOSTFS_I(ino)->open_mutex);
 339                 close_file(&fd);
 340                 goto retry;
 341         }
 342         if (HOSTFS_I(ino)->fd == -1) {
 343                 HOSTFS_I(ino)->fd = fd;
 344         } else {
 345                 err = replace_file(fd, HOSTFS_I(ino)->fd);
 346                 close_file(&fd);
 347                 if (err < 0) {
 348                         mutex_unlock(&HOSTFS_I(ino)->open_mutex);
 349                         return err;
 350                 }
 351         }
 352         HOSTFS_I(ino)->mode = mode;
 353         mutex_unlock(&HOSTFS_I(ino)->open_mutex);
 354 
 355         return 0;
 356 }
 357 
 358 static int hostfs_file_release(struct inode *inode, struct file *file)
 359 {
 360         filemap_write_and_wait(inode->i_mapping);
 361 
 362         return 0;
 363 }
 364 
 365 static int hostfs_fsync(struct file *file, loff_t start, loff_t end,
 366                         int datasync)
 367 {
 368         struct inode *inode = file->f_mapping->host;
 369         int ret;
 370 
 371         ret = file_write_and_wait_range(file, start, end);
 372         if (ret)
 373                 return ret;
 374 
 375         inode_lock(inode);
 376         ret = fsync_file(HOSTFS_I(inode)->fd, datasync);
 377         inode_unlock(inode);
 378 
 379         return ret;
 380 }
 381 
 382 static const struct file_operations hostfs_file_fops = {
 383         .llseek         = generic_file_llseek,
 384         .splice_read    = generic_file_splice_read,
 385         .read_iter      = generic_file_read_iter,
 386         .write_iter     = generic_file_write_iter,
 387         .mmap           = generic_file_mmap,
 388         .open           = hostfs_open,
 389         .release        = hostfs_file_release,
 390         .fsync          = hostfs_fsync,
 391 };
 392 
 393 static const struct file_operations hostfs_dir_fops = {
 394         .llseek         = generic_file_llseek,
 395         .iterate_shared = hostfs_readdir,
 396         .read           = generic_read_dir,
 397         .open           = hostfs_open,
 398         .fsync          = hostfs_fsync,
 399 };
 400 
 401 static int hostfs_writepage(struct page *page, struct writeback_control *wbc)
 402 {
 403         struct address_space *mapping = page->mapping;
 404         struct inode *inode = mapping->host;
 405         char *buffer;
 406         loff_t base = page_offset(page);
 407         int count = PAGE_SIZE;
 408         int end_index = inode->i_size >> PAGE_SHIFT;
 409         int err;
 410 
 411         if (page->index >= end_index)
 412                 count = inode->i_size & (PAGE_SIZE-1);
 413 
 414         buffer = kmap(page);
 415 
 416         err = write_file(HOSTFS_I(inode)->fd, &base, buffer, count);
 417         if (err != count) {
 418                 ClearPageUptodate(page);
 419                 goto out;
 420         }
 421 
 422         if (base > inode->i_size)
 423                 inode->i_size = base;
 424 
 425         if (PageError(page))
 426                 ClearPageError(page);
 427         err = 0;
 428 
 429  out:
 430         kunmap(page);
 431 
 432         unlock_page(page);
 433         return err;
 434 }
 435 
 436 static int hostfs_readpage(struct file *file, struct page *page)
 437 {
 438         char *buffer;
 439         loff_t start = page_offset(page);
 440         int bytes_read, ret = 0;
 441 
 442         buffer = kmap(page);
 443         bytes_read = read_file(FILE_HOSTFS_I(file)->fd, &start, buffer,
 444                         PAGE_SIZE);
 445         if (bytes_read < 0) {
 446                 ClearPageUptodate(page);
 447                 SetPageError(page);
 448                 ret = bytes_read;
 449                 goto out;
 450         }
 451 
 452         memset(buffer + bytes_read, 0, PAGE_SIZE - bytes_read);
 453 
 454         ClearPageError(page);
 455         SetPageUptodate(page);
 456 
 457  out:
 458         flush_dcache_page(page);
 459         kunmap(page);
 460         unlock_page(page);
 461         return ret;
 462 }
 463 
 464 static int hostfs_write_begin(struct file *file, struct address_space *mapping,
 465                               loff_t pos, unsigned len, unsigned flags,
 466                               struct page **pagep, void **fsdata)
 467 {
 468         pgoff_t index = pos >> PAGE_SHIFT;
 469 
 470         *pagep = grab_cache_page_write_begin(mapping, index, flags);
 471         if (!*pagep)
 472                 return -ENOMEM;
 473         return 0;
 474 }
 475 
 476 static int hostfs_write_end(struct file *file, struct address_space *mapping,
 477                             loff_t pos, unsigned len, unsigned copied,
 478                             struct page *page, void *fsdata)
 479 {
 480         struct inode *inode = mapping->host;
 481         void *buffer;
 482         unsigned from = pos & (PAGE_SIZE - 1);
 483         int err;
 484 
 485         buffer = kmap(page);
 486         err = write_file(FILE_HOSTFS_I(file)->fd, &pos, buffer + from, copied);
 487         kunmap(page);
 488 
 489         if (!PageUptodate(page) && err == PAGE_SIZE)
 490                 SetPageUptodate(page);
 491 
 492         /*
 493          * If err > 0, write_file has added err to pos, so we are comparing
 494          * i_size against the last byte written.
 495          */
 496         if (err > 0 && (pos > inode->i_size))
 497                 inode->i_size = pos;
 498         unlock_page(page);
 499         put_page(page);
 500 
 501         return err;
 502 }
 503 
 504 static const struct address_space_operations hostfs_aops = {
 505         .writepage      = hostfs_writepage,
 506         .readpage       = hostfs_readpage,
 507         .set_page_dirty = __set_page_dirty_nobuffers,
 508         .write_begin    = hostfs_write_begin,
 509         .write_end      = hostfs_write_end,
 510 };
 511 
 512 static int read_name(struct inode *ino, char *name)
 513 {
 514         dev_t rdev;
 515         struct hostfs_stat st;
 516         int err = stat_file(name, &st, -1);
 517         if (err)
 518                 return err;
 519 
 520         /* Reencode maj and min with the kernel encoding.*/
 521         rdev = MKDEV(st.maj, st.min);
 522 
 523         switch (st.mode & S_IFMT) {
 524         case S_IFLNK:
 525                 ino->i_op = &hostfs_link_iops;
 526                 break;
 527         case S_IFDIR:
 528                 ino->i_op = &hostfs_dir_iops;
 529                 ino->i_fop = &hostfs_dir_fops;
 530                 break;
 531         case S_IFCHR:
 532         case S_IFBLK:
 533         case S_IFIFO:
 534         case S_IFSOCK:
 535                 init_special_inode(ino, st.mode & S_IFMT, rdev);
 536                 ino->i_op = &hostfs_iops;
 537                 break;
 538         case S_IFREG:
 539                 ino->i_op = &hostfs_iops;
 540                 ino->i_fop = &hostfs_file_fops;
 541                 ino->i_mapping->a_ops = &hostfs_aops;
 542                 break;
 543         default:
 544                 return -EIO;
 545         }
 546 
 547         ino->i_ino = st.ino;
 548         ino->i_mode = st.mode;
 549         set_nlink(ino, st.nlink);
 550         i_uid_write(ino, st.uid);
 551         i_gid_write(ino, st.gid);
 552         ino->i_atime = timespec_to_timespec64(st.atime);
 553         ino->i_mtime = timespec_to_timespec64(st.mtime);
 554         ino->i_ctime = timespec_to_timespec64(st.ctime);
 555         ino->i_size = st.size;
 556         ino->i_blocks = st.blocks;
 557         return 0;
 558 }
 559 
 560 static int hostfs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
 561                          bool excl)
 562 {
 563         struct inode *inode;
 564         char *name;
 565         int error, fd;
 566 
 567         inode = hostfs_iget(dir->i_sb);
 568         if (IS_ERR(inode)) {
 569                 error = PTR_ERR(inode);
 570                 goto out;
 571         }
 572 
 573         error = -ENOMEM;
 574         name = dentry_name(dentry);
 575         if (name == NULL)
 576                 goto out_put;
 577 
 578         fd = file_create(name, mode & 0777);
 579         if (fd < 0)
 580                 error = fd;
 581         else
 582                 error = read_name(inode, name);
 583 
 584         __putname(name);
 585         if (error)
 586                 goto out_put;
 587 
 588         HOSTFS_I(inode)->fd = fd;
 589         HOSTFS_I(inode)->mode = FMODE_READ | FMODE_WRITE;
 590         d_instantiate(dentry, inode);
 591         return 0;
 592 
 593  out_put:
 594         iput(inode);
 595  out:
 596         return error;
 597 }
 598 
 599 static struct dentry *hostfs_lookup(struct inode *ino, struct dentry *dentry,
 600                                     unsigned int flags)
 601 {
 602         struct inode *inode;
 603         char *name;
 604         int err;
 605 
 606         inode = hostfs_iget(ino->i_sb);
 607         if (IS_ERR(inode))
 608                 goto out;
 609 
 610         err = -ENOMEM;
 611         name = dentry_name(dentry);
 612         if (name) {
 613                 err = read_name(inode, name);
 614                 __putname(name);
 615         }
 616         if (err) {
 617                 iput(inode);
 618                 inode = (err == -ENOENT) ? NULL : ERR_PTR(err);
 619         }
 620  out:
 621         return d_splice_alias(inode, dentry);
 622 }
 623 
 624 static int hostfs_link(struct dentry *to, struct inode *ino,
 625                        struct dentry *from)
 626 {
 627         char *from_name, *to_name;
 628         int err;
 629 
 630         if ((from_name = dentry_name(from)) == NULL)
 631                 return -ENOMEM;
 632         to_name = dentry_name(to);
 633         if (to_name == NULL) {
 634                 __putname(from_name);
 635                 return -ENOMEM;
 636         }
 637         err = link_file(to_name, from_name);
 638         __putname(from_name);
 639         __putname(to_name);
 640         return err;
 641 }
 642 
 643 static int hostfs_unlink(struct inode *ino, struct dentry *dentry)
 644 {
 645         char *file;
 646         int err;
 647 
 648         if (append)
 649                 return -EPERM;
 650 
 651         if ((file = dentry_name(dentry)) == NULL)
 652                 return -ENOMEM;
 653 
 654         err = unlink_file(file);
 655         __putname(file);
 656         return err;
 657 }
 658 
 659 static int hostfs_symlink(struct inode *ino, struct dentry *dentry,
 660                           const char *to)
 661 {
 662         char *file;
 663         int err;
 664 
 665         if ((file = dentry_name(dentry)) == NULL)
 666                 return -ENOMEM;
 667         err = make_symlink(file, to);
 668         __putname(file);
 669         return err;
 670 }
 671 
 672 static int hostfs_mkdir(struct inode *ino, struct dentry *dentry, umode_t mode)
 673 {
 674         char *file;
 675         int err;
 676 
 677         if ((file = dentry_name(dentry)) == NULL)
 678                 return -ENOMEM;
 679         err = do_mkdir(file, mode);
 680         __putname(file);
 681         return err;
 682 }
 683 
 684 static int hostfs_rmdir(struct inode *ino, struct dentry *dentry)
 685 {
 686         char *file;
 687         int err;
 688 
 689         if ((file = dentry_name(dentry)) == NULL)
 690                 return -ENOMEM;
 691         err = hostfs_do_rmdir(file);
 692         __putname(file);
 693         return err;
 694 }
 695 
 696 static int hostfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)
 697 {
 698         struct inode *inode;
 699         char *name;
 700         int err;
 701 
 702         inode = hostfs_iget(dir->i_sb);
 703         if (IS_ERR(inode)) {
 704                 err = PTR_ERR(inode);
 705                 goto out;
 706         }
 707 
 708         err = -ENOMEM;
 709         name = dentry_name(dentry);
 710         if (name == NULL)
 711                 goto out_put;
 712 
 713         init_special_inode(inode, mode, dev);
 714         err = do_mknod(name, mode, MAJOR(dev), MINOR(dev));
 715         if (err)
 716                 goto out_free;
 717 
 718         err = read_name(inode, name);
 719         __putname(name);
 720         if (err)
 721                 goto out_put;
 722 
 723         d_instantiate(dentry, inode);
 724         return 0;
 725 
 726  out_free:
 727         __putname(name);
 728  out_put:
 729         iput(inode);
 730  out:
 731         return err;
 732 }
 733 
 734 static int hostfs_rename2(struct inode *old_dir, struct dentry *old_dentry,
 735                           struct inode *new_dir, struct dentry *new_dentry,
 736                           unsigned int flags)
 737 {
 738         char *old_name, *new_name;
 739         int err;
 740 
 741         if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE))
 742                 return -EINVAL;
 743 
 744         old_name = dentry_name(old_dentry);
 745         if (old_name == NULL)
 746                 return -ENOMEM;
 747         new_name = dentry_name(new_dentry);
 748         if (new_name == NULL) {
 749                 __putname(old_name);
 750                 return -ENOMEM;
 751         }
 752         if (!flags)
 753                 err = rename_file(old_name, new_name);
 754         else
 755                 err = rename2_file(old_name, new_name, flags);
 756 
 757         __putname(old_name);
 758         __putname(new_name);
 759         return err;
 760 }
 761 
 762 static int hostfs_permission(struct inode *ino, int desired)
 763 {
 764         char *name;
 765         int r = 0, w = 0, x = 0, err;
 766 
 767         if (desired & MAY_NOT_BLOCK)
 768                 return -ECHILD;
 769 
 770         if (desired & MAY_READ) r = 1;
 771         if (desired & MAY_WRITE) w = 1;
 772         if (desired & MAY_EXEC) x = 1;
 773         name = inode_name(ino);
 774         if (name == NULL)
 775                 return -ENOMEM;
 776 
 777         if (S_ISCHR(ino->i_mode) || S_ISBLK(ino->i_mode) ||
 778             S_ISFIFO(ino->i_mode) || S_ISSOCK(ino->i_mode))
 779                 err = 0;
 780         else
 781                 err = access_file(name, r, w, x);
 782         __putname(name);
 783         if (!err)
 784                 err = generic_permission(ino, desired);
 785         return err;
 786 }
 787 
 788 static int hostfs_setattr(struct dentry *dentry, struct iattr *attr)
 789 {
 790         struct inode *inode = d_inode(dentry);
 791         struct hostfs_iattr attrs;
 792         char *name;
 793         int err;
 794 
 795         int fd = HOSTFS_I(inode)->fd;
 796 
 797         err = setattr_prepare(dentry, attr);
 798         if (err)
 799                 return err;
 800 
 801         if (append)
 802                 attr->ia_valid &= ~ATTR_SIZE;
 803 
 804         attrs.ia_valid = 0;
 805         if (attr->ia_valid & ATTR_MODE) {
 806                 attrs.ia_valid |= HOSTFS_ATTR_MODE;
 807                 attrs.ia_mode = attr->ia_mode;
 808         }
 809         if (attr->ia_valid & ATTR_UID) {
 810                 attrs.ia_valid |= HOSTFS_ATTR_UID;
 811                 attrs.ia_uid = from_kuid(&init_user_ns, attr->ia_uid);
 812         }
 813         if (attr->ia_valid & ATTR_GID) {
 814                 attrs.ia_valid |= HOSTFS_ATTR_GID;
 815                 attrs.ia_gid = from_kgid(&init_user_ns, attr->ia_gid);
 816         }
 817         if (attr->ia_valid & ATTR_SIZE) {
 818                 attrs.ia_valid |= HOSTFS_ATTR_SIZE;
 819                 attrs.ia_size = attr->ia_size;
 820         }
 821         if (attr->ia_valid & ATTR_ATIME) {
 822                 attrs.ia_valid |= HOSTFS_ATTR_ATIME;
 823                 attrs.ia_atime = timespec64_to_timespec(attr->ia_atime);
 824         }
 825         if (attr->ia_valid & ATTR_MTIME) {
 826                 attrs.ia_valid |= HOSTFS_ATTR_MTIME;
 827                 attrs.ia_mtime = timespec64_to_timespec(attr->ia_mtime);
 828         }
 829         if (attr->ia_valid & ATTR_CTIME) {
 830                 attrs.ia_valid |= HOSTFS_ATTR_CTIME;
 831                 attrs.ia_ctime = timespec64_to_timespec(attr->ia_ctime);
 832         }
 833         if (attr->ia_valid & ATTR_ATIME_SET) {
 834                 attrs.ia_valid |= HOSTFS_ATTR_ATIME_SET;
 835         }
 836         if (attr->ia_valid & ATTR_MTIME_SET) {
 837                 attrs.ia_valid |= HOSTFS_ATTR_MTIME_SET;
 838         }
 839         name = dentry_name(dentry);
 840         if (name == NULL)
 841                 return -ENOMEM;
 842         err = set_attr(name, &attrs, fd);
 843         __putname(name);
 844         if (err)
 845                 return err;
 846 
 847         if ((attr->ia_valid & ATTR_SIZE) &&
 848             attr->ia_size != i_size_read(inode))
 849                 truncate_setsize(inode, attr->ia_size);
 850 
 851         setattr_copy(inode, attr);
 852         mark_inode_dirty(inode);
 853         return 0;
 854 }
 855 
 856 static const struct inode_operations hostfs_iops = {
 857         .permission     = hostfs_permission,
 858         .setattr        = hostfs_setattr,
 859 };
 860 
 861 static const struct inode_operations hostfs_dir_iops = {
 862         .create         = hostfs_create,
 863         .lookup         = hostfs_lookup,
 864         .link           = hostfs_link,
 865         .unlink         = hostfs_unlink,
 866         .symlink        = hostfs_symlink,
 867         .mkdir          = hostfs_mkdir,
 868         .rmdir          = hostfs_rmdir,
 869         .mknod          = hostfs_mknod,
 870         .rename         = hostfs_rename2,
 871         .permission     = hostfs_permission,
 872         .setattr        = hostfs_setattr,
 873 };
 874 
 875 static const char *hostfs_get_link(struct dentry *dentry,
 876                                    struct inode *inode,
 877                                    struct delayed_call *done)
 878 {
 879         char *link;
 880         if (!dentry)
 881                 return ERR_PTR(-ECHILD);
 882         link = kmalloc(PATH_MAX, GFP_KERNEL);
 883         if (link) {
 884                 char *path = dentry_name(dentry);
 885                 int err = -ENOMEM;
 886                 if (path) {
 887                         err = hostfs_do_readlink(path, link, PATH_MAX);
 888                         if (err == PATH_MAX)
 889                                 err = -E2BIG;
 890                         __putname(path);
 891                 }
 892                 if (err < 0) {
 893                         kfree(link);
 894                         return ERR_PTR(err);
 895                 }
 896         } else {
 897                 return ERR_PTR(-ENOMEM);
 898         }
 899 
 900         set_delayed_call(done, kfree_link, link);
 901         return link;
 902 }
 903 
 904 static const struct inode_operations hostfs_link_iops = {
 905         .get_link       = hostfs_get_link,
 906 };
 907 
 908 static int hostfs_fill_sb_common(struct super_block *sb, void *d, int silent)
 909 {
 910         struct inode *root_inode;
 911         char *host_root_path, *req_root = d;
 912         int err;
 913 
 914         sb->s_blocksize = 1024;
 915         sb->s_blocksize_bits = 10;
 916         sb->s_magic = HOSTFS_SUPER_MAGIC;
 917         sb->s_op = &hostfs_sbops;
 918         sb->s_d_op = &simple_dentry_operations;
 919         sb->s_maxbytes = MAX_LFS_FILESIZE;
 920 
 921         /* NULL is printed as <NULL> by sprintf: avoid that. */
 922         if (req_root == NULL)
 923                 req_root = "";
 924 
 925         err = -ENOMEM;
 926         sb->s_fs_info = host_root_path =
 927                 kmalloc(strlen(root_ino) + strlen(req_root) + 2, GFP_KERNEL);
 928         if (host_root_path == NULL)
 929                 goto out;
 930 
 931         sprintf(host_root_path, "%s/%s", root_ino, req_root);
 932 
 933         root_inode = new_inode(sb);
 934         if (!root_inode)
 935                 goto out;
 936 
 937         err = read_name(root_inode, host_root_path);
 938         if (err)
 939                 goto out_put;
 940 
 941         if (S_ISLNK(root_inode->i_mode)) {
 942                 char *name = follow_link(host_root_path);
 943                 if (IS_ERR(name)) {
 944                         err = PTR_ERR(name);
 945                         goto out_put;
 946                 }
 947                 err = read_name(root_inode, name);
 948                 kfree(name);
 949                 if (err)
 950                         goto out_put;
 951         }
 952 
 953         err = -ENOMEM;
 954         sb->s_root = d_make_root(root_inode);
 955         if (sb->s_root == NULL)
 956                 goto out;
 957 
 958         return 0;
 959 
 960 out_put:
 961         iput(root_inode);
 962 out:
 963         return err;
 964 }
 965 
 966 static struct dentry *hostfs_read_sb(struct file_system_type *type,
 967                           int flags, const char *dev_name,
 968                           void *data)
 969 {
 970         return mount_nodev(type, flags, data, hostfs_fill_sb_common);
 971 }
 972 
 973 static void hostfs_kill_sb(struct super_block *s)
 974 {
 975         kill_anon_super(s);
 976         kfree(s->s_fs_info);
 977 }
 978 
 979 static struct file_system_type hostfs_type = {
 980         .owner          = THIS_MODULE,
 981         .name           = "hostfs",
 982         .mount          = hostfs_read_sb,
 983         .kill_sb        = hostfs_kill_sb,
 984         .fs_flags       = 0,
 985 };
 986 MODULE_ALIAS_FS("hostfs");
 987 
 988 static int __init init_hostfs(void)
 989 {
 990         return register_filesystem(&hostfs_type);
 991 }
 992 
 993 static void __exit exit_hostfs(void)
 994 {
 995         unregister_filesystem(&hostfs_type);
 996 }
 997 
 998 module_init(init_hostfs)
 999 module_exit(exit_hostfs)
1000 MODULE_LICENSE("GPL");

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