diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/Kconfig | 11 | ||||
-rw-r--r-- | fs/bio.c | 1 | ||||
-rw-r--r-- | fs/hfs/bnode.c | 2 | ||||
-rw-r--r-- | fs/hfs/extent.c | 3 | ||||
-rw-r--r-- | fs/hfsplus/bnode.c | 2 | ||||
-rw-r--r-- | fs/hfsplus/extents.c | 4 | ||||
-rw-r--r-- | fs/hostfs/hostfs.h | 1 | ||||
-rw-r--r-- | fs/hostfs/hostfs_kern.c | 2 | ||||
-rw-r--r-- | fs/hostfs/hostfs_user.c | 16 | ||||
-rw-r--r-- | fs/inotify.c | 5 | ||||
-rw-r--r-- | fs/namei.c | 10 | ||||
-rw-r--r-- | fs/sysfs/file.c | 18 | ||||
-rw-r--r-- | fs/sysfs/inode.c | 2 |
13 files changed, 57 insertions, 20 deletions
diff --git a/fs/Kconfig b/fs/Kconfig index 5d0c4be43dba..e54be7058359 100644 --- a/fs/Kconfig +++ b/fs/Kconfig | |||
@@ -363,12 +363,15 @@ config INOTIFY | |||
363 | bool "Inotify file change notification support" | 363 | bool "Inotify file change notification support" |
364 | default y | 364 | default y |
365 | ---help--- | 365 | ---help--- |
366 | Say Y here to enable inotify support and the /dev/inotify character | 366 | Say Y here to enable inotify support and the associated system |
367 | device. Inotify is a file change notification system and a | 367 | calls. Inotify is a file change notification system and a |
368 | replacement for dnotify. Inotify fixes numerous shortcomings in | 368 | replacement for dnotify. Inotify fixes numerous shortcomings in |
369 | dnotify and introduces several new features. It allows monitoring | 369 | dnotify and introduces several new features. It allows monitoring |
370 | of both files and directories via a single open fd. Multiple file | 370 | of both files and directories via a single open fd. Other features |
371 | events are supported. | 371 | include multiple file events, one-shot support, and unmount |
372 | notification. | ||
373 | |||
374 | For more information, see Documentation/filesystems/inotify.txt | ||
372 | 375 | ||
373 | If unsure, say Y. | 376 | If unsure, say Y. |
374 | 377 | ||
@@ -261,6 +261,7 @@ inline void __bio_clone(struct bio *bio, struct bio *bio_src) | |||
261 | */ | 261 | */ |
262 | bio->bi_vcnt = bio_src->bi_vcnt; | 262 | bio->bi_vcnt = bio_src->bi_vcnt; |
263 | bio->bi_size = bio_src->bi_size; | 263 | bio->bi_size = bio_src->bi_size; |
264 | bio->bi_idx = bio_src->bi_idx; | ||
264 | bio_phys_segments(q, bio); | 265 | bio_phys_segments(q, bio); |
265 | bio_hw_segments(q, bio); | 266 | bio_hw_segments(q, bio); |
266 | } | 267 | } |
diff --git a/fs/hfs/bnode.c b/fs/hfs/bnode.c index 6ad1211f84ed..a096c5a56664 100644 --- a/fs/hfs/bnode.c +++ b/fs/hfs/bnode.c | |||
@@ -480,6 +480,8 @@ void hfs_bnode_put(struct hfs_bnode *node) | |||
480 | return; | 480 | return; |
481 | } | 481 | } |
482 | for (i = 0; i < tree->pages_per_bnode; i++) { | 482 | for (i = 0; i < tree->pages_per_bnode; i++) { |
483 | if (!node->page[i]) | ||
484 | continue; | ||
483 | mark_page_accessed(node->page[i]); | 485 | mark_page_accessed(node->page[i]); |
484 | #if REF_PAGES | 486 | #if REF_PAGES |
485 | put_page(node->page[i]); | 487 | put_page(node->page[i]); |
diff --git a/fs/hfs/extent.c b/fs/hfs/extent.c index cbc8510ad222..5ea6b3d45eaa 100644 --- a/fs/hfs/extent.c +++ b/fs/hfs/extent.c | |||
@@ -482,7 +482,8 @@ void hfs_file_truncate(struct inode *inode) | |||
482 | page_cache_release(page); | 482 | page_cache_release(page); |
483 | mark_inode_dirty(inode); | 483 | mark_inode_dirty(inode); |
484 | return; | 484 | return; |
485 | } | 485 | } else if (inode->i_size == HFS_I(inode)->phys_size) |
486 | return; | ||
486 | size = inode->i_size + HFS_SB(sb)->alloc_blksz - 1; | 487 | size = inode->i_size + HFS_SB(sb)->alloc_blksz - 1; |
487 | blk_cnt = size / HFS_SB(sb)->alloc_blksz; | 488 | blk_cnt = size / HFS_SB(sb)->alloc_blksz; |
488 | alloc_cnt = HFS_I(inode)->alloc_blocks; | 489 | alloc_cnt = HFS_I(inode)->alloc_blocks; |
diff --git a/fs/hfsplus/bnode.c b/fs/hfsplus/bnode.c index 267872e84d71..8868d3b766fd 100644 --- a/fs/hfsplus/bnode.c +++ b/fs/hfsplus/bnode.c | |||
@@ -643,6 +643,8 @@ void hfs_bnode_put(struct hfs_bnode *node) | |||
643 | return; | 643 | return; |
644 | } | 644 | } |
645 | for (i = 0; i < tree->pages_per_bnode; i++) { | 645 | for (i = 0; i < tree->pages_per_bnode; i++) { |
646 | if (!node->page[i]) | ||
647 | continue; | ||
646 | mark_page_accessed(node->page[i]); | 648 | mark_page_accessed(node->page[i]); |
647 | #if REF_PAGES | 649 | #if REF_PAGES |
648 | put_page(node->page[i]); | 650 | put_page(node->page[i]); |
diff --git a/fs/hfsplus/extents.c b/fs/hfsplus/extents.c index 376498cc64fd..e7235ca79a95 100644 --- a/fs/hfsplus/extents.c +++ b/fs/hfsplus/extents.c | |||
@@ -461,7 +461,9 @@ void hfsplus_file_truncate(struct inode *inode) | |||
461 | page_cache_release(page); | 461 | page_cache_release(page); |
462 | mark_inode_dirty(inode); | 462 | mark_inode_dirty(inode); |
463 | return; | 463 | return; |
464 | } | 464 | } else if (inode->i_size == HFSPLUS_I(inode).phys_size) |
465 | return; | ||
466 | |||
465 | blk_cnt = (inode->i_size + HFSPLUS_SB(sb).alloc_blksz - 1) >> HFSPLUS_SB(sb).alloc_blksz_shift; | 467 | blk_cnt = (inode->i_size + HFSPLUS_SB(sb).alloc_blksz - 1) >> HFSPLUS_SB(sb).alloc_blksz_shift; |
466 | alloc_cnt = HFSPLUS_I(inode).alloc_blocks; | 468 | alloc_cnt = HFSPLUS_I(inode).alloc_blocks; |
467 | if (blk_cnt == alloc_cnt) | 469 | if (blk_cnt == alloc_cnt) |
diff --git a/fs/hostfs/hostfs.h b/fs/hostfs/hostfs.h index c1516d013bf6..67bca0d4a33b 100644 --- a/fs/hostfs/hostfs.h +++ b/fs/hostfs/hostfs.h | |||
@@ -69,6 +69,7 @@ extern int read_file(int fd, unsigned long long *offset, char *buf, int len); | |||
69 | extern int write_file(int fd, unsigned long long *offset, const char *buf, | 69 | extern int write_file(int fd, unsigned long long *offset, const char *buf, |
70 | int len); | 70 | int len); |
71 | extern int lseek_file(int fd, long long offset, int whence); | 71 | extern int lseek_file(int fd, long long offset, int whence); |
72 | extern int fsync_file(int fd, int datasync); | ||
72 | extern int file_create(char *name, int ur, int uw, int ux, int gr, | 73 | extern int file_create(char *name, int ur, int uw, int ux, int gr, |
73 | int gw, int gx, int or, int ow, int ox); | 74 | int gw, int gx, int or, int ow, int ox); |
74 | extern int set_attr(const char *file, struct hostfs_iattr *attrs); | 75 | extern int set_attr(const char *file, struct hostfs_iattr *attrs); |
diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index 88e68caa3784..b2d18200a003 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c | |||
@@ -382,7 +382,7 @@ int hostfs_file_open(struct inode *ino, struct file *file) | |||
382 | 382 | ||
383 | int hostfs_fsync(struct file *file, struct dentry *dentry, int datasync) | 383 | int hostfs_fsync(struct file *file, struct dentry *dentry, int datasync) |
384 | { | 384 | { |
385 | return(0); | 385 | return fsync_file(HOSTFS_I(dentry->d_inode)->fd, datasync); |
386 | } | 386 | } |
387 | 387 | ||
388 | static struct file_operations hostfs_file_fops = { | 388 | static struct file_operations hostfs_file_fops = { |
diff --git a/fs/hostfs/hostfs_user.c b/fs/hostfs/hostfs_user.c index 4796e8490f7d..b97809deba66 100644 --- a/fs/hostfs/hostfs_user.c +++ b/fs/hostfs/hostfs_user.c | |||
@@ -153,10 +153,24 @@ int lseek_file(int fd, long long offset, int whence) | |||
153 | int ret; | 153 | int ret; |
154 | 154 | ||
155 | ret = lseek64(fd, offset, whence); | 155 | ret = lseek64(fd, offset, whence); |
156 | if(ret < 0) return(-errno); | 156 | if(ret < 0) |
157 | return(-errno); | ||
157 | return(0); | 158 | return(0); |
158 | } | 159 | } |
159 | 160 | ||
161 | int fsync_file(int fd, int datasync) | ||
162 | { | ||
163 | int ret; | ||
164 | if (datasync) | ||
165 | ret = fdatasync(fd); | ||
166 | else | ||
167 | ret = fsync(fd); | ||
168 | |||
169 | if (ret < 0) | ||
170 | return -errno; | ||
171 | return 0; | ||
172 | } | ||
173 | |||
160 | void close_file(void *stream) | 174 | void close_file(void *stream) |
161 | { | 175 | { |
162 | close(*((int *) stream)); | 176 | close(*((int *) stream)); |
diff --git a/fs/inotify.c b/fs/inotify.c index a8a714e48140..27ebcac5e07f 100644 --- a/fs/inotify.c +++ b/fs/inotify.c | |||
@@ -90,6 +90,7 @@ struct inotify_device { | |||
90 | unsigned int queue_size; /* size of the queue (bytes) */ | 90 | unsigned int queue_size; /* size of the queue (bytes) */ |
91 | unsigned int event_count; /* number of pending events */ | 91 | unsigned int event_count; /* number of pending events */ |
92 | unsigned int max_events; /* maximum number of events */ | 92 | unsigned int max_events; /* maximum number of events */ |
93 | u32 last_wd; /* the last wd allocated */ | ||
93 | }; | 94 | }; |
94 | 95 | ||
95 | /* | 96 | /* |
@@ -352,7 +353,7 @@ static int inotify_dev_get_wd(struct inotify_device *dev, | |||
352 | do { | 353 | do { |
353 | if (unlikely(!idr_pre_get(&dev->idr, GFP_KERNEL))) | 354 | if (unlikely(!idr_pre_get(&dev->idr, GFP_KERNEL))) |
354 | return -ENOSPC; | 355 | return -ENOSPC; |
355 | ret = idr_get_new(&dev->idr, watch, &watch->wd); | 356 | ret = idr_get_new_above(&dev->idr, watch, dev->last_wd, &watch->wd); |
356 | } while (ret == -EAGAIN); | 357 | } while (ret == -EAGAIN); |
357 | 358 | ||
358 | return ret; | 359 | return ret; |
@@ -401,6 +402,7 @@ static struct inotify_watch *create_watch(struct inotify_device *dev, | |||
401 | return ERR_PTR(ret); | 402 | return ERR_PTR(ret); |
402 | } | 403 | } |
403 | 404 | ||
405 | dev->last_wd = ret; | ||
404 | watch->mask = mask; | 406 | watch->mask = mask; |
405 | atomic_set(&watch->count, 0); | 407 | atomic_set(&watch->count, 0); |
406 | INIT_LIST_HEAD(&watch->d_list); | 408 | INIT_LIST_HEAD(&watch->d_list); |
@@ -899,6 +901,7 @@ asmlinkage long sys_inotify_init(void) | |||
899 | dev->queue_size = 0; | 901 | dev->queue_size = 0; |
900 | dev->max_events = inotify_max_queued_events; | 902 | dev->max_events = inotify_max_queued_events; |
901 | dev->user = user; | 903 | dev->user = user; |
904 | dev->last_wd = 0; | ||
902 | atomic_set(&dev->count, 0); | 905 | atomic_set(&dev->count, 0); |
903 | 906 | ||
904 | get_inotify_dev(dev); | 907 | get_inotify_dev(dev); |
diff --git a/fs/namei.c b/fs/namei.c index 02a824cd3c5c..83559dce4286 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -1801,8 +1801,8 @@ int vfs_rmdir(struct inode *dir, struct dentry *dentry) | |||
1801 | } | 1801 | } |
1802 | up(&dentry->d_inode->i_sem); | 1802 | up(&dentry->d_inode->i_sem); |
1803 | if (!error) { | 1803 | if (!error) { |
1804 | fsnotify_rmdir(dentry, dentry->d_inode, dir); | ||
1805 | d_delete(dentry); | 1804 | d_delete(dentry); |
1805 | fsnotify_rmdir(dentry, dentry->d_inode, dir); | ||
1806 | } | 1806 | } |
1807 | dput(dentry); | 1807 | dput(dentry); |
1808 | 1808 | ||
@@ -1874,8 +1874,14 @@ int vfs_unlink(struct inode *dir, struct dentry *dentry) | |||
1874 | 1874 | ||
1875 | /* We don't d_delete() NFS sillyrenamed files--they still exist. */ | 1875 | /* We don't d_delete() NFS sillyrenamed files--they still exist. */ |
1876 | if (!error && !(dentry->d_flags & DCACHE_NFSFS_RENAMED)) { | 1876 | if (!error && !(dentry->d_flags & DCACHE_NFSFS_RENAMED)) { |
1877 | #if defined(CONFIG_INOTIFY) || defined(CONFIG_DNOTIFY) | ||
1878 | dget(dentry); | ||
1879 | d_delete(dentry); | ||
1877 | fsnotify_unlink(dentry, dir); | 1880 | fsnotify_unlink(dentry, dir); |
1881 | dput(dentry); | ||
1882 | #else | ||
1878 | d_delete(dentry); | 1883 | d_delete(dentry); |
1884 | #endif | ||
1879 | } | 1885 | } |
1880 | 1886 | ||
1881 | return error; | 1887 | return error; |
@@ -2218,7 +2224,7 @@ int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
2218 | error = vfs_rename_other(old_dir,old_dentry,new_dir,new_dentry); | 2224 | error = vfs_rename_other(old_dir,old_dentry,new_dir,new_dentry); |
2219 | if (!error) { | 2225 | if (!error) { |
2220 | const char *new_name = old_dentry->d_name.name; | 2226 | const char *new_name = old_dentry->d_name.name; |
2221 | fsnotify_move(old_dir, new_dir, old_name, new_name, is_dir); | 2227 | fsnotify_move(old_dir, new_dir, old_name, new_name, is_dir, new_dentry->d_inode); |
2222 | } | 2228 | } |
2223 | fsnotify_oldname_free(old_name); | 2229 | fsnotify_oldname_free(old_name); |
2224 | 2230 | ||
diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c index 335288b9be0f..4013d7905e84 100644 --- a/fs/sysfs/file.c +++ b/fs/sysfs/file.c | |||
@@ -437,8 +437,8 @@ int sysfs_chmod_file(struct kobject *kobj, struct attribute *attr, mode_t mode) | |||
437 | { | 437 | { |
438 | struct dentry *dir = kobj->dentry; | 438 | struct dentry *dir = kobj->dentry; |
439 | struct dentry *victim; | 439 | struct dentry *victim; |
440 | struct sysfs_dirent *sd; | 440 | struct inode * inode; |
441 | umode_t umode = (mode & S_IALLUGO) | S_IFREG; | 441 | struct iattr newattrs; |
442 | int res = -ENOENT; | 442 | int res = -ENOENT; |
443 | 443 | ||
444 | down(&dir->d_inode->i_sem); | 444 | down(&dir->d_inode->i_sem); |
@@ -446,13 +446,15 @@ int sysfs_chmod_file(struct kobject *kobj, struct attribute *attr, mode_t mode) | |||
446 | if (!IS_ERR(victim)) { | 446 | if (!IS_ERR(victim)) { |
447 | if (victim->d_inode && | 447 | if (victim->d_inode && |
448 | (victim->d_parent->d_inode == dir->d_inode)) { | 448 | (victim->d_parent->d_inode == dir->d_inode)) { |
449 | sd = victim->d_fsdata; | 449 | inode = victim->d_inode; |
450 | attr->mode = mode; | 450 | down(&inode->i_sem); |
451 | sd->s_mode = umode; | 451 | newattrs.ia_mode = (mode & S_IALLUGO) | |
452 | victim->d_inode->i_mode = umode; | 452 | (inode->i_mode & ~S_IALLUGO); |
453 | dput(victim); | 453 | newattrs.ia_valid = ATTR_MODE | ATTR_CTIME; |
454 | res = 0; | 454 | res = notify_change(victim, &newattrs); |
455 | up(&inode->i_sem); | ||
455 | } | 456 | } |
457 | dput(victim); | ||
456 | } | 458 | } |
457 | up(&dir->d_inode->i_sem); | 459 | up(&dir->d_inode->i_sem); |
458 | 460 | ||
diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c index 8de13bafaa76..d727dc960634 100644 --- a/fs/sysfs/inode.c +++ b/fs/sysfs/inode.c | |||
@@ -85,7 +85,7 @@ int sysfs_setattr(struct dentry * dentry, struct iattr * iattr) | |||
85 | 85 | ||
86 | if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID)) | 86 | if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID)) |
87 | mode &= ~S_ISGID; | 87 | mode &= ~S_ISGID; |
88 | sd_iattr->ia_mode = mode; | 88 | sd_iattr->ia_mode = sd->s_mode = mode; |
89 | } | 89 | } |
90 | 90 | ||
91 | return error; | 91 | return error; |