summaryrefslogtreecommitdiffstats
path: root/fs
Commit message (Collapse)AuthorAgeFilesLines
* locks: protect most of the file_lock handling with i_lockJeff Layton2013-06-2911-95/+141
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Having a global lock that protects all of this code is a clear scalability problem. Instead of doing that, move most of the code to be protected by the i_lock instead. The exceptions are the global lists that the ->fl_link sits on, and the ->fl_block list. ->fl_link is what connects these structures to the global lists, so we must ensure that we hold those locks when iterating over or updating these lists. Furthermore, sound deadlock detection requires that we hold the blocked_list state steady while checking for loops. We also must ensure that the search and update to the list are atomic. For the checking and insertion side of the blocked_list, push the acquisition of the global lock into __posix_lock_file and ensure that checking and update of the blocked_list is done without dropping the lock in between. On the removal side, when waking up blocked lock waiters, take the global lock before walking the blocked list and dequeue the waiters from the global list prior to removal from the fl_block list. With this, deadlock detection should be race free while we minimize excessive file_lock_lock thrashing. Finally, in order to avoid a lock inversion problem when handling /proc/locks output we must ensure that manipulations of the fl_block list are also protected by the file_lock_lock. Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* locks: encapsulate the fl_link list handlingJeff Layton2013-06-291-9/+36
| | | | | | | | | | Move the fl_link list handling routines into a separate set of helpers. Also ensure that locks and requests are always put on global lists last (after fully initializing them) and are taken off before unintializing them. Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* locks: make "added" in __posix_lock_file a boolJeff Layton2013-06-291-4/+5
| | | | | | Signed-off-by: Jeff Layton <jlayton@redhat.com> Acked-by: J. Bruce Fields <bfields@fieldses.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* locks: comment cleanups and clarificationsJeff Layton2013-06-291-8/+13
| | | | | Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* locks: make generic_add_lease and generic_delete_lease staticJeff Layton2013-06-291-2/+2
| | | | | | Signed-off-by: Jeff Layton <jlayton@redhat.com> Acked-by: J. Bruce Fields <bfields@fieldses.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* cifs: use posix_unblock_lock instead of locks_delete_blockJeff Layton2013-06-292-3/+2
| | | | | | | | | | | | | | | | commit 66189be74 (CIFS: Fix VFS lock usage for oplocked files) exported the locks_delete_block symbol. There's already an exported helper function that provides this capability however, so make cifs use that instead and turn locks_delete_block back into a static function. Note that if fl->fl_next == NULL then this lock has already been through locks_delete_block(), so we should be OK to ignore an ENOENT error here and simply not retry the lock. Cc: Pavel Shilovsky <piastryyy@gmail.com> Signed-off-by: Jeff Layton <jlayton@redhat.com> Acked-by: J. Bruce Fields <bfields@fieldses.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* locks: drop the unused filp argument to posix_unblock_lockJeff Layton2013-06-292-4/+2
| | | | | Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* Don't pass inode to ->d_hash() and ->d_compare()Linus Torvalds2013-06-2920-144/+95
| | | | | | | | | | | | Instances either don't look at it at all (the majority of cases) or only want it to find the superblock (which can be had as dentry->d_sb). A few cases that want more are actually safe with dentry->d_inode - the only precaution needed is the check that it hadn't been replaced with NULL by rmdir() or by overwriting rename(), which case should be simply treated as cache miss. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* minix: bug widening a binary "not" operationDan Carpenter2013-06-291-1/+1
| | | | | | | | | | | "chunk_size" is an unsigned int and "pos" is an unsigned long. The "& ~(chunk_size-1)" operation clears the high 32 bits unintentionally. The ALIGN() macro does the correct thing. Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
* splice: lift checks from do_splice_from() into callersAl Viro2013-06-291-11/+20
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* constify rw_verify_area()Al Viro2013-06-293-1/+4
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* new helper: fixed_size_llseek()Al Viro2013-06-291-0/+20
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* ecryptfs: switch ecryptfs_decode_and_decrypt_filename() from dentry to sbAl Viro2013-06-294-10/+8
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* fuse: another open-coded file_inode()Al Viro2013-06-291-2/+1
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* btrfs: more open-coded file_inode()Al Viro2013-06-291-4/+4
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* fanotify: quit wanking with FASYNC in ->release()Al Viro2013-06-291-3/+0
| | | | | | | | | ... especially since there's no way to get that sucker on the list fsnotify_fasync() works with - the only thing adding to it is fsnotify_fasync() itself and it's never called for fanotify files while they are opened. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* kill find_inode_number()Al Viro2013-06-292-31/+0
| | | | | | | | the only remaining caller (in ncpfs) is guaranteed to return 0 - we only hit it if we'd just checked that there's no dentry with such name. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* coda: don't bother with find_inode_number()Al Viro2013-06-291-7/+1
| | | | | | | the fallback it's using for dcache misses is actually the same value we would've used for inumber anyway. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* proc_fill_cache(): clean up, get rid of pointless find_inode_number() useAl Viro2013-06-291-23/+13
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* proc_fill_cache(): just make instantiate_t return intAl Viro2013-06-294-49/+43
| | | | | | all instances always return ERR_PTR(-E...) or NULL, anyway Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* proc_pid_readdir(): stop wanking with proc_fill_cache() for /proc/selfAl Viro2013-06-291-3/+3
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* proc_fill_cache(): kill pointless checkAl Viro2013-06-291-4/+2
| | | | | | we'd just checked that child->d_inode is non-NULL, for fuck sake! Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* ncpfs: don't bother with EBUSY on removal of busy directoriesAl Viro2013-06-292-11/+4
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* don't call file_pos_write() if vfs_{read,write}{,v}() failsAl Viro2013-06-291-6/+12
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* Replace a bunch of file->dentry->d_inode refs with file_inode()David Howells2013-06-291-1/+1
| | | | | | | | | | Replace a bunch of file->dentry->d_inode refs with file_inode(). In __fput(), use file->f_inode instead so as not to be affected by any tricks that file_inode() might grow. Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* udf: provide ->tmpfile()Al Viro2013-06-291-0/+24
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* ext3 ->tmpfile() supportAl Viro2013-06-291-1/+46
| | | | | | | In this case we do need a bit more than usual, due to orphan list handling. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* allow the temp files created by open() to be linked toAl Viro2013-06-292-3/+17
| | | | | | | | O_TMPFILE | O_CREAT => linkat() with AT_SYMLINK_FOLLOW and /proc/self/fd/<n> as oldpath (i.e. flink()) will create a link O_TMPFILE | O_CREAT | O_EXCL => ENOENT on attempt to link those guys Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* [O_TMPFILE] it's still short a few helpers, but infrastructure should be OK ↵Al Viro2013-06-295-5/+122
| | | | | | now... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* allow build_open_flags() to return an errorAl Viro2013-06-294-31/+41
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* lift file_*_write out of do_splice_direct()Al Viro2013-06-292-2/+2
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* lift file_*_write out of do_splice_from()Al Viro2013-06-291-4/+5
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* do_last(): fix missing checks for LAST_BIND caseAl Viro2013-06-291-21/+3
| | | | | | | /proc/self/cwd with O_CREAT should fail with EISDIR. /proc/self/exe, OTOH, should fail with ENOTDIR when opened with O_DIRECTORY. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* [readdir] constify ->actorAl Viro2013-06-296-53/+45
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* [readdir] ->readdir() is goneAl Viro2013-06-293-12/+7
| | | | | | everything's converted to ->iterate() Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* [readdir] convert ecryptfsAl Viro2013-06-291-20/+15
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* [readdir] convert codaAl Viro2013-06-291-58/+19
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* [readdir] convert ocfs2Al Viro2013-06-294-113/+61
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* [readdir] convert fatfsAl Viro2013-06-291-50/+54
| | | | | | | ... pox upon the idiotic ioctls; life would be much easier without those. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* [readdir] convert xfsAl Viro2013-06-297-61/+44
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* [readdir] convert btrfsAl Viro2013-06-293-40/+21
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* [readdir] convert hostfsAl Viro2013-06-291-7/+6
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* [readdir] convert afsAl Viro2013-06-291-62/+37
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* [readdir] convert ncpfsAl Viro2013-06-291-43/+35
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* [readdir] convert hfsplusAl Viro2013-06-291-27/+23
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* [readdir] convert hfsAl Viro2013-06-291-26/+23
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* [readdir] convert befsAl Viro2013-06-291-18/+22
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* [readdir] convert cifsAl Viro2013-06-293-100/+82
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* [readdir] convert freevxfsAl Viro2013-06-291-32/+23
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* [readdir] convert fuseAl Viro2013-06-291-20/+17
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
OpenPOWER on IntegriCloud