diff options
Diffstat (limited to 'Documentation/filesystems/Locking')
-rw-r--r-- | Documentation/filesystems/Locking | 219 |
1 files changed, 106 insertions, 113 deletions
diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking index a91f30890011..33fa3e5d38fd 100644 --- a/Documentation/filesystems/Locking +++ b/Documentation/filesystems/Locking | |||
@@ -18,7 +18,6 @@ prototypes: | |||
18 | char *(*d_dname)((struct dentry *dentry, char *buffer, int buflen); | 18 | char *(*d_dname)((struct dentry *dentry, char *buffer, int buflen); |
19 | 19 | ||
20 | locking rules: | 20 | locking rules: |
21 | none have BKL | ||
22 | dcache_lock rename_lock ->d_lock may block | 21 | dcache_lock rename_lock ->d_lock may block |
23 | d_revalidate: no no no yes | 22 | d_revalidate: no no no yes |
24 | d_hash no no no yes | 23 | d_hash no no no yes |
@@ -42,18 +41,23 @@ ata *); | |||
42 | int (*rename) (struct inode *, struct dentry *, | 41 | int (*rename) (struct inode *, struct dentry *, |
43 | struct inode *, struct dentry *); | 42 | struct inode *, struct dentry *); |
44 | int (*readlink) (struct dentry *, char __user *,int); | 43 | int (*readlink) (struct dentry *, char __user *,int); |
45 | int (*follow_link) (struct dentry *, struct nameidata *); | 44 | void * (*follow_link) (struct dentry *, struct nameidata *); |
45 | void (*put_link) (struct dentry *, struct nameidata *, void *); | ||
46 | void (*truncate) (struct inode *); | 46 | void (*truncate) (struct inode *); |
47 | int (*permission) (struct inode *, int, struct nameidata *); | 47 | int (*permission) (struct inode *, int, struct nameidata *); |
48 | int (*check_acl)(struct inode *, int); | ||
48 | int (*setattr) (struct dentry *, struct iattr *); | 49 | int (*setattr) (struct dentry *, struct iattr *); |
49 | int (*getattr) (struct vfsmount *, struct dentry *, struct kstat *); | 50 | int (*getattr) (struct vfsmount *, struct dentry *, struct kstat *); |
50 | int (*setxattr) (struct dentry *, const char *,const void *,size_t,int); | 51 | int (*setxattr) (struct dentry *, const char *,const void *,size_t,int); |
51 | ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); | 52 | ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); |
52 | ssize_t (*listxattr) (struct dentry *, char *, size_t); | 53 | ssize_t (*listxattr) (struct dentry *, char *, size_t); |
53 | int (*removexattr) (struct dentry *, const char *); | 54 | int (*removexattr) (struct dentry *, const char *); |
55 | void (*truncate_range)(struct inode *, loff_t, loff_t); | ||
56 | long (*fallocate)(struct inode *inode, int mode, loff_t offset, loff_t len); | ||
57 | int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, u64 len); | ||
54 | 58 | ||
55 | locking rules: | 59 | locking rules: |
56 | all may block, none have BKL | 60 | all may block |
57 | i_mutex(inode) | 61 | i_mutex(inode) |
58 | lookup: yes | 62 | lookup: yes |
59 | create: yes | 63 | create: yes |
@@ -66,19 +70,24 @@ rmdir: yes (both) (see below) | |||
66 | rename: yes (all) (see below) | 70 | rename: yes (all) (see below) |
67 | readlink: no | 71 | readlink: no |
68 | follow_link: no | 72 | follow_link: no |
73 | put_link: no | ||
69 | truncate: yes (see below) | 74 | truncate: yes (see below) |
70 | setattr: yes | 75 | setattr: yes |
71 | permission: no | 76 | permission: no |
77 | check_acl: no | ||
72 | getattr: no | 78 | getattr: no |
73 | setxattr: yes | 79 | setxattr: yes |
74 | getxattr: no | 80 | getxattr: no |
75 | listxattr: no | 81 | listxattr: no |
76 | removexattr: yes | 82 | removexattr: yes |
83 | truncate_range: yes | ||
84 | fallocate: no | ||
85 | fiemap: no | ||
77 | Additionally, ->rmdir(), ->unlink() and ->rename() have ->i_mutex on | 86 | Additionally, ->rmdir(), ->unlink() and ->rename() have ->i_mutex on |
78 | victim. | 87 | victim. |
79 | cross-directory ->rename() has (per-superblock) ->s_vfs_rename_sem. | 88 | cross-directory ->rename() has (per-superblock) ->s_vfs_rename_sem. |
80 | ->truncate() is never called directly - it's a callback, not a | 89 | ->truncate() is never called directly - it's a callback, not a |
81 | method. It's called by vmtruncate() - library function normally used by | 90 | method. It's called by vmtruncate() - deprecated library function used by |
82 | ->setattr(). Locking information above applies to that call (i.e. is | 91 | ->setattr(). Locking information above applies to that call (i.e. is |
83 | inherited from ->setattr() - vmtruncate() is used when ATTR_SIZE had been | 92 | inherited from ->setattr() - vmtruncate() is used when ATTR_SIZE had been |
84 | passed). | 93 | passed). |
@@ -91,7 +100,7 @@ prototypes: | |||
91 | struct inode *(*alloc_inode)(struct super_block *sb); | 100 | struct inode *(*alloc_inode)(struct super_block *sb); |
92 | void (*destroy_inode)(struct inode *); | 101 | void (*destroy_inode)(struct inode *); |
93 | void (*dirty_inode) (struct inode *); | 102 | void (*dirty_inode) (struct inode *); |
94 | int (*write_inode) (struct inode *, int); | 103 | int (*write_inode) (struct inode *, struct writeback_control *wbc); |
95 | int (*drop_inode) (struct inode *); | 104 | int (*drop_inode) (struct inode *); |
96 | void (*evict_inode) (struct inode *); | 105 | void (*evict_inode) (struct inode *); |
97 | void (*put_super) (struct super_block *); | 106 | void (*put_super) (struct super_block *); |
@@ -105,10 +114,10 @@ prototypes: | |||
105 | int (*show_options)(struct seq_file *, struct vfsmount *); | 114 | int (*show_options)(struct seq_file *, struct vfsmount *); |
106 | ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t); | 115 | ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t); |
107 | ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); | 116 | ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); |
117 | int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t); | ||
108 | 118 | ||
109 | locking rules: | 119 | locking rules: |
110 | All may block [not true, see below] | 120 | All may block [not true, see below] |
111 | None have BKL | ||
112 | s_umount | 121 | s_umount |
113 | alloc_inode: | 122 | alloc_inode: |
114 | destroy_inode: | 123 | destroy_inode: |
@@ -127,6 +136,7 @@ umount_begin: no | |||
127 | show_options: no (namespace_sem) | 136 | show_options: no (namespace_sem) |
128 | quota_read: no (see below) | 137 | quota_read: no (see below) |
129 | quota_write: no (see below) | 138 | quota_write: no (see below) |
139 | bdev_try_to_free_page: no (see below) | ||
130 | 140 | ||
131 | ->statfs() has s_umount (shared) when called by ustat(2) (native or | 141 | ->statfs() has s_umount (shared) when called by ustat(2) (native or |
132 | compat), but that's an accident of bad API; s_umount is used to pin | 142 | compat), but that's an accident of bad API; s_umount is used to pin |
@@ -139,19 +149,25 @@ be the only ones operating on the quota file by the quota code (via | |||
139 | dqio_sem) (unless an admin really wants to screw up something and | 149 | dqio_sem) (unless an admin really wants to screw up something and |
140 | writes to quota files with quotas on). For other details about locking | 150 | writes to quota files with quotas on). For other details about locking |
141 | see also dquot_operations section. | 151 | see also dquot_operations section. |
152 | ->bdev_try_to_free_page is called from the ->releasepage handler of | ||
153 | the block device inode. See there for more details. | ||
142 | 154 | ||
143 | --------------------------- file_system_type --------------------------- | 155 | --------------------------- file_system_type --------------------------- |
144 | prototypes: | 156 | prototypes: |
145 | int (*get_sb) (struct file_system_type *, int, | 157 | int (*get_sb) (struct file_system_type *, int, |
146 | const char *, void *, struct vfsmount *); | 158 | const char *, void *, struct vfsmount *); |
159 | struct dentry *(*mount) (struct file_system_type *, int, | ||
160 | const char *, void *); | ||
147 | void (*kill_sb) (struct super_block *); | 161 | void (*kill_sb) (struct super_block *); |
148 | locking rules: | 162 | locking rules: |
149 | may block BKL | 163 | may block |
150 | get_sb yes no | 164 | get_sb yes |
151 | kill_sb yes no | 165 | mount yes |
166 | kill_sb yes | ||
152 | 167 | ||
153 | ->get_sb() returns error or 0 with locked superblock attached to the vfsmount | 168 | ->get_sb() returns error or 0 with locked superblock attached to the vfsmount |
154 | (exclusive on ->s_umount). | 169 | (exclusive on ->s_umount). |
170 | ->mount() returns ERR_PTR or the root dentry. | ||
155 | ->kill_sb() takes a write-locked superblock, does all shutdown work on it, | 171 | ->kill_sb() takes a write-locked superblock, does all shutdown work on it, |
156 | unlocks and drops the reference. | 172 | unlocks and drops the reference. |
157 | 173 | ||
@@ -173,28 +189,38 @@ prototypes: | |||
173 | sector_t (*bmap)(struct address_space *, sector_t); | 189 | sector_t (*bmap)(struct address_space *, sector_t); |
174 | int (*invalidatepage) (struct page *, unsigned long); | 190 | int (*invalidatepage) (struct page *, unsigned long); |
175 | int (*releasepage) (struct page *, int); | 191 | int (*releasepage) (struct page *, int); |
192 | void (*freepage)(struct page *); | ||
176 | int (*direct_IO)(int, struct kiocb *, const struct iovec *iov, | 193 | int (*direct_IO)(int, struct kiocb *, const struct iovec *iov, |
177 | loff_t offset, unsigned long nr_segs); | 194 | loff_t offset, unsigned long nr_segs); |
178 | int (*launder_page) (struct page *); | 195 | int (*get_xip_mem)(struct address_space *, pgoff_t, int, void **, |
196 | unsigned long *); | ||
197 | int (*migratepage)(struct address_space *, struct page *, struct page *); | ||
198 | int (*launder_page)(struct page *); | ||
199 | int (*is_partially_uptodate)(struct page *, read_descriptor_t *, unsigned long); | ||
200 | int (*error_remove_page)(struct address_space *, struct page *); | ||
179 | 201 | ||
180 | locking rules: | 202 | locking rules: |
181 | All except set_page_dirty may block | 203 | All except set_page_dirty and freepage may block |
182 | 204 | ||
183 | BKL PageLocked(page) i_mutex | 205 | PageLocked(page) i_mutex |
184 | writepage: no yes, unlocks (see below) | 206 | writepage: yes, unlocks (see below) |
185 | readpage: no yes, unlocks | 207 | readpage: yes, unlocks |
186 | sync_page: no maybe | 208 | sync_page: maybe |
187 | writepages: no | 209 | writepages: |
188 | set_page_dirty no no | 210 | set_page_dirty no |
189 | readpages: no | 211 | readpages: |
190 | write_begin: no locks the page yes | 212 | write_begin: locks the page yes |
191 | write_end: no yes, unlocks yes | 213 | write_end: yes, unlocks yes |
192 | perform_write: no n/a yes | 214 | bmap: |
193 | bmap: no | 215 | invalidatepage: yes |
194 | invalidatepage: no yes | 216 | releasepage: yes |
195 | releasepage: no yes | 217 | freepage: yes |
196 | direct_IO: no | 218 | direct_IO: |
197 | launder_page: no yes | 219 | get_xip_mem: maybe |
220 | migratepage: yes (both) | ||
221 | launder_page: yes | ||
222 | is_partially_uptodate: yes | ||
223 | error_remove_page: yes | ||
198 | 224 | ||
199 | ->write_begin(), ->write_end(), ->sync_page() and ->readpage() | 225 | ->write_begin(), ->write_end(), ->sync_page() and ->readpage() |
200 | may be called from the request handler (/dev/loop). | 226 | may be called from the request handler (/dev/loop). |
@@ -274,9 +300,8 @@ under spinlock (it cannot block) and is sometimes called with the page | |||
274 | not locked. | 300 | not locked. |
275 | 301 | ||
276 | ->bmap() is currently used by legacy ioctl() (FIBMAP) provided by some | 302 | ->bmap() is currently used by legacy ioctl() (FIBMAP) provided by some |
277 | filesystems and by the swapper. The latter will eventually go away. All | 303 | filesystems and by the swapper. The latter will eventually go away. Please, |
278 | instances do not actually need the BKL. Please, keep it that way and don't | 304 | keep it that way and don't breed new callers. |
279 | breed new callers. | ||
280 | 305 | ||
281 | ->invalidatepage() is called when the filesystem must attempt to drop | 306 | ->invalidatepage() is called when the filesystem must attempt to drop |
282 | some or all of the buffers from the page when it is being truncated. It | 307 | some or all of the buffers from the page when it is being truncated. It |
@@ -288,53 +313,46 @@ buffers from the page in preparation for freeing it. It returns zero to | |||
288 | indicate that the buffers are (or may be) freeable. If ->releasepage is zero, | 313 | indicate that the buffers are (or may be) freeable. If ->releasepage is zero, |
289 | the kernel assumes that the fs has no private interest in the buffers. | 314 | the kernel assumes that the fs has no private interest in the buffers. |
290 | 315 | ||
316 | ->freepage() is called when the kernel is done dropping the page | ||
317 | from the page cache. | ||
318 | |||
291 | ->launder_page() may be called prior to releasing a page if | 319 | ->launder_page() may be called prior to releasing a page if |
292 | it is still found to be dirty. It returns zero if the page was successfully | 320 | it is still found to be dirty. It returns zero if the page was successfully |
293 | cleaned, or an error value if not. Note that in order to prevent the page | 321 | cleaned, or an error value if not. Note that in order to prevent the page |
294 | getting mapped back in and redirtied, it needs to be kept locked | 322 | getting mapped back in and redirtied, it needs to be kept locked |
295 | across the entire operation. | 323 | across the entire operation. |
296 | 324 | ||
297 | Note: currently almost all instances of address_space methods are | ||
298 | using BKL for internal serialization and that's one of the worst sources | ||
299 | of contention. Normally they are calling library functions (in fs/buffer.c) | ||
300 | and pass foo_get_block() as a callback (on local block-based filesystems, | ||
301 | indeed). BKL is not needed for library stuff and is usually taken by | ||
302 | foo_get_block(). It's an overkill, since block bitmaps can be protected by | ||
303 | internal fs locking and real critical areas are much smaller than the areas | ||
304 | filesystems protect now. | ||
305 | |||
306 | ----------------------- file_lock_operations ------------------------------ | 325 | ----------------------- file_lock_operations ------------------------------ |
307 | prototypes: | 326 | prototypes: |
308 | void (*fl_insert)(struct file_lock *); /* lock insertion callback */ | ||
309 | void (*fl_remove)(struct file_lock *); /* lock removal callback */ | ||
310 | void (*fl_copy_lock)(struct file_lock *, struct file_lock *); | 327 | void (*fl_copy_lock)(struct file_lock *, struct file_lock *); |
311 | void (*fl_release_private)(struct file_lock *); | 328 | void (*fl_release_private)(struct file_lock *); |
312 | 329 | ||
313 | 330 | ||
314 | locking rules: | 331 | locking rules: |
315 | BKL may block | 332 | file_lock_lock may block |
316 | fl_insert: yes no | 333 | fl_copy_lock: yes no |
317 | fl_remove: yes no | 334 | fl_release_private: maybe no |
318 | fl_copy_lock: yes no | ||
319 | fl_release_private: yes yes | ||
320 | 335 | ||
321 | ----------------------- lock_manager_operations --------------------------- | 336 | ----------------------- lock_manager_operations --------------------------- |
322 | prototypes: | 337 | prototypes: |
323 | int (*fl_compare_owner)(struct file_lock *, struct file_lock *); | 338 | int (*fl_compare_owner)(struct file_lock *, struct file_lock *); |
324 | void (*fl_notify)(struct file_lock *); /* unblock callback */ | 339 | void (*fl_notify)(struct file_lock *); /* unblock callback */ |
340 | int (*fl_grant)(struct file_lock *, struct file_lock *, int); | ||
325 | void (*fl_release_private)(struct file_lock *); | 341 | void (*fl_release_private)(struct file_lock *); |
326 | void (*fl_break)(struct file_lock *); /* break_lease callback */ | 342 | void (*fl_break)(struct file_lock *); /* break_lease callback */ |
343 | int (*fl_mylease)(struct file_lock *, struct file_lock *); | ||
344 | int (*fl_change)(struct file_lock **, int); | ||
327 | 345 | ||
328 | locking rules: | 346 | locking rules: |
329 | BKL may block | 347 | file_lock_lock may block |
330 | fl_compare_owner: yes no | 348 | fl_compare_owner: yes no |
331 | fl_notify: yes no | 349 | fl_notify: yes no |
332 | fl_release_private: yes yes | 350 | fl_grant: no no |
333 | fl_break: yes no | 351 | fl_release_private: maybe no |
334 | 352 | fl_break: yes no | |
335 | Currently only NFSD and NLM provide instances of this class. None of the | 353 | fl_mylease: yes no |
336 | them block. If you have out-of-tree instances - please, show up. Locking | 354 | fl_change yes no |
337 | in that area will change. | 355 | |
338 | --------------------------- buffer_head ----------------------------------- | 356 | --------------------------- buffer_head ----------------------------------- |
339 | prototypes: | 357 | prototypes: |
340 | void (*b_end_io)(struct buffer_head *bh, int uptodate); | 358 | void (*b_end_io)(struct buffer_head *bh, int uptodate); |
@@ -359,17 +377,17 @@ prototypes: | |||
359 | void (*swap_slot_free_notify) (struct block_device *, unsigned long); | 377 | void (*swap_slot_free_notify) (struct block_device *, unsigned long); |
360 | 378 | ||
361 | locking rules: | 379 | locking rules: |
362 | BKL bd_mutex | 380 | bd_mutex |
363 | open: no yes | 381 | open: yes |
364 | release: no yes | 382 | release: yes |
365 | ioctl: no no | 383 | ioctl: no |
366 | compat_ioctl: no no | 384 | compat_ioctl: no |
367 | direct_access: no no | 385 | direct_access: no |
368 | media_changed: no no | 386 | media_changed: no |
369 | unlock_native_capacity: no no | 387 | unlock_native_capacity: no |
370 | revalidate_disk: no no | 388 | revalidate_disk: no |
371 | getgeo: no no | 389 | getgeo: no |
372 | swap_slot_free_notify: no no (see below) | 390 | swap_slot_free_notify: no (see below) |
373 | 391 | ||
374 | media_changed, unlock_native_capacity and revalidate_disk are called only from | 392 | media_changed, unlock_native_capacity and revalidate_disk are called only from |
375 | check_disk_change(). | 393 | check_disk_change(). |
@@ -408,34 +426,21 @@ prototypes: | |||
408 | unsigned long (*get_unmapped_area)(struct file *, unsigned long, | 426 | unsigned long (*get_unmapped_area)(struct file *, unsigned long, |
409 | unsigned long, unsigned long, unsigned long); | 427 | unsigned long, unsigned long, unsigned long); |
410 | int (*check_flags)(int); | 428 | int (*check_flags)(int); |
429 | int (*flock) (struct file *, int, struct file_lock *); | ||
430 | ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, | ||
431 | size_t, unsigned int); | ||
432 | ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, | ||
433 | size_t, unsigned int); | ||
434 | int (*setlease)(struct file *, long, struct file_lock **); | ||
411 | }; | 435 | }; |
412 | 436 | ||
413 | locking rules: | 437 | locking rules: |
414 | All may block. | 438 | All may block except for ->setlease. |
415 | BKL | 439 | No VFS locks held on entry except for ->fsync and ->setlease. |
416 | llseek: no (see below) | 440 | |
417 | read: no | 441 | ->fsync() has i_mutex on inode. |
418 | aio_read: no | 442 | |
419 | write: no | 443 | ->setlease has the file_list_lock held and must not sleep. |
420 | aio_write: no | ||
421 | readdir: no | ||
422 | poll: no | ||
423 | unlocked_ioctl: no | ||
424 | compat_ioctl: no | ||
425 | mmap: no | ||
426 | open: no | ||
427 | flush: no | ||
428 | release: no | ||
429 | fsync: no (see below) | ||
430 | aio_fsync: no | ||
431 | fasync: no | ||
432 | lock: yes | ||
433 | readv: no | ||
434 | writev: no | ||
435 | sendfile: no | ||
436 | sendpage: no | ||
437 | get_unmapped_area: no | ||
438 | check_flags: no | ||
439 | 444 | ||
440 | ->llseek() locking has moved from llseek to the individual llseek | 445 | ->llseek() locking has moved from llseek to the individual llseek |
441 | implementations. If your fs is not using generic_file_llseek, you | 446 | implementations. If your fs is not using generic_file_llseek, you |
@@ -445,17 +450,10 @@ mutex or just to use i_size_read() instead. | |||
445 | Note: this does not protect the file->f_pos against concurrent modifications | 450 | Note: this does not protect the file->f_pos against concurrent modifications |
446 | since this is something the userspace has to take care about. | 451 | since this is something the userspace has to take care about. |
447 | 452 | ||
448 | Note: ext2_release() was *the* source of contention on fs-intensive | 453 | ->fasync() is responsible for maintaining the FASYNC bit in filp->f_flags. |
449 | loads and dropping BKL on ->release() helps to get rid of that (we still | 454 | Most instances call fasync_helper(), which does that maintenance, so it's |
450 | grab BKL for cases when we close a file that had been opened r/w, but that | 455 | not normally something one needs to worry about. Return values > 0 will be |
451 | can and should be done using the internal locking with smaller critical areas). | 456 | mapped to zero in the VFS layer. |
452 | Current worst offender is ext2_get_block()... | ||
453 | |||
454 | ->fasync() is called without BKL protection, and is responsible for | ||
455 | maintaining the FASYNC bit in filp->f_flags. Most instances call | ||
456 | fasync_helper(), which does that maintenance, so it's not normally | ||
457 | something one needs to worry about. Return values > 0 will be mapped to | ||
458 | zero in the VFS layer. | ||
459 | 457 | ||
460 | ->readdir() and ->ioctl() on directories must be changed. Ideally we would | 458 | ->readdir() and ->ioctl() on directories must be changed. Ideally we would |
461 | move ->readdir() to inode_operations and use a separate method for directory | 459 | move ->readdir() to inode_operations and use a separate method for directory |
@@ -466,8 +464,6 @@ components. And there are other reasons why the current interface is a mess... | |||
466 | ->read on directories probably must go away - we should just enforce -EISDIR | 464 | ->read on directories probably must go away - we should just enforce -EISDIR |
467 | in sys_read() and friends. | 465 | in sys_read() and friends. |
468 | 466 | ||
469 | ->fsync() has i_mutex on inode. | ||
470 | |||
471 | --------------------------- dquot_operations ------------------------------- | 467 | --------------------------- dquot_operations ------------------------------- |
472 | prototypes: | 468 | prototypes: |
473 | int (*write_dquot) (struct dquot *); | 469 | int (*write_dquot) (struct dquot *); |
@@ -502,12 +498,12 @@ prototypes: | |||
502 | int (*access)(struct vm_area_struct *, unsigned long, void*, int, int); | 498 | int (*access)(struct vm_area_struct *, unsigned long, void*, int, int); |
503 | 499 | ||
504 | locking rules: | 500 | locking rules: |
505 | BKL mmap_sem PageLocked(page) | 501 | mmap_sem PageLocked(page) |
506 | open: no yes | 502 | open: yes |
507 | close: no yes | 503 | close: yes |
508 | fault: no yes can return with page locked | 504 | fault: yes can return with page locked |
509 | page_mkwrite: no yes can return with page locked | 505 | page_mkwrite: yes can return with page locked |
510 | access: no yes | 506 | access: yes |
511 | 507 | ||
512 | ->fault() is called when a previously not present pte is about | 508 | ->fault() is called when a previously not present pte is about |
513 | to be faulted in. The filesystem must find and return the page associated | 509 | to be faulted in. The filesystem must find and return the page associated |
@@ -534,6 +530,3 @@ VM_IO | VM_PFNMAP VMAs. | |||
534 | 530 | ||
535 | (if you break something or notice that it is broken and do not fix it yourself | 531 | (if you break something or notice that it is broken and do not fix it yourself |
536 | - at least put it here) | 532 | - at least put it here) |
537 | |||
538 | ipc/shm.c::shm_delete() - may need BKL. | ||
539 | ->read() and ->write() in many drivers are (probably) missing BKL. | ||