sys_unlinkat  [fs/namei.c]


Removes a directory entry relative to a directory file descriptor.

This system call operates in exactly the same way as either sys_unlink or sys_rmdir (depending on whether or not edx includes the AT_REMOVEDIR flag) except for the differences described below.

Arguments

eax 301
ebx File/directory descriptor.
ecx Pointer to a null-terminated string specifying the pathname.

If that name was the last link to a file and no processes have the file open the file is deleted and the space it was using is made available for reuse.
If the name was the last link to a file but any processes still have the file open the file will remain in existence until the last file descriptor referring to it is closed.
If the name referred to a symbolic link the link is removed.
If the name referred to a socket, fifo or device the name for it is removed but processes which have the object open may continue to use it.

If the pathname is relative, then it is interpreted relative to the directory referred to by the file descriptor ebx (rather than relative to the current working directory of the calling process, as is done by sys_unlink and sys_rmdir for a relative pathname).

If the pathname is relative and ebx is the special value AT_FDCWD, then pathname is interpreted relative to the current working directory of the calling process.

If the pathname is absolute, then ebx is ignored.
edx Bit-mask that can either be specified as 0, or by ORing together flag values that control the operation of sys_unlinkat. Currently only one such flag is defined:
AT_REMOVEDIR By default, sys_unlinkat performs the equivalent of sys_unlink on pathname. If the AT_REMOVEDIR flag is specified, then performs the equivalent of sys_rmdir on pathname.

Return values

If the system call succeeds the return value is 0.
If the system call fails the return value is one of the following errno values:

-EACCES Write access to the directory containing the pathname is not allowed for the process's effective UID, or one of the directories in pathname did not allow search permission.
-EFAULT ecx points outside your accessible address space.
-EIO An I/O error occurred.
-EISDIR Pathname refers to a directory. (This is the non-POSIX value returned by Linux since 2.1.132.)
-ELOOP Too many symbolic links were encountered in translating pathname.
-ENAMETOOLONG Pathname was too long.
-ENOENT A component in pathname does not exist or is a dangling symbolic link, or pathname is empty.
-ENOMEM Insufficient kernel memory was available.
-ENOTDIR A component used as a directory in pathname is not, in fact, a directory.
-or-
Pathname is a relative path and ebx is a file descriptor referring to a file other than a directory.
-EPERM The filesystem does not allow unlinking of files.
-EPERM,
-EACCES
The directory containing pathname has the sticky bit (S_ISVTX) set and the process's effective UID is neither the UID of the file to be deleted nor that of the directory containing it, and the process is not privileged (does not have the CAP_FOWNER capability).
-EROFS Pathname pointed by ecx refers to a file on a read-only filesystem.
-EBADF ebx is not a valid file descriptor.
-EINVAL An invalid flag value was specified in edx.

Remarks

Infelicities in the protocol underlying NFS can cause the unexpected disappearance of files which are still being used.

Compatibility

Available since 2.6.16.