1. 26 5月, 2011 10 次提交
  2. 16 4月, 2011 1 次提交
  3. 31 3月, 2011 1 次提交
  4. 25 3月, 2011 1 次提交
  5. 24 3月, 2011 2 次提交
  6. 23 3月, 2011 1 次提交
  7. 18 3月, 2011 2 次提交
  8. 16 3月, 2011 8 次提交
  9. 15 3月, 2011 4 次提交
    • A
      Allow O_PATH for symlinks · bcda7652
      Al Viro 提交于
      At that point we can't do almost nothing with them.  They can be opened
      with O_PATH, we can manipulate such descriptors with dup(), etc. and
      we can see them in /proc/*/{fd,fdinfo}/*.
      
      We can't (and won't be able to) follow /proc/*/fd/* symlinks for those;
      there's simply not enough information for pathname resolution to go on
      from such point - to resolve a symlink we need to know which directory
      does it live in.
      
      We will be able to do useful things with them after the next commit, though -
      readlinkat() and fchownat() will be possible to use with dfd being an
      O_PATH-opened symlink and empty relative pathname.  Combined with
      open_by_handle() it'll give us a way to do realink-by-handle and
      lchown-by-handle without messing with more redundant syscalls.
      Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
      bcda7652
    • A
      New kind of open files - "location only". · 1abf0c71
      Al Viro 提交于
      New flag for open(2) - O_PATH.  Semantics:
      	* pathname is resolved, but the file itself is _NOT_ opened
      as far as filesystem is concerned.
      	* almost all operations on the resulting descriptors shall
      fail with -EBADF.  Exceptions are:
      	1) operations on descriptors themselves (i.e.
      		close(), dup(), dup2(), dup3(), fcntl(fd, F_DUPFD),
      		fcntl(fd, F_DUPFD_CLOEXEC, ...), fcntl(fd, F_GETFD),
      		fcntl(fd, F_SETFD, ...))
      	2) fcntl(fd, F_GETFL), for a common non-destructive way to
      		check if descriptor is open
      	3) "dfd" arguments of ...at(2) syscalls, i.e. the starting
      		points of pathname resolution
      	* closing such descriptor does *NOT* affect dnotify or
      posix locks.
      	* permissions are checked as usual along the way to file;
      no permission checks are applied to the file itself.  Of course,
      giving such thing to syscall will result in permission checks (at
      the moment it means checking that starting point of ....at() is
      a directory and caller has exec permissions on it).
      
      fget() and fget_light() return NULL on such descriptors; use of
      fget_raw() and fget_raw_light() is needed to get them.  That protects
      existing code from dealing with those things.
      
      There are two things still missing (they come in the next commits):
      one is handling of symlinks (right now we refuse to open them that
      way; see the next commit for semantics related to those) and another
      is descriptor passing via SCM_RIGHTS datagrams.
      Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
      1abf0c71
    • A
      fs: Don't allow to create hardlink for deleted file · aae8a97d
      Aneesh Kumar K.V 提交于
      Add inode->i_nlink == 0 check in VFS. Some of the file systems
      do this internally. A followup patch will remove those instance.
      This is needed to ensure that with link by handle we don't allow
      to create hardlink of an unlinked file. The check also prevent a race
      between unlink and link
      Signed-off-by: NAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
      Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
      aae8a97d
    • A
      New AT_... flag: AT_EMPTY_PATH · f52e0c11
      Al Viro 提交于
      For name_to_handle_at(2) we'll want both ...at()-style syscall that
      would be usable for non-directory descriptors (with empty relative
      pathname).  Introduce new flag (AT_EMPTY_PATH) to deal with that and
      corresponding LOOKUP_EMPTY; teach user_path_at() and path_init() to
      deal with the latter.
      Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
      f52e0c11
  10. 14 3月, 2011 10 次提交
    • A
      open-style analog of vfs_path_lookup() · 73d049a4
      Al Viro 提交于
      new function: file_open_root(dentry, mnt, name, flags) opens the file
      vfs_path_lookup would arrive to.
      
      Note that name can be empty; in that case the usual requirement that
      dentry should be a directory is lifted.
      
      open-coded equivalents switched to it, may_open() got down exactly
      one caller and became static.
      Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
      73d049a4
    • A
      reduce vfs_path_lookup() to do_path_lookup() · 5b6ca027
      Al Viro 提交于
      New lookup flag: LOOKUP_ROOT.  nd->root is set (and held) by caller,
      path_init() starts walking from that place and all pathname resolution
      machinery never drops nd->root if that flag is set.  That turns
      vfs_path_lookup() into a special case of do_path_lookup() *and*
      gets us down to 3 callers of link_path_walk(), making it finally
      feasible to rip the handling of trailing symlink out of link_path_walk().
      That will not only simply the living hell out of it, but make life
      much simpler for unionfs merge.  Trailing symlink handling will
      become iterative, which is a good thing for stack footprint in
      a lot of situations as well.
      Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
      5b6ca027
    • A
      untangle do_lookup() · 5a18fff2
      Al Viro 提交于
      That thing has devolved into rats nest of gotos; sane use of unlikely()
      gets rid of that horror and gives much more readable structure:
      	* make a fast attempt to find a dentry; false negatives are OK.
      In RCU mode if everything went fine, we are done, otherwise just drop
      out of RCU.  If we'd done (RCU) ->d_revalidate() and it had not refused
      outright (i.e. didn't give us -ECHILD), remember its result.
      	* now we are not in RCU mode and hopefully have a dentry.  If we
      do not, lock parent, do full d_lookup() and if that has not found anything,
      allocate and call ->lookup().  If we'd done that ->lookup(), remember that
      dentry is good and we don't need to revalidate it.
      	* now we have a dentry.  If it has ->d_revalidate() and we can't
      skip it, call it.
      	* hopefully dentry is good; if not, either fail (in case of error)
      or try to invalidate it.  If d_invalidate() has succeeded, drop it and
      retry everything as if original attempt had not found a dentry.
      	* now we can finish it up - deal with mountpoint crossing and
      automount.
      Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
      5a18fff2
    • A
      path_openat: clean ELOOP handling a bit · 40b39136
      Al Viro 提交于
      Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
      40b39136
    • A
      do_last: kill a rudiment of old ->d_revalidate() workaround · f374ed5f
      Al Viro 提交于
      There used to be time when ->d_revalidate() couldn't return an error.
      So intents code had lookup_instantiate_filp() stash ERR_PTR(error)
      in nd->intent.open.filp and had it checked after lookup_hash(), to
      catch the otherwise silent failures.  That had been introduced by
      commit 4af4c52f.  These days
      ->d_revalidate() can and does propagate errors back to callers
      explicitly, so this check isn't needed anymore.
      Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
      f374ed5f
    • A
      fold __open_namei_create() and open_will_truncate() into do_last() · 6c0d46c4
      Al Viro 提交于
      ... and clean up a bit more
      Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
      6c0d46c4
    • A
      do_last: unify may_open() call and everyting after it · ca344a89
      Al Viro 提交于
      We have a bunch of diverging codepaths in do_last(); some of
      them converge, but the case of having to create a new file
      duplicates large part of common tail of the rest and exits
      separately.  Massage them so that they could be merged.
      Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
      ca344a89
    • A
      move may_open() from __open_name_create() to do_last() · 9b44f1b3
      Al Viro 提交于
      Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
      9b44f1b3
    • A
      expand finish_open() in its only caller · 0f9d1a10
      Al Viro 提交于
      Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
      0f9d1a10
    • A
      sanitize pathname component hash calculation · 5a202bcd
      Al Viro 提交于
      Lift it to lookup_one_len() and link_path_walk() resp. into the
      same place where we calculated default hash function of the same
      name.
      Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
      5a202bcd