1. 18 Oct, 2016 1 commit
  2. 08 Oct, 2016 1 commit
  3. 01 Oct, 2016 9 commits
    • Seth Forshee's avatar
      fuse: Use generic xattr ops · 703c7362
      Seth Forshee authored
      
      
      In preparation for posix acl support, rework fuse to use xattr handlers and
      the generic setxattr/getxattr/listxattr callbacks.  Split the xattr code
      out into it's own file, and promote symbols to module-global scope as
      needed.
      
      Functionally these changes have no impact, as fuse still uses a single
      handler for all xattrs which uses the old callbacks.
      Signed-off-by: default avatarSeth Forshee <seth.forshee@canonical.com>
      Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
      703c7362
    • Miklos Szeredi's avatar
      fuse: get rid of fc->flags · 29433a29
      Miklos Szeredi authored
      
      
      Only two flags: "default_permissions" and "allow_other".  All other flags
      are handled via bitfields.  So convert these two as well.  They don't
      change during the lifetime of the filesystem, so this is quite safe.
      Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
      29433a29
    • Miklos Szeredi's avatar
      fuse: listxattr: verify xattr list · cb3ae6d2
      Miklos Szeredi authored
      
      
      Make sure userspace filesystem is returning a well formed list of xattr
      names (zero or more nonzero length, null terminated strings).
      
      [Michael Theall: only verify in the nonzero size case]
      Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
      Cc: <stable@vger.kernel.org>
      cb3ae6d2
    • Miklos Szeredi's avatar
      fuse: use timespec64 · bcb6f6d2
      Miklos Szeredi authored
      
      
      And check for valid nsec value before passing into timespec64_to_jiffies().
      Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
      bcb6f6d2
    • Miklos Szeredi's avatar
      fuse: don't use ->d_time · f75fdf22
      Miklos Szeredi authored
      
      
      Store in memory pointed to by ->d_fsdata.  Use ->d_init() to allocate the
      storage.  Need to use RCU freeing because the data is used in RCU lookup
      mode.
      
      We could cast ->d_fsdata directly on 64bit archs, but I don't think this is
      worth the extra complexity.
      Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
      f75fdf22
    • Seth Forshee's avatar
      fuse: Add posix ACL support · 60bcc88a
      Seth Forshee authored
      
      
      Add a new INIT flag, FUSE_POSIX_ACL, for negotiating ACL support with
      userspace.  When it is set in the INIT response, ACL support will be
      enabled.  ACL support also implies "default_permissions".
      
      When ACL support is enabled, the kernel will cache and have responsibility
      for enforcing ACLs.  ACL xattrs will be passed to userspace, which is
      responsible for updating the ACLs in the filesystem, keeping the file mode
      in sync, and inheritance of default ACLs when new filesystem nodes are
      created.
      Signed-off-by: default avatarSeth Forshee <seth.forshee@canonical.com>
      Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
      60bcc88a
    • Miklos Szeredi's avatar
      fuse: handle killpriv in userspace fs · 5e940c1d
      Miklos Szeredi authored
      
      
      Only userspace filesystem can do the killing of suid/sgid without races.
      So introduce an INIT flag and negotiate support for this.
      Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
      5e940c1d
    • Miklos Szeredi's avatar
      fuse: fix killing s[ug]id in setattr · a09f99ed
      Miklos Szeredi authored
      
      
      Fuse allowed VFS to set mode in setattr in order to clear suid/sgid on
      chown and truncate, and (since writeback_cache) write.  The problem with
      this is that it'll potentially restore a stale mode.
      
      The poper fix would be to let the filesystems do the suid/sgid clearing on
      the relevant operations.  Possibly some are already doing it but there's no
      way we can detect this.
      
      So fix this by refreshing and recalculating the mode.  Do this only if
      ATTR_KILL_S[UG]ID is set to not destroy performance for writes.  This is
      still racy but the size of the window is reduced.
      Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
      Cc: <stable@vger.kernel.org>
      a09f99ed
    • Miklos Szeredi's avatar
      fuse: invalidate dir dentry after chmod · 5e2b8828
      Miklos Szeredi authored
      
      
      Without "default_permissions" the userspace filesystem's lookup operation
      needs to perform the check for search permission on the directory.
      
      If directory does not allow search for everyone (this is quite rare) then
      userspace filesystem has to set entry timeout to zero to make sure
      permissions are always performed.
      
      Changing the mode bits of the directory should also invalidate the
      (previously cached) dentry to make sure the next lookup will have a chance
      of updating the timeout, if needed.
      Reported-by: default avatarJean-Pierre André <jean-pierre.andre@wanadoo.fr>
      Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
      Cc: <stable@vger.kernel.org>
      5e2b8828
  4. 28 Sep, 2016 1 commit
  5. 27 Sep, 2016 1 commit
  6. 22 Sep, 2016 2 commits
  7. 30 Jul, 2016 1 commit
  8. 05 Jul, 2016 1 commit
  9. 30 Jun, 2016 1 commit
  10. 11 Jun, 2016 1 commit
    • Linus Torvalds's avatar
      vfs: make the string hashes salt the hash · 8387ff25
      Linus Torvalds authored
      
      
      We always mixed in the parent pointer into the dentry name hash, but we
      did it late at lookup time.  It turns out that we can simplify that
      lookup-time action by salting the hash with the parent pointer early
      instead of late.
      
      A few other users of our string hashes also wanted to mix in their own
      pointers into the hash, and those are updated to use the same mechanism.
      
      Hash users that don't have any particular initial salt can just use the
      NULL pointer as a no-salt.
      
      Cc: Vegard Nossum <vegard.nossum@oracle.com>
      Cc: George Spelvin <linux@sciencehorizons.net>
      Cc: Al Viro <viro@zeniv.linux.org.uk>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      8387ff25
  11. 28 May, 2016 1 commit
  12. 02 May, 2016 1 commit
  13. 11 Apr, 2016 1 commit
  14. 22 Jan, 2016 1 commit
    • Al Viro's avatar
      wrappers for ->i_mutex access · 5955102c
      Al Viro authored
      
      
      parallel to mutex_{lock,unlock,trylock,is_locked,lock_nested},
      inode_foo(inode) being mutex_foo(&inode->i_mutex).
      
      Please, use those for access to ->i_mutex; over the coming cycle
      ->i_mutex will become rwsem, with ->lookup() done with it held
      only shared.
      Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
      5955102c
  15. 30 Dec, 2015 1 commit
  16. 29 Dec, 2015 1 commit
  17. 09 Dec, 2015 1 commit
    • Al Viro's avatar
      replace ->follow_link() with new method that could stay in RCU mode · 6b255391
      Al Viro authored
      
      
      new method: ->get_link(); replacement of ->follow_link().  The differences
      are:
      	* inode and dentry are passed separately
      	* might be called both in RCU and non-RCU mode;
      the former is indicated by passing it a NULL dentry.
      	* when called that way it isn't allowed to block
      and should return ERR_PTR(-ECHILD) if it needs to be called
      in non-RCU mode.
      
      It's a flagday change - the old method is gone, all in-tree instances
      converted.  Conversion isn't hard; said that, so far very few instances
      do not immediately bail out when called in RCU mode.  That'll change
      in the next commits.
      Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
      6b255391
  18. 11 May, 2015 4 commits
  19. 15 Apr, 2015 1 commit
  20. 22 Feb, 2015 1 commit
    • David Howells's avatar
      VFS: (Scripted) Convert S_ISLNK/DIR/REG(dentry->d_inode) to d_is_*(dentry) · e36cb0b8
      David Howells authored
      
      
      Convert the following where appropriate:
      
       (1) S_ISLNK(dentry->d_inode) to d_is_symlink(dentry).
      
       (2) S_ISREG(dentry->d_inode) to d_is_reg(dentry).
      
       (3) S_ISDIR(dentry->d_inode) to d_is_dir(dentry).  This is actually more
           complicated than it appears as some calls should be converted to
           d_can_lookup() instead.  The difference is whether the directory in
           question is a real dir with a ->lookup op or whether it's a fake dir with
           a ->d_automount op.
      
      In some circumstances, we can subsume checks for dentry->d_inode not being
      NULL into this, provided we the code isn't in a filesystem that expects
      d_inode to be NULL if the dirent really *is* negative (ie. if we're going to
      use d_inode() rather than d_backing_inode() to get the inode pointer).
      
      Note that the dentry type field may be set to something other than
      DCACHE_MISS_TYPE when d_inode is NULL in the case of unionmount, where the VFS
      manages the fall-through from a negative dentry to a lower layer.  In such a
      case, the dentry type of the negative union dentry is set to the same as the
      type of the lower dentry.
      
      However, if you know d_inode is not NULL at the call site, then you can use
      the d_is_xxx() functions even in a filesystem.
      
      There is one further complication: a 0,0 chardev dentry may be labelled
      DCACHE_WHITEOUT_TYPE rather than DCACHE_SPECIAL_TYPE.  Strictly, this was
      intended for special directory entry types that don't have attached inodes.
      
      The following perl+coccinelle script was used:
      
      use strict;
      
      my @callers;
      open($fd, 'git grep -l \'S_IS[A-Z].*->d_inode\' |') ||
          die "Can't grep for S_ISDIR and co. callers";
      @callers = <$fd>;
      close($fd);
      unless (@callers) {
          print "No matches\n";
          exit(0);
      }
      
      my @cocci = (
          '@@',
          'expression E;',
          '@@',
          '',
          '- S_ISLNK(E->d_inode->i_mode)',
          '+ d_is_symlink(E)',
          '',
          '@@',
          'expression E;',
          '@@',
          '',
          '- S_ISDIR(E->d_inode->i_mode)',
          '+ d_is_dir(E)',
          '',
          '@@',
          'expression E;',
          '@@',
          '',
          '- S_ISREG(E->d_inode->i_mode)',
          '+ d_is_reg(E)' );
      
      my $coccifile = "tmp.sp.cocci";
      open($fd, ">$coccifile") || die $coccifile;
      print($fd "$_\n") || die $coccifile foreach (@cocci);
      close($fd);
      
      foreach my $file (@callers) {
          chomp $file;
          print "Processing ", $file, "\n";
          system("spatch", "--sp-file", $coccifile, $file, "--in-place", "--no-show-diff") == 0 ||
      	die "spatch failed";
      }
      
      [AV: overlayfs parts skipped]
      Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
      Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
      e36cb0b8
  21. 06 Jan, 2015 1 commit
    • Miklos Szeredi's avatar
      fuse: fix LOOKUP vs INIT compat handling · 21f62174
      Miklos Szeredi authored
      Analysis from Marc:
      
       "Commit 7078187a
      
       ("fuse: introduce fuse_simple_request() helper")
        from the above pull request triggers some EIO errors for me in some tests
        that rely on fuse
      
        Looking at the code changes and a bit of debugging info I think there's a
        general problem here that fuse_get_req checks and possibly waits for
        fc->initialized, and this was always called first.  But this commit
        changes the ordering and in many places fc->minor is now possibly used
        before fuse_get_req, and we can't be sure that fc has been initialized.
        In my case fuse_lookup_init sets req->out.args[0].size to the wrong size
        because fc->minor at that point is still 0, leading to the EIO error."
      
      Fix by moving the compat adjustments into fuse_simple_request() to after
      fuse_get_req().
      
      This is also more readable than the original, since now compatibility is
      handled in a single function instead of cluttering each operation.
      Reported-by: default avatarMarc Dionne <marc.c.dionne@gmail.com>
      Tested-by: default avatarMarc Dionne <marc.c.dionne@gmail.com>
      Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>
      Fixes: 7078187a ("fuse: introduce fuse_simple_request() helper")
      21f62174
  22. 12 Dec, 2014 1 commit
    • Miklos Szeredi's avatar
      fuse: introduce fuse_simple_request() helper · 7078187a
      Miklos Szeredi authored
      
      
      The following pattern is repeated many times:
      
      	req = fuse_get_req_nopages(fc);
      	/* Initialize req->(in|out).args */
      	fuse_request_send(fc, req);
      	err = req->out.h.error;
      	fuse_put_request(req);
      
      Create a new replacement helper:
      
      	/* Initialize args */
      	err = fuse_simple_request(fc, &args);
      
      In addition to reducing the code size, this will ease moving from the
      complex arg-based to a simpler page-based I/O on the fuse device.
      Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>
      7078187a
  23. 19 Nov, 2014 1 commit
  24. 09 Oct, 2014 2 commits
  25. 07 Aug, 2014 1 commit
  26. 10 Jul, 2014 1 commit
  27. 07 Jul, 2014 1 commit
    • Anand Avati's avatar
      fuse: ignore entry-timeout on LOOKUP_REVAL · 154210cc
      Anand Avati authored
      
      
      The following test case demonstrates the bug:
      
        sh# mount -t glusterfs localhost:meta-test /mnt/one
      
        sh# mount -t glusterfs localhost:meta-test /mnt/two
      
        sh# echo stuff > /mnt/one/file; rm -f /mnt/two/file; echo stuff > /mnt/one/file
        bash: /mnt/one/file: Stale file handle
      
        sh# echo stuff > /mnt/one/file; rm -f /mnt/two/file; sleep 1; echo stuff > /mnt/one/file
      
      On the second open() on /mnt/one, FUSE would have used the old
      nodeid (file handle) trying to re-open it. Gluster is returning
      -ESTALE. The ESTALE propagates back to namei.c:filename_lookup()
      where lookup is re-attempted with LOOKUP_REVAL. The right
      behavior now, would be for FUSE to ignore the entry-timeout and
      and do the up-call revalidation. Instead FUSE is ignoring
      LOOKUP_REVAL, succeeding the revalidation (because entry-timeout
      has not passed), and open() is again retried on the old file
      handle and finally the ESTALE is going back to the application.
      
      Fix: if revalidation is happening with LOOKUP_REVAL, then ignore
      entry-timeout and always do the up-call.
      Signed-off-by: default avatarAnand Avati <avati@redhat.com>
      Reviewed-by: default avatarNiels de Vos <ndevos@redhat.com>
      Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>
      Cc: stable@vger.kernel.org
      154210cc