diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-05 21:32:06 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-05 21:32:06 -0500 |
commit | 520c85346666d4d9a6fcaaa8450542302dc28b91 (patch) | |
tree | 9c9cc9e2493b606104dd8602302ae28258ebeac0 | |
parent | e8c82c2e23e3527e0c9dc195e432c16784d270fa (diff) | |
parent | 4ae8978cf92a96257cd8998a49e781be83571d64 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6:
inotify: fix type errors in interfaces
fix breakage in reiserfs_new_inode()
fix the treatment of jfs special inodes
vfs: remove duplicate code in get_fs_type()
add a vfs_fsync helper
sys_execve and sys_uselib do not call into fsnotify
zero i_uid/i_gid on inode allocation
inode->i_op is never NULL
ntfs: don't NULL i_op
isofs check for NULL ->i_op in root directory is dead code
affs: do not zero ->i_op
kill suid bit only for regular files
vfs: lseek(fd, 0, SEEK_CUR) race condition
58 files changed, 126 insertions, 219 deletions
diff --git a/arch/powerpc/platforms/cell/spufs/inode.c b/arch/powerpc/platforms/cell/spufs/inode.c index 6296bfd9cb0b..e309ef70a531 100644 --- a/arch/powerpc/platforms/cell/spufs/inode.c +++ b/arch/powerpc/platforms/cell/spufs/inode.c | |||
@@ -97,7 +97,6 @@ spufs_new_inode(struct super_block *sb, int mode) | |||
97 | inode->i_mode = mode; | 97 | inode->i_mode = mode; |
98 | inode->i_uid = current_fsuid(); | 98 | inode->i_uid = current_fsuid(); |
99 | inode->i_gid = current_fsgid(); | 99 | inode->i_gid = current_fsgid(); |
100 | inode->i_blocks = 0; | ||
101 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 100 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
102 | out: | 101 | out: |
103 | return inode; | 102 | return inode; |
diff --git a/arch/s390/hypfs/inode.c b/arch/s390/hypfs/inode.c index 9d4f8e6c0800..5a805df216bb 100644 --- a/arch/s390/hypfs/inode.c +++ b/arch/s390/hypfs/inode.c | |||
@@ -106,7 +106,6 @@ static struct inode *hypfs_make_inode(struct super_block *sb, int mode) | |||
106 | ret->i_mode = mode; | 106 | ret->i_mode = mode; |
107 | ret->i_uid = hypfs_info->uid; | 107 | ret->i_uid = hypfs_info->uid; |
108 | ret->i_gid = hypfs_info->gid; | 108 | ret->i_gid = hypfs_info->gid; |
109 | ret->i_blocks = 0; | ||
110 | ret->i_atime = ret->i_mtime = ret->i_ctime = CURRENT_TIME; | 109 | ret->i_atime = ret->i_mtime = ret->i_ctime = CURRENT_TIME; |
111 | if (mode & S_IFDIR) | 110 | if (mode & S_IFDIR) |
112 | ret->i_nlink = 2; | 111 | ret->i_nlink = 2; |
diff --git a/drivers/infiniband/hw/ipath/ipath_fs.c b/drivers/infiniband/hw/ipath/ipath_fs.c index 53912c327bfe..8dc2bb781605 100644 --- a/drivers/infiniband/hw/ipath/ipath_fs.c +++ b/drivers/infiniband/hw/ipath/ipath_fs.c | |||
@@ -57,9 +57,6 @@ static int ipathfs_mknod(struct inode *dir, struct dentry *dentry, | |||
57 | } | 57 | } |
58 | 58 | ||
59 | inode->i_mode = mode; | 59 | inode->i_mode = mode; |
60 | inode->i_uid = 0; | ||
61 | inode->i_gid = 0; | ||
62 | inode->i_blocks = 0; | ||
63 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 60 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
64 | inode->i_private = data; | 61 | inode->i_private = data; |
65 | if ((mode & S_IFMT) == S_IFDIR) { | 62 | if ((mode & S_IFMT) == S_IFDIR) { |
diff --git a/drivers/isdn/capi/capifs.c b/drivers/isdn/capi/capifs.c index 0aa66ec4cbdd..b129409925af 100644 --- a/drivers/isdn/capi/capifs.c +++ b/drivers/isdn/capi/capifs.c | |||
@@ -111,8 +111,6 @@ capifs_fill_super(struct super_block *s, void *data, int silent) | |||
111 | goto fail; | 111 | goto fail; |
112 | inode->i_ino = 1; | 112 | inode->i_ino = 1; |
113 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; | 113 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; |
114 | inode->i_blocks = 0; | ||
115 | inode->i_uid = inode->i_gid = 0; | ||
116 | inode->i_mode = S_IFDIR | S_IRUGO | S_IXUGO | S_IWUSR; | 114 | inode->i_mode = S_IFDIR | S_IRUGO | S_IXUGO | S_IWUSR; |
117 | inode->i_op = &simple_dir_inode_operations; | 115 | inode->i_op = &simple_dir_inode_operations; |
118 | inode->i_fop = &simple_dir_operations; | 116 | inode->i_fop = &simple_dir_operations; |
diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c index 22a7e8ba211d..de966a6fb7e6 100644 --- a/drivers/misc/ibmasm/ibmasmfs.c +++ b/drivers/misc/ibmasm/ibmasmfs.c | |||
@@ -146,8 +146,6 @@ static struct inode *ibmasmfs_make_inode(struct super_block *sb, int mode) | |||
146 | 146 | ||
147 | if (ret) { | 147 | if (ret) { |
148 | ret->i_mode = mode; | 148 | ret->i_mode = mode; |
149 | ret->i_uid = ret->i_gid = 0; | ||
150 | ret->i_blocks = 0; | ||
151 | ret->i_atime = ret->i_mtime = ret->i_ctime = CURRENT_TIME; | 149 | ret->i_atime = ret->i_mtime = ret->i_ctime = CURRENT_TIME; |
152 | } | 150 | } |
153 | return ret; | 151 | return ret; |
diff --git a/drivers/oprofile/oprofilefs.c b/drivers/oprofile/oprofilefs.c index ddc4c59f02dc..b7e4cee24269 100644 --- a/drivers/oprofile/oprofilefs.c +++ b/drivers/oprofile/oprofilefs.c | |||
@@ -29,9 +29,6 @@ static struct inode *oprofilefs_get_inode(struct super_block *sb, int mode) | |||
29 | 29 | ||
30 | if (inode) { | 30 | if (inode) { |
31 | inode->i_mode = mode; | 31 | inode->i_mode = mode; |
32 | inode->i_uid = 0; | ||
33 | inode->i_gid = 0; | ||
34 | inode->i_blocks = 0; | ||
35 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 32 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
36 | } | 33 | } |
37 | return inode; | 34 | return inode; |
diff --git a/drivers/usb/core/inode.c b/drivers/usb/core/inode.c index 185be760833e..2a129cb7bb56 100644 --- a/drivers/usb/core/inode.c +++ b/drivers/usb/core/inode.c | |||
@@ -279,7 +279,6 @@ static struct inode *usbfs_get_inode (struct super_block *sb, int mode, dev_t de | |||
279 | inode->i_mode = mode; | 279 | inode->i_mode = mode; |
280 | inode->i_uid = current_fsuid(); | 280 | inode->i_uid = current_fsuid(); |
281 | inode->i_gid = current_fsgid(); | 281 | inode->i_gid = current_fsgid(); |
282 | inode->i_blocks = 0; | ||
283 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 282 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
284 | switch (mode & S_IFMT) { | 283 | switch (mode & S_IFMT) { |
285 | default: | 284 | default: |
diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c index c4e62a6297d7..2e71368f45b4 100644 --- a/drivers/usb/gadget/file_storage.c +++ b/drivers/usb/gadget/file_storage.c | |||
@@ -1863,26 +1863,10 @@ static int do_write(struct fsg_dev *fsg) | |||
1863 | static int fsync_sub(struct lun *curlun) | 1863 | static int fsync_sub(struct lun *curlun) |
1864 | { | 1864 | { |
1865 | struct file *filp = curlun->filp; | 1865 | struct file *filp = curlun->filp; |
1866 | struct inode *inode; | ||
1867 | int rc, err; | ||
1868 | 1866 | ||
1869 | if (curlun->ro || !filp) | 1867 | if (curlun->ro || !filp) |
1870 | return 0; | 1868 | return 0; |
1871 | if (!filp->f_op->fsync) | 1869 | return vfs_fsync(filp, filp->f_path.dentry, 1); |
1872 | return -EINVAL; | ||
1873 | |||
1874 | inode = filp->f_path.dentry->d_inode; | ||
1875 | mutex_lock(&inode->i_mutex); | ||
1876 | rc = filemap_fdatawrite(inode->i_mapping); | ||
1877 | err = filp->f_op->fsync(filp, filp->f_path.dentry, 1); | ||
1878 | if (!rc) | ||
1879 | rc = err; | ||
1880 | err = filemap_fdatawait(inode->i_mapping); | ||
1881 | if (!rc) | ||
1882 | rc = err; | ||
1883 | mutex_unlock(&inode->i_mutex); | ||
1884 | VLDBG(curlun, "fdatasync -> %d\n", rc); | ||
1885 | return rc; | ||
1886 | } | 1870 | } |
1887 | 1871 | ||
1888 | static void fsync_all(struct fsg_dev *fsg) | 1872 | static void fsync_all(struct fsg_dev *fsg) |
diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c index eeb26c0f88e5..317b48fdbf01 100644 --- a/drivers/usb/gadget/inode.c +++ b/drivers/usb/gadget/inode.c | |||
@@ -2001,7 +2001,6 @@ gadgetfs_make_inode (struct super_block *sb, | |||
2001 | inode->i_mode = mode; | 2001 | inode->i_mode = mode; |
2002 | inode->i_uid = default_uid; | 2002 | inode->i_uid = default_uid; |
2003 | inode->i_gid = default_gid; | 2003 | inode->i_gid = default_gid; |
2004 | inode->i_blocks = 0; | ||
2005 | inode->i_atime = inode->i_mtime = inode->i_ctime | 2004 | inode->i_atime = inode->i_mtime = inode->i_ctime |
2006 | = CURRENT_TIME; | 2005 | = CURRENT_TIME; |
2007 | inode->i_private = data; | 2006 | inode->i_private = data; |
diff --git a/fs/affs/inode.c b/fs/affs/inode.c index 415d9c67ac16..3c4ec7d864c4 100644 --- a/fs/affs/inode.c +++ b/fs/affs/inode.c | |||
@@ -119,8 +119,7 @@ struct inode *affs_iget(struct super_block *sb, unsigned long ino) | |||
119 | goto bad_inode; | 119 | goto bad_inode; |
120 | #else | 120 | #else |
121 | inode->i_mode |= S_IFDIR; | 121 | inode->i_mode |= S_IFDIR; |
122 | inode->i_op = NULL; | 122 | /* ... and leave ->i_op and ->i_fop pointing to empty */ |
123 | inode->i_fop = NULL; | ||
124 | break; | 123 | break; |
125 | #endif | 124 | #endif |
126 | case ST_LINKFILE: | 125 | case ST_LINKFILE: |
diff --git a/fs/autofs/inode.c b/fs/autofs/inode.c index c773680d5c60..e1734f2d6e26 100644 --- a/fs/autofs/inode.c +++ b/fs/autofs/inode.c | |||
@@ -251,13 +251,11 @@ struct inode *autofs_iget(struct super_block *sb, unsigned long ino) | |||
251 | inode->i_mode = S_IFDIR | S_IRUGO | S_IXUGO; | 251 | inode->i_mode = S_IFDIR | S_IRUGO | S_IXUGO; |
252 | inode->i_nlink = 2; | 252 | inode->i_nlink = 2; |
253 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; | 253 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; |
254 | inode->i_blocks = 0; | ||
255 | 254 | ||
256 | if (ino == AUTOFS_ROOT_INO) { | 255 | if (ino == AUTOFS_ROOT_INO) { |
257 | inode->i_mode = S_IFDIR | S_IRUGO | S_IXUGO | S_IWUSR; | 256 | inode->i_mode = S_IFDIR | S_IRUGO | S_IXUGO | S_IWUSR; |
258 | inode->i_op = &autofs_root_inode_operations; | 257 | inode->i_op = &autofs_root_inode_operations; |
259 | inode->i_fop = &autofs_root_operations; | 258 | inode->i_fop = &autofs_root_operations; |
260 | inode->i_uid = inode->i_gid = 0; /* Changed in read_super */ | ||
261 | goto done; | 259 | goto done; |
262 | } | 260 | } |
263 | 261 | ||
diff --git a/fs/autofs4/inode.c b/fs/autofs4/inode.c index 7b19802cfef4..cfc23e53b6f4 100644 --- a/fs/autofs4/inode.c +++ b/fs/autofs4/inode.c | |||
@@ -455,11 +455,7 @@ struct inode *autofs4_get_inode(struct super_block *sb, | |||
455 | if (sb->s_root) { | 455 | if (sb->s_root) { |
456 | inode->i_uid = sb->s_root->d_inode->i_uid; | 456 | inode->i_uid = sb->s_root->d_inode->i_uid; |
457 | inode->i_gid = sb->s_root->d_inode->i_gid; | 457 | inode->i_gid = sb->s_root->d_inode->i_gid; |
458 | } else { | ||
459 | inode->i_uid = 0; | ||
460 | inode->i_gid = 0; | ||
461 | } | 458 | } |
462 | inode->i_blocks = 0; | ||
463 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 459 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
464 | 460 | ||
465 | if (S_ISDIR(inf->mode)) { | 461 | if (S_ISDIR(inf->mode)) { |
diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c index f2744ab4e5b3..e1158cb4fbd6 100644 --- a/fs/binfmt_misc.c +++ b/fs/binfmt_misc.c | |||
@@ -496,9 +496,6 @@ static struct inode *bm_get_inode(struct super_block *sb, int mode) | |||
496 | 496 | ||
497 | if (inode) { | 497 | if (inode) { |
498 | inode->i_mode = mode; | 498 | inode->i_mode = mode; |
499 | inode->i_uid = 0; | ||
500 | inode->i_gid = 0; | ||
501 | inode->i_blocks = 0; | ||
502 | inode->i_atime = inode->i_mtime = inode->i_ctime = | 499 | inode->i_atime = inode->i_mtime = inode->i_ctime = |
503 | current_fs_time(inode->i_sb); | 500 | current_fs_time(inode->i_sb); |
504 | } | 501 | } |
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index f247da9f4edc..5ab9896fdcb2 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
@@ -1641,7 +1641,7 @@ do_expand: | |||
1641 | i_size_write(inode, offset); | 1641 | i_size_write(inode, offset); |
1642 | spin_unlock(&inode->i_lock); | 1642 | spin_unlock(&inode->i_lock); |
1643 | out_truncate: | 1643 | out_truncate: |
1644 | if (inode->i_op && inode->i_op->truncate) | 1644 | if (inode->i_op->truncate) |
1645 | inode->i_op->truncate(inode); | 1645 | inode->i_op->truncate(inode); |
1646 | return 0; | 1646 | return 0; |
1647 | out_sig: | 1647 | out_sig: |
diff --git a/fs/coda/file.c b/fs/coda/file.c index 466303db2df6..6a347fbc998a 100644 --- a/fs/coda/file.c +++ b/fs/coda/file.c | |||
@@ -201,8 +201,7 @@ int coda_release(struct inode *coda_inode, struct file *coda_file) | |||
201 | int coda_fsync(struct file *coda_file, struct dentry *coda_dentry, int datasync) | 201 | int coda_fsync(struct file *coda_file, struct dentry *coda_dentry, int datasync) |
202 | { | 202 | { |
203 | struct file *host_file; | 203 | struct file *host_file; |
204 | struct dentry *host_dentry; | 204 | struct inode *coda_inode = coda_dentry->d_inode; |
205 | struct inode *host_inode, *coda_inode = coda_dentry->d_inode; | ||
206 | struct coda_file_info *cfi; | 205 | struct coda_file_info *cfi; |
207 | int err = 0; | 206 | int err = 0; |
208 | 207 | ||
@@ -214,14 +213,7 @@ int coda_fsync(struct file *coda_file, struct dentry *coda_dentry, int datasync) | |||
214 | BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); | 213 | BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); |
215 | host_file = cfi->cfi_container; | 214 | host_file = cfi->cfi_container; |
216 | 215 | ||
217 | if (host_file->f_op && host_file->f_op->fsync) { | 216 | err = vfs_fsync(host_file, host_file->f_path.dentry, datasync); |
218 | host_dentry = host_file->f_path.dentry; | ||
219 | host_inode = host_dentry->d_inode; | ||
220 | mutex_lock(&host_inode->i_mutex); | ||
221 | err = host_file->f_op->fsync(host_file, host_dentry, datasync); | ||
222 | mutex_unlock(&host_inode->i_mutex); | ||
223 | } | ||
224 | |||
225 | if ( !err && !datasync ) { | 217 | if ( !err && !datasync ) { |
226 | lock_kernel(); | 218 | lock_kernel(); |
227 | err = venus_fsync(coda_inode->i_sb, coda_i2f(coda_inode)); | 219 | err = venus_fsync(coda_inode->i_sb, coda_i2f(coda_inode)); |
diff --git a/fs/configfs/inode.c b/fs/configfs/inode.c index 4803ccc94480..5d349d38e056 100644 --- a/fs/configfs/inode.c +++ b/fs/configfs/inode.c | |||
@@ -117,8 +117,6 @@ int configfs_setattr(struct dentry * dentry, struct iattr * iattr) | |||
117 | static inline void set_default_inode_attr(struct inode * inode, mode_t mode) | 117 | static inline void set_default_inode_attr(struct inode * inode, mode_t mode) |
118 | { | 118 | { |
119 | inode->i_mode = mode; | 119 | inode->i_mode = mode; |
120 | inode->i_uid = 0; | ||
121 | inode->i_gid = 0; | ||
122 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 120 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
123 | } | 121 | } |
124 | 122 | ||
@@ -136,7 +134,6 @@ struct inode * configfs_new_inode(mode_t mode, struct configfs_dirent * sd) | |||
136 | { | 134 | { |
137 | struct inode * inode = new_inode(configfs_sb); | 135 | struct inode * inode = new_inode(configfs_sb); |
138 | if (inode) { | 136 | if (inode) { |
139 | inode->i_blocks = 0; | ||
140 | inode->i_mapping->a_ops = &configfs_aops; | 137 | inode->i_mapping->a_ops = &configfs_aops; |
141 | inode->i_mapping->backing_dev_info = &configfs_backing_dev_info; | 138 | inode->i_mapping->backing_dev_info = &configfs_backing_dev_info; |
142 | inode->i_op = &configfs_inode_operations; | 139 | inode->i_op = &configfs_inode_operations; |
diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c index f40423eb1a14..a07338d2d140 100644 --- a/fs/cramfs/inode.c +++ b/fs/cramfs/inode.c | |||
@@ -83,8 +83,6 @@ static struct inode *get_cramfs_inode(struct super_block *sb, | |||
83 | inode->i_op = &page_symlink_inode_operations; | 83 | inode->i_op = &page_symlink_inode_operations; |
84 | inode->i_data.a_ops = &cramfs_aops; | 84 | inode->i_data.a_ops = &cramfs_aops; |
85 | } else { | 85 | } else { |
86 | inode->i_size = 0; | ||
87 | inode->i_blocks = 0; | ||
88 | init_special_inode(inode, inode->i_mode, | 86 | init_special_inode(inode, inode->i_mode, |
89 | old_decode_dev(cramfs_inode->size)); | 87 | old_decode_dev(cramfs_inode->size)); |
90 | } | 88 | } |
diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c index 3dbe2169cf36..81ae9ea3c6e1 100644 --- a/fs/debugfs/inode.c +++ b/fs/debugfs/inode.c | |||
@@ -37,9 +37,6 @@ static struct inode *debugfs_get_inode(struct super_block *sb, int mode, dev_t d | |||
37 | 37 | ||
38 | if (inode) { | 38 | if (inode) { |
39 | inode->i_mode = mode; | 39 | inode->i_mode = mode; |
40 | inode->i_uid = 0; | ||
41 | inode->i_gid = 0; | ||
42 | inode->i_blocks = 0; | ||
43 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 40 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
44 | switch (mode & S_IFMT) { | 41 | switch (mode & S_IFMT) { |
45 | default: | 42 | default: |
diff --git a/fs/devpts/inode.c b/fs/devpts/inode.c index fff96e152c0c..5f3231b9633f 100644 --- a/fs/devpts/inode.c +++ b/fs/devpts/inode.c | |||
@@ -189,8 +189,6 @@ static int mknod_ptmx(struct super_block *sb) | |||
189 | } | 189 | } |
190 | 190 | ||
191 | inode->i_ino = 2; | 191 | inode->i_ino = 2; |
192 | inode->i_uid = inode->i_gid = 0; | ||
193 | inode->i_blocks = 0; | ||
194 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; | 192 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; |
195 | 193 | ||
196 | mode = S_IFCHR|opts->ptmxmode; | 194 | mode = S_IFCHR|opts->ptmxmode; |
@@ -300,8 +298,6 @@ devpts_fill_super(struct super_block *s, void *data, int silent) | |||
300 | goto free_fsi; | 298 | goto free_fsi; |
301 | inode->i_ino = 1; | 299 | inode->i_ino = 1; |
302 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; | 300 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; |
303 | inode->i_blocks = 0; | ||
304 | inode->i_uid = inode->i_gid = 0; | ||
305 | inode->i_mode = S_IFDIR | S_IRUGO | S_IXUGO | S_IWUSR; | 301 | inode->i_mode = S_IFDIR | S_IRUGO | S_IXUGO | S_IWUSR; |
306 | inode->i_op = &simple_dir_inode_operations; | 302 | inode->i_op = &simple_dir_inode_operations; |
307 | inode->i_fop = &simple_dir_operations; | 303 | inode->i_fop = &simple_dir_operations; |
diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c index eb3dc4c7ac06..713834371229 100644 --- a/fs/ecryptfs/file.c +++ b/fs/ecryptfs/file.c | |||
@@ -275,18 +275,9 @@ static int ecryptfs_release(struct inode *inode, struct file *file) | |||
275 | static int | 275 | static int |
276 | ecryptfs_fsync(struct file *file, struct dentry *dentry, int datasync) | 276 | ecryptfs_fsync(struct file *file, struct dentry *dentry, int datasync) |
277 | { | 277 | { |
278 | struct file *lower_file = ecryptfs_file_to_lower(file); | 278 | return vfs_fsync(ecryptfs_file_to_lower(file), |
279 | struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry); | 279 | ecryptfs_dentry_to_lower(dentry), |
280 | struct inode *lower_inode = lower_dentry->d_inode; | 280 | datasync); |
281 | int rc = -EINVAL; | ||
282 | |||
283 | if (lower_inode->i_fop->fsync) { | ||
284 | mutex_lock(&lower_inode->i_mutex); | ||
285 | rc = lower_inode->i_fop->fsync(lower_file, lower_dentry, | ||
286 | datasync); | ||
287 | mutex_unlock(&lower_inode->i_mutex); | ||
288 | } | ||
289 | return rc; | ||
290 | } | 281 | } |
291 | 282 | ||
292 | static int ecryptfs_fasync(int fd, struct file *file, int flag) | 283 | static int ecryptfs_fasync(int fd, struct file *file, int flag) |
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index 5e78fc179886..0111906a8877 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c | |||
@@ -612,8 +612,7 @@ ecryptfs_readlink(struct dentry *dentry, char __user * buf, int bufsiz) | |||
612 | struct ecryptfs_crypt_stat *crypt_stat; | 612 | struct ecryptfs_crypt_stat *crypt_stat; |
613 | 613 | ||
614 | lower_dentry = ecryptfs_dentry_to_lower(dentry); | 614 | lower_dentry = ecryptfs_dentry_to_lower(dentry); |
615 | if (!lower_dentry->d_inode->i_op || | 615 | if (!lower_dentry->d_inode->i_op->readlink) { |
616 | !lower_dentry->d_inode->i_op->readlink) { | ||
617 | rc = -EINVAL; | 616 | rc = -EINVAL; |
618 | goto out; | 617 | goto out; |
619 | } | 618 | } |
@@ -51,6 +51,7 @@ | |||
51 | #include <linux/audit.h> | 51 | #include <linux/audit.h> |
52 | #include <linux/tracehook.h> | 52 | #include <linux/tracehook.h> |
53 | #include <linux/kmod.h> | 53 | #include <linux/kmod.h> |
54 | #include <linux/fsnotify.h> | ||
54 | 55 | ||
55 | #include <asm/uaccess.h> | 56 | #include <asm/uaccess.h> |
56 | #include <asm/mmu_context.h> | 57 | #include <asm/mmu_context.h> |
@@ -132,6 +133,8 @@ asmlinkage long sys_uselib(const char __user * library) | |||
132 | if (IS_ERR(file)) | 133 | if (IS_ERR(file)) |
133 | goto out; | 134 | goto out; |
134 | 135 | ||
136 | fsnotify_open(file->f_path.dentry); | ||
137 | |||
135 | error = -ENOEXEC; | 138 | error = -ENOEXEC; |
136 | if(file->f_op) { | 139 | if(file->f_op) { |
137 | struct linux_binfmt * fmt; | 140 | struct linux_binfmt * fmt; |
@@ -684,6 +687,8 @@ struct file *open_exec(const char *name) | |||
684 | if (IS_ERR(file)) | 687 | if (IS_ERR(file)) |
685 | return file; | 688 | return file; |
686 | 689 | ||
690 | fsnotify_open(file->f_path.dentry); | ||
691 | |||
687 | err = deny_write_access(file); | 692 | err = deny_write_access(file); |
688 | if (err) { | 693 | if (err) { |
689 | fput(file); | 694 | fput(file); |
diff --git a/fs/filesystems.c b/fs/filesystems.c index d0e20ced62dd..d488dcd7f2bb 100644 --- a/fs/filesystems.c +++ b/fs/filesystems.c | |||
@@ -253,24 +253,27 @@ static int __init proc_filesystems_init(void) | |||
253 | module_init(proc_filesystems_init); | 253 | module_init(proc_filesystems_init); |
254 | #endif | 254 | #endif |
255 | 255 | ||
256 | struct file_system_type *get_fs_type(const char *name) | 256 | static struct file_system_type *__get_fs_type(const char *name, int len) |
257 | { | 257 | { |
258 | struct file_system_type *fs; | 258 | struct file_system_type *fs; |
259 | const char *dot = strchr(name, '.'); | ||
260 | unsigned len = dot ? dot - name : strlen(name); | ||
261 | 259 | ||
262 | read_lock(&file_systems_lock); | 260 | read_lock(&file_systems_lock); |
263 | fs = *(find_filesystem(name, len)); | 261 | fs = *(find_filesystem(name, len)); |
264 | if (fs && !try_module_get(fs->owner)) | 262 | if (fs && !try_module_get(fs->owner)) |
265 | fs = NULL; | 263 | fs = NULL; |
266 | read_unlock(&file_systems_lock); | 264 | read_unlock(&file_systems_lock); |
267 | if (!fs && (request_module("%.*s", len, name) == 0)) { | 265 | return fs; |
268 | read_lock(&file_systems_lock); | 266 | } |
269 | fs = *(find_filesystem(name, len)); | 267 | |
270 | if (fs && !try_module_get(fs->owner)) | 268 | struct file_system_type *get_fs_type(const char *name) |
271 | fs = NULL; | 269 | { |
272 | read_unlock(&file_systems_lock); | 270 | struct file_system_type *fs; |
273 | } | 271 | const char *dot = strchr(name, '.'); |
272 | int len = dot ? dot - name : strlen(name); | ||
273 | |||
274 | fs = __get_fs_type(name, len); | ||
275 | if (!fs && (request_module("%.*s", len, name) == 0)) | ||
276 | fs = __get_fs_type(name, len); | ||
274 | 277 | ||
275 | if (dot && fs && !(fs->fs_flags & FS_HAS_SUBTYPE)) { | 278 | if (dot && fs && !(fs->fs_flags & FS_HAS_SUBTYPE)) { |
276 | put_filesystem(fs); | 279 | put_filesystem(fs); |
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 7d479ce3aceb..0ab0c6f5f438 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c | |||
@@ -506,7 +506,6 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb, uid_t uid, | |||
506 | inode->i_mode = mode; | 506 | inode->i_mode = mode; |
507 | inode->i_uid = uid; | 507 | inode->i_uid = uid; |
508 | inode->i_gid = gid; | 508 | inode->i_gid = gid; |
509 | inode->i_blocks = 0; | ||
510 | inode->i_mapping->a_ops = &hugetlbfs_aops; | 509 | inode->i_mapping->a_ops = &hugetlbfs_aops; |
511 | inode->i_mapping->backing_dev_info =&hugetlbfs_backing_dev_info; | 510 | inode->i_mapping->backing_dev_info =&hugetlbfs_backing_dev_info; |
512 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 511 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
diff --git a/fs/inode.c b/fs/inode.c index 7de1cda92489..bd48e5e6d3e8 100644 --- a/fs/inode.c +++ b/fs/inode.c | |||
@@ -131,6 +131,8 @@ struct inode *inode_init_always(struct super_block *sb, struct inode *inode) | |||
131 | inode->i_op = &empty_iops; | 131 | inode->i_op = &empty_iops; |
132 | inode->i_fop = &empty_fops; | 132 | inode->i_fop = &empty_fops; |
133 | inode->i_nlink = 1; | 133 | inode->i_nlink = 1; |
134 | inode->i_uid = 0; | ||
135 | inode->i_gid = 0; | ||
134 | atomic_set(&inode->i_writecount, 0); | 136 | atomic_set(&inode->i_writecount, 0); |
135 | inode->i_size = 0; | 137 | inode->i_size = 0; |
136 | inode->i_blocks = 0; | 138 | inode->i_blocks = 0; |
diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c index 3f8af0f1505b..6147ec3643a0 100644 --- a/fs/isofs/inode.c +++ b/fs/isofs/inode.c | |||
@@ -855,10 +855,6 @@ root_found: | |||
855 | } | 855 | } |
856 | sbi->s_joliet_level = joliet_level; | 856 | sbi->s_joliet_level = joliet_level; |
857 | 857 | ||
858 | /* check the root inode */ | ||
859 | if (!inode->i_op) | ||
860 | goto out_bad_root; | ||
861 | |||
862 | /* Make sure the root inode is a directory */ | 858 | /* Make sure the root inode is a directory */ |
863 | if (!S_ISDIR(inode->i_mode)) { | 859 | if (!S_ISDIR(inode->i_mode)) { |
864 | printk(KERN_WARNING | 860 | printk(KERN_WARNING |
@@ -886,8 +882,6 @@ root_found: | |||
886 | /* | 882 | /* |
887 | * Display error messages and free resources. | 883 | * Display error messages and free resources. |
888 | */ | 884 | */ |
889 | out_bad_root: | ||
890 | printk(KERN_WARNING "%s: root inode not initialized\n", __func__); | ||
891 | out_iput: | 885 | out_iput: |
892 | iput(inode); | 886 | iput(inode); |
893 | goto out_no_inode; | 887 | goto out_no_inode; |
diff --git a/fs/jfs/jfs_imap.c b/fs/jfs/jfs_imap.c index d6363d8309d0..0f94381ca6d0 100644 --- a/fs/jfs/jfs_imap.c +++ b/fs/jfs/jfs_imap.c | |||
@@ -58,9 +58,9 @@ | |||
58 | 58 | ||
59 | /* | 59 | /* |
60 | * __mark_inode_dirty expects inodes to be hashed. Since we don't want | 60 | * __mark_inode_dirty expects inodes to be hashed. Since we don't want |
61 | * special inodes in the fileset inode space, we hash them to a dummy head | 61 | * special inodes in the fileset inode space, we make them appear hashed, |
62 | * but do not put on any lists. | ||
62 | */ | 63 | */ |
63 | static HLIST_HEAD(aggregate_hash); | ||
64 | 64 | ||
65 | /* | 65 | /* |
66 | * imap locks | 66 | * imap locks |
@@ -496,7 +496,11 @@ struct inode *diReadSpecial(struct super_block *sb, ino_t inum, int secondary) | |||
496 | /* release the page */ | 496 | /* release the page */ |
497 | release_metapage(mp); | 497 | release_metapage(mp); |
498 | 498 | ||
499 | hlist_add_head(&ip->i_hash, &aggregate_hash); | 499 | /* |
500 | * that will look hashed, but won't be on any list; hlist_del() | ||
501 | * will work fine and require no locking. | ||
502 | */ | ||
503 | ip->i_hash.pprev = &ip->i_hash.next; | ||
500 | 504 | ||
501 | return (ip); | 505 | return (ip); |
502 | } | 506 | } |
diff --git a/fs/libfs.c b/fs/libfs.c index bdaec17fa388..49b44099dabb 100644 --- a/fs/libfs.c +++ b/fs/libfs.c | |||
@@ -231,7 +231,6 @@ int get_sb_pseudo(struct file_system_type *fs_type, char *name, | |||
231 | */ | 231 | */ |
232 | root->i_ino = 1; | 232 | root->i_ino = 1; |
233 | root->i_mode = S_IFDIR | S_IRUSR | S_IWUSR; | 233 | root->i_mode = S_IFDIR | S_IRUSR | S_IWUSR; |
234 | root->i_uid = root->i_gid = 0; | ||
235 | root->i_atime = root->i_mtime = root->i_ctime = CURRENT_TIME; | 234 | root->i_atime = root->i_mtime = root->i_ctime = CURRENT_TIME; |
236 | dentry = d_alloc(NULL, &d_name); | 235 | dentry = d_alloc(NULL, &d_name); |
237 | if (!dentry) { | 236 | if (!dentry) { |
@@ -436,8 +435,6 @@ int simple_fill_super(struct super_block *s, int magic, struct tree_descr *files | |||
436 | */ | 435 | */ |
437 | inode->i_ino = 1; | 436 | inode->i_ino = 1; |
438 | inode->i_mode = S_IFDIR | 0755; | 437 | inode->i_mode = S_IFDIR | 0755; |
439 | inode->i_uid = inode->i_gid = 0; | ||
440 | inode->i_blocks = 0; | ||
441 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 438 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
442 | inode->i_op = &simple_dir_inode_operations; | 439 | inode->i_op = &simple_dir_inode_operations; |
443 | inode->i_fop = &simple_dir_operations; | 440 | inode->i_fop = &simple_dir_operations; |
@@ -464,8 +461,6 @@ int simple_fill_super(struct super_block *s, int magic, struct tree_descr *files | |||
464 | if (!inode) | 461 | if (!inode) |
465 | goto out; | 462 | goto out; |
466 | inode->i_mode = S_IFREG | files->mode; | 463 | inode->i_mode = S_IFREG | files->mode; |
467 | inode->i_uid = inode->i_gid = 0; | ||
468 | inode->i_blocks = 0; | ||
469 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 464 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
470 | inode->i_fop = files->ops; | 465 | inode->i_fop = files->ops; |
471 | inode->i_ino = i; | 466 | inode->i_ino = i; |
diff --git a/fs/namei.c b/fs/namei.c index df2d3df4f049..f05bed242422 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -257,7 +257,7 @@ int inode_permission(struct inode *inode, int mask) | |||
257 | return -EACCES; | 257 | return -EACCES; |
258 | } | 258 | } |
259 | 259 | ||
260 | if (inode->i_op && inode->i_op->permission) | 260 | if (inode->i_op->permission) |
261 | retval = inode->i_op->permission(inode, mask); | 261 | retval = inode->i_op->permission(inode, mask); |
262 | else | 262 | else |
263 | retval = generic_permission(inode, mask, NULL); | 263 | retval = generic_permission(inode, mask, NULL); |
@@ -432,7 +432,7 @@ static int exec_permission_lite(struct inode *inode) | |||
432 | { | 432 | { |
433 | umode_t mode = inode->i_mode; | 433 | umode_t mode = inode->i_mode; |
434 | 434 | ||
435 | if (inode->i_op && inode->i_op->permission) | 435 | if (inode->i_op->permission) |
436 | return -EAGAIN; | 436 | return -EAGAIN; |
437 | 437 | ||
438 | if (current_fsuid() == inode->i_uid) | 438 | if (current_fsuid() == inode->i_uid) |
@@ -908,9 +908,6 @@ static int __link_path_walk(const char *name, struct nameidata *nd) | |||
908 | inode = next.dentry->d_inode; | 908 | inode = next.dentry->d_inode; |
909 | if (!inode) | 909 | if (!inode) |
910 | goto out_dput; | 910 | goto out_dput; |
911 | err = -ENOTDIR; | ||
912 | if (!inode->i_op) | ||
913 | goto out_dput; | ||
914 | 911 | ||
915 | if (inode->i_op->follow_link) { | 912 | if (inode->i_op->follow_link) { |
916 | err = do_follow_link(&next, nd); | 913 | err = do_follow_link(&next, nd); |
@@ -920,9 +917,6 @@ static int __link_path_walk(const char *name, struct nameidata *nd) | |||
920 | inode = nd->path.dentry->d_inode; | 917 | inode = nd->path.dentry->d_inode; |
921 | if (!inode) | 918 | if (!inode) |
922 | break; | 919 | break; |
923 | err = -ENOTDIR; | ||
924 | if (!inode->i_op) | ||
925 | break; | ||
926 | } else | 920 | } else |
927 | path_to_nameidata(&next, nd); | 921 | path_to_nameidata(&next, nd); |
928 | err = -ENOTDIR; | 922 | err = -ENOTDIR; |
@@ -961,7 +955,7 @@ last_component: | |||
961 | break; | 955 | break; |
962 | inode = next.dentry->d_inode; | 956 | inode = next.dentry->d_inode; |
963 | if ((lookup_flags & LOOKUP_FOLLOW) | 957 | if ((lookup_flags & LOOKUP_FOLLOW) |
964 | && inode && inode->i_op && inode->i_op->follow_link) { | 958 | && inode && inode->i_op->follow_link) { |
965 | err = do_follow_link(&next, nd); | 959 | err = do_follow_link(&next, nd); |
966 | if (err) | 960 | if (err) |
967 | goto return_err; | 961 | goto return_err; |
@@ -973,7 +967,7 @@ last_component: | |||
973 | break; | 967 | break; |
974 | if (lookup_flags & LOOKUP_DIRECTORY) { | 968 | if (lookup_flags & LOOKUP_DIRECTORY) { |
975 | err = -ENOTDIR; | 969 | err = -ENOTDIR; |
976 | if (!inode->i_op || !inode->i_op->lookup) | 970 | if (!inode->i_op->lookup) |
977 | break; | 971 | break; |
978 | } | 972 | } |
979 | goto return_base; | 973 | goto return_base; |
@@ -1469,7 +1463,7 @@ int vfs_create(struct inode *dir, struct dentry *dentry, int mode, | |||
1469 | if (error) | 1463 | if (error) |
1470 | return error; | 1464 | return error; |
1471 | 1465 | ||
1472 | if (!dir->i_op || !dir->i_op->create) | 1466 | if (!dir->i_op->create) |
1473 | return -EACCES; /* shouldn't it be ENOSYS? */ | 1467 | return -EACCES; /* shouldn't it be ENOSYS? */ |
1474 | mode &= S_IALLUGO; | 1468 | mode &= S_IALLUGO; |
1475 | mode |= S_IFREG; | 1469 | mode |= S_IFREG; |
@@ -1752,7 +1746,7 @@ do_last: | |||
1752 | error = -ENOENT; | 1746 | error = -ENOENT; |
1753 | if (!path.dentry->d_inode) | 1747 | if (!path.dentry->d_inode) |
1754 | goto exit_dput; | 1748 | goto exit_dput; |
1755 | if (path.dentry->d_inode->i_op && path.dentry->d_inode->i_op->follow_link) | 1749 | if (path.dentry->d_inode->i_op->follow_link) |
1756 | goto do_link; | 1750 | goto do_link; |
1757 | 1751 | ||
1758 | path_to_nameidata(&path, &nd); | 1752 | path_to_nameidata(&path, &nd); |
@@ -1933,7 +1927,7 @@ int vfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev) | |||
1933 | if ((S_ISCHR(mode) || S_ISBLK(mode)) && !capable(CAP_MKNOD)) | 1927 | if ((S_ISCHR(mode) || S_ISBLK(mode)) && !capable(CAP_MKNOD)) |
1934 | return -EPERM; | 1928 | return -EPERM; |
1935 | 1929 | ||
1936 | if (!dir->i_op || !dir->i_op->mknod) | 1930 | if (!dir->i_op->mknod) |
1937 | return -EPERM; | 1931 | return -EPERM; |
1938 | 1932 | ||
1939 | error = devcgroup_inode_mknod(mode, dev); | 1933 | error = devcgroup_inode_mknod(mode, dev); |
@@ -2035,7 +2029,7 @@ int vfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
2035 | if (error) | 2029 | if (error) |
2036 | return error; | 2030 | return error; |
2037 | 2031 | ||
2038 | if (!dir->i_op || !dir->i_op->mkdir) | 2032 | if (!dir->i_op->mkdir) |
2039 | return -EPERM; | 2033 | return -EPERM; |
2040 | 2034 | ||
2041 | mode &= (S_IRWXUGO|S_ISVTX); | 2035 | mode &= (S_IRWXUGO|S_ISVTX); |
@@ -2126,7 +2120,7 @@ int vfs_rmdir(struct inode *dir, struct dentry *dentry) | |||
2126 | if (error) | 2120 | if (error) |
2127 | return error; | 2121 | return error; |
2128 | 2122 | ||
2129 | if (!dir->i_op || !dir->i_op->rmdir) | 2123 | if (!dir->i_op->rmdir) |
2130 | return -EPERM; | 2124 | return -EPERM; |
2131 | 2125 | ||
2132 | DQUOT_INIT(dir); | 2126 | DQUOT_INIT(dir); |
@@ -2213,7 +2207,7 @@ int vfs_unlink(struct inode *dir, struct dentry *dentry) | |||
2213 | if (error) | 2207 | if (error) |
2214 | return error; | 2208 | return error; |
2215 | 2209 | ||
2216 | if (!dir->i_op || !dir->i_op->unlink) | 2210 | if (!dir->i_op->unlink) |
2217 | return -EPERM; | 2211 | return -EPERM; |
2218 | 2212 | ||
2219 | DQUOT_INIT(dir); | 2213 | DQUOT_INIT(dir); |
@@ -2320,7 +2314,7 @@ int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname) | |||
2320 | if (error) | 2314 | if (error) |
2321 | return error; | 2315 | return error; |
2322 | 2316 | ||
2323 | if (!dir->i_op || !dir->i_op->symlink) | 2317 | if (!dir->i_op->symlink) |
2324 | return -EPERM; | 2318 | return -EPERM; |
2325 | 2319 | ||
2326 | error = security_inode_symlink(dir, dentry, oldname); | 2320 | error = security_inode_symlink(dir, dentry, oldname); |
@@ -2401,7 +2395,7 @@ int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_de | |||
2401 | */ | 2395 | */ |
2402 | if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) | 2396 | if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) |
2403 | return -EPERM; | 2397 | return -EPERM; |
2404 | if (!dir->i_op || !dir->i_op->link) | 2398 | if (!dir->i_op->link) |
2405 | return -EPERM; | 2399 | return -EPERM; |
2406 | if (S_ISDIR(inode->i_mode)) | 2400 | if (S_ISDIR(inode->i_mode)) |
2407 | return -EPERM; | 2401 | return -EPERM; |
@@ -2608,7 +2602,7 @@ int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
2608 | if (error) | 2602 | if (error) |
2609 | return error; | 2603 | return error; |
2610 | 2604 | ||
2611 | if (!old_dir->i_op || !old_dir->i_op->rename) | 2605 | if (!old_dir->i_op->rename) |
2612 | return -EPERM; | 2606 | return -EPERM; |
2613 | 2607 | ||
2614 | DQUOT_INIT(old_dir); | 2608 | DQUOT_INIT(old_dir); |
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index d1c5f787b365..44aa92aba891 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c | |||
@@ -744,45 +744,16 @@ nfsd_close(struct file *filp) | |||
744 | fput(filp); | 744 | fput(filp); |
745 | } | 745 | } |
746 | 746 | ||
747 | /* | ||
748 | * Sync a file | ||
749 | * As this calls fsync (not fdatasync) there is no need for a write_inode | ||
750 | * after it. | ||
751 | */ | ||
752 | static inline int nfsd_dosync(struct file *filp, struct dentry *dp, | ||
753 | const struct file_operations *fop) | ||
754 | { | ||
755 | struct inode *inode = dp->d_inode; | ||
756 | int (*fsync) (struct file *, struct dentry *, int); | ||
757 | int err; | ||
758 | |||
759 | err = filemap_fdatawrite(inode->i_mapping); | ||
760 | if (err == 0 && fop && (fsync = fop->fsync)) | ||
761 | err = fsync(filp, dp, 0); | ||
762 | if (err == 0) | ||
763 | err = filemap_fdatawait(inode->i_mapping); | ||
764 | |||
765 | return err; | ||
766 | } | ||
767 | |||
768 | |||
769 | static int | 747 | static int |
770 | nfsd_sync(struct file *filp) | 748 | nfsd_sync(struct file *filp) |
771 | { | 749 | { |
772 | int err; | 750 | return vfs_fsync(filp, filp->f_path.dentry, 0); |
773 | struct inode *inode = filp->f_path.dentry->d_inode; | ||
774 | dprintk("nfsd: sync file %s\n", filp->f_path.dentry->d_name.name); | ||
775 | mutex_lock(&inode->i_mutex); | ||
776 | err=nfsd_dosync(filp, filp->f_path.dentry, filp->f_op); | ||
777 | mutex_unlock(&inode->i_mutex); | ||
778 | |||
779 | return err; | ||
780 | } | 751 | } |
781 | 752 | ||
782 | int | 753 | int |
783 | nfsd_sync_dir(struct dentry *dp) | 754 | nfsd_sync_dir(struct dentry *dentry) |
784 | { | 755 | { |
785 | return nfsd_dosync(NULL, dp, dp->d_inode->i_fop); | 756 | return vfs_fsync(NULL, dentry, 0); |
786 | } | 757 | } |
787 | 758 | ||
788 | /* | 759 | /* |
@@ -1211,7 +1182,7 @@ nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp, | |||
1211 | dirp = dentry->d_inode; | 1182 | dirp = dentry->d_inode; |
1212 | 1183 | ||
1213 | err = nfserr_notdir; | 1184 | err = nfserr_notdir; |
1214 | if(!dirp->i_op || !dirp->i_op->lookup) | 1185 | if (!dirp->i_op->lookup) |
1215 | goto out; | 1186 | goto out; |
1216 | /* | 1187 | /* |
1217 | * Check whether the response file handle has been verified yet. | 1188 | * Check whether the response file handle has been verified yet. |
@@ -1347,7 +1318,7 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, | |||
1347 | /* Get all the sanity checks out of the way before | 1318 | /* Get all the sanity checks out of the way before |
1348 | * we lock the parent. */ | 1319 | * we lock the parent. */ |
1349 | err = nfserr_notdir; | 1320 | err = nfserr_notdir; |
1350 | if(!dirp->i_op || !dirp->i_op->lookup) | 1321 | if (!dirp->i_op->lookup) |
1351 | goto out; | 1322 | goto out; |
1352 | fh_lock_nested(fhp, I_MUTEX_PARENT); | 1323 | fh_lock_nested(fhp, I_MUTEX_PARENT); |
1353 | 1324 | ||
@@ -1482,7 +1453,7 @@ nfsd_readlink(struct svc_rqst *rqstp, struct svc_fh *fhp, char *buf, int *lenp) | |||
1482 | inode = dentry->d_inode; | 1453 | inode = dentry->d_inode; |
1483 | 1454 | ||
1484 | err = nfserr_inval; | 1455 | err = nfserr_inval; |
1485 | if (!inode->i_op || !inode->i_op->readlink) | 1456 | if (!inode->i_op->readlink) |
1486 | goto out; | 1457 | goto out; |
1487 | 1458 | ||
1488 | touch_atime(fhp->fh_export->ex_path.mnt, dentry); | 1459 | touch_atime(fhp->fh_export->ex_path.mnt, dentry); |
@@ -2162,7 +2133,7 @@ nfsd_set_posix_acl(struct svc_fh *fhp, int type, struct posix_acl *acl) | |||
2162 | size_t size; | 2133 | size_t size; |
2163 | int error; | 2134 | int error; |
2164 | 2135 | ||
2165 | if (!IS_POSIXACL(inode) || !inode->i_op || | 2136 | if (!IS_POSIXACL(inode) || |
2166 | !inode->i_op->setxattr || !inode->i_op->removexattr) | 2137 | !inode->i_op->setxattr || !inode->i_op->removexattr) |
2167 | return -EOPNOTSUPP; | 2138 | return -EOPNOTSUPP; |
2168 | switch(type) { | 2139 | switch(type) { |
diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c index 400f8064a548..81b8644b0136 100644 --- a/fs/notify/inotify/inotify_user.c +++ b/fs/notify/inotify/inotify_user.c | |||
@@ -704,7 +704,7 @@ fput_and_out: | |||
704 | return ret; | 704 | return ret; |
705 | } | 705 | } |
706 | 706 | ||
707 | asmlinkage long sys_inotify_rm_watch(int fd, u32 wd) | 707 | asmlinkage long sys_inotify_rm_watch(int fd, __s32 wd) |
708 | { | 708 | { |
709 | struct file *filp; | 709 | struct file *filp; |
710 | struct inotify_device *dev; | 710 | struct inotify_device *dev; |
diff --git a/fs/ntfs/inode.c b/fs/ntfs/inode.c index e9da092e2772..86bef156cf0a 100644 --- a/fs/ntfs/inode.c +++ b/fs/ntfs/inode.c | |||
@@ -1406,9 +1406,6 @@ static int ntfs_read_locked_attr_inode(struct inode *base_vi, struct inode *vi) | |||
1406 | ni->allocated_size = sle64_to_cpu( | 1406 | ni->allocated_size = sle64_to_cpu( |
1407 | a->data.non_resident.allocated_size); | 1407 | a->data.non_resident.allocated_size); |
1408 | } | 1408 | } |
1409 | /* Setup the operations for this attribute inode. */ | ||
1410 | vi->i_op = NULL; | ||
1411 | vi->i_fop = NULL; | ||
1412 | if (NInoMstProtected(ni)) | 1409 | if (NInoMstProtected(ni)) |
1413 | vi->i_mapping->a_ops = &ntfs_mst_aops; | 1410 | vi->i_mapping->a_ops = &ntfs_mst_aops; |
1414 | else | 1411 | else |
diff --git a/fs/ocfs2/dlm/dlmfs.c b/fs/ocfs2/dlm/dlmfs.c index 6f7a77d54020..1c9efb406a96 100644 --- a/fs/ocfs2/dlm/dlmfs.c +++ b/fs/ocfs2/dlm/dlmfs.c | |||
@@ -341,7 +341,6 @@ static struct inode *dlmfs_get_root_inode(struct super_block *sb) | |||
341 | inode->i_mode = mode; | 341 | inode->i_mode = mode; |
342 | inode->i_uid = current_fsuid(); | 342 | inode->i_uid = current_fsuid(); |
343 | inode->i_gid = current_fsgid(); | 343 | inode->i_gid = current_fsgid(); |
344 | inode->i_blocks = 0; | ||
345 | inode->i_mapping->backing_dev_info = &dlmfs_backing_dev_info; | 344 | inode->i_mapping->backing_dev_info = &dlmfs_backing_dev_info; |
346 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 345 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
347 | inc_nlink(inode); | 346 | inc_nlink(inode); |
@@ -367,7 +366,6 @@ static struct inode *dlmfs_get_inode(struct inode *parent, | |||
367 | inode->i_mode = mode; | 366 | inode->i_mode = mode; |
368 | inode->i_uid = current_fsuid(); | 367 | inode->i_uid = current_fsuid(); |
369 | inode->i_gid = current_fsgid(); | 368 | inode->i_gid = current_fsgid(); |
370 | inode->i_blocks = 0; | ||
371 | inode->i_mapping->backing_dev_info = &dlmfs_backing_dev_info; | 369 | inode->i_mapping->backing_dev_info = &dlmfs_backing_dev_info; |
372 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 370 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
373 | 371 | ||
diff --git a/fs/omfs/inode.c b/fs/omfs/inode.c index 6afe57c84f84..633e9dc972bb 100644 --- a/fs/omfs/inode.c +++ b/fs/omfs/inode.c | |||
@@ -39,7 +39,6 @@ struct inode *omfs_new_inode(struct inode *dir, int mode) | |||
39 | inode->i_mode = mode; | 39 | inode->i_mode = mode; |
40 | inode->i_uid = current_fsuid(); | 40 | inode->i_uid = current_fsuid(); |
41 | inode->i_gid = current_fsgid(); | 41 | inode->i_gid = current_fsgid(); |
42 | inode->i_blocks = 0; | ||
43 | inode->i_mapping->a_ops = &omfs_aops; | 42 | inode->i_mapping->a_ops = &omfs_aops; |
44 | 43 | ||
45 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 44 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
@@ -412,7 +412,7 @@ asmlinkage long sys_fallocate(int fd, int mode, loff_t offset, loff_t len) | |||
412 | if (((offset + len) > inode->i_sb->s_maxbytes) || ((offset + len) < 0)) | 412 | if (((offset + len) > inode->i_sb->s_maxbytes) || ((offset + len) < 0)) |
413 | goto out_fput; | 413 | goto out_fput; |
414 | 414 | ||
415 | if (inode->i_op && inode->i_op->fallocate) | 415 | if (inode->i_op->fallocate) |
416 | ret = inode->i_op->fallocate(inode, mode, offset, len); | 416 | ret = inode->i_op->fallocate(inode, mode, offset, len); |
417 | else | 417 | else |
418 | ret = -EOPNOTSUPP; | 418 | ret = -EOPNOTSUPP; |
diff --git a/fs/openpromfs/inode.c b/fs/openpromfs/inode.c index d41bdc784de4..ffcd04f0012c 100644 --- a/fs/openpromfs/inode.c +++ b/fs/openpromfs/inode.c | |||
@@ -256,9 +256,6 @@ found: | |||
256 | break; | 256 | break; |
257 | } | 257 | } |
258 | 258 | ||
259 | inode->i_gid = 0; | ||
260 | inode->i_uid = 0; | ||
261 | |||
262 | d_add(dentry, inode); | 259 | d_add(dentry, inode); |
263 | return NULL; | 260 | return NULL; |
264 | } | 261 | } |
diff --git a/fs/proc/base.c b/fs/proc/base.c index cad92c1ac2b3..10fd5223d600 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -1426,8 +1426,6 @@ static struct inode *proc_pid_make_inode(struct super_block * sb, struct task_st | |||
1426 | if (!ei->pid) | 1426 | if (!ei->pid) |
1427 | goto out_unlock; | 1427 | goto out_unlock; |
1428 | 1428 | ||
1429 | inode->i_uid = 0; | ||
1430 | inode->i_gid = 0; | ||
1431 | if (task_dumpable(task)) { | 1429 | if (task_dumpable(task)) { |
1432 | rcu_read_lock(); | 1430 | rcu_read_lock(); |
1433 | cred = __task_cred(task); | 1431 | cred = __task_cred(task); |
@@ -2349,8 +2347,6 @@ static struct dentry *proc_base_instantiate(struct inode *dir, | |||
2349 | if (!ei->pid) | 2347 | if (!ei->pid) |
2350 | goto out_iput; | 2348 | goto out_iput; |
2351 | 2349 | ||
2352 | inode->i_uid = 0; | ||
2353 | inode->i_gid = 0; | ||
2354 | inode->i_mode = p->mode; | 2350 | inode->i_mode = p->mode; |
2355 | if (S_ISDIR(inode->i_mode)) | 2351 | if (S_ISDIR(inode->i_mode)) |
2356 | inode->i_nlink = 2; | 2352 | inode->i_nlink = 2; |
diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c index 06ed10b7da9e..94fcfff6863a 100644 --- a/fs/proc/proc_sysctl.c +++ b/fs/proc/proc_sysctl.c | |||
@@ -31,7 +31,6 @@ static struct inode *proc_sys_make_inode(struct super_block *sb, | |||
31 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; | 31 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; |
32 | inode->i_flags |= S_PRIVATE; /* tell selinux to ignore this inode */ | 32 | inode->i_flags |= S_PRIVATE; /* tell selinux to ignore this inode */ |
33 | inode->i_mode = table->mode; | 33 | inode->i_mode = table->mode; |
34 | inode->i_uid = inode->i_gid = 0; | ||
35 | if (!table->child) { | 34 | if (!table->child) { |
36 | inode->i_mode |= S_IFREG; | 35 | inode->i_mode |= S_IFREG; |
37 | inode->i_op = &proc_sys_inode_operations; | 36 | inode->i_op = &proc_sys_inode_operations; |
diff --git a/fs/ramfs/inode.c b/fs/ramfs/inode.c index a83a3518ae33..b7e6ac706b87 100644 --- a/fs/ramfs/inode.c +++ b/fs/ramfs/inode.c | |||
@@ -57,7 +57,6 @@ struct inode *ramfs_get_inode(struct super_block *sb, int mode, dev_t dev) | |||
57 | inode->i_mode = mode; | 57 | inode->i_mode = mode; |
58 | inode->i_uid = current_fsuid(); | 58 | inode->i_uid = current_fsuid(); |
59 | inode->i_gid = current_fsgid(); | 59 | inode->i_gid = current_fsgid(); |
60 | inode->i_blocks = 0; | ||
61 | inode->i_mapping->a_ops = &ramfs_aops; | 60 | inode->i_mapping->a_ops = &ramfs_aops; |
62 | inode->i_mapping->backing_dev_info = &ramfs_backing_dev_info; | 61 | inode->i_mapping->backing_dev_info = &ramfs_backing_dev_info; |
63 | mapping_set_gfp_mask(inode->i_mapping, GFP_HIGHUSER); | 62 | mapping_set_gfp_mask(inode->i_mapping, GFP_HIGHUSER); |
diff --git a/fs/read_write.c b/fs/read_write.c index 969a6d9c020b..5cc6924eb158 100644 --- a/fs/read_write.c +++ b/fs/read_write.c | |||
@@ -50,6 +50,14 @@ generic_file_llseek_unlocked(struct file *file, loff_t offset, int origin) | |||
50 | offset += inode->i_size; | 50 | offset += inode->i_size; |
51 | break; | 51 | break; |
52 | case SEEK_CUR: | 52 | case SEEK_CUR: |
53 | /* | ||
54 | * Here we special-case the lseek(fd, 0, SEEK_CUR) | ||
55 | * position-querying operation. Avoid rewriting the "same" | ||
56 | * f_pos value back to the file because a concurrent read(), | ||
57 | * write() or lseek() might have altered it | ||
58 | */ | ||
59 | if (offset == 0) | ||
60 | return file->f_pos; | ||
53 | offset += file->f_pos; | 61 | offset += file->f_pos; |
54 | break; | 62 | break; |
55 | } | 63 | } |
@@ -105,6 +113,10 @@ loff_t default_llseek(struct file *file, loff_t offset, int origin) | |||
105 | offset += i_size_read(file->f_path.dentry->d_inode); | 113 | offset += i_size_read(file->f_path.dentry->d_inode); |
106 | break; | 114 | break; |
107 | case SEEK_CUR: | 115 | case SEEK_CUR: |
116 | if (offset == 0) { | ||
117 | retval = file->f_pos; | ||
118 | goto out; | ||
119 | } | ||
108 | offset += file->f_pos; | 120 | offset += file->f_pos; |
109 | } | 121 | } |
110 | retval = -EINVAL; | 122 | retval = -EINVAL; |
@@ -115,6 +127,7 @@ loff_t default_llseek(struct file *file, loff_t offset, int origin) | |||
115 | } | 127 | } |
116 | retval = offset; | 128 | retval = offset; |
117 | } | 129 | } |
130 | out: | ||
118 | unlock_kernel(); | 131 | unlock_kernel(); |
119 | return retval; | 132 | return retval; |
120 | } | 133 | } |
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index ed04f47007f8..55fce92cdf18 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c | |||
@@ -1782,6 +1782,12 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th, | |||
1782 | goto out_bad_inode; | 1782 | goto out_bad_inode; |
1783 | } | 1783 | } |
1784 | args.objectid = inode->i_ino = le32_to_cpu(ih.ih_key.k_objectid); | 1784 | args.objectid = inode->i_ino = le32_to_cpu(ih.ih_key.k_objectid); |
1785 | if (old_format_only(sb)) | ||
1786 | make_le_item_head(&ih, NULL, KEY_FORMAT_3_5, SD_OFFSET, | ||
1787 | TYPE_STAT_DATA, SD_V1_SIZE, MAX_US_INT); | ||
1788 | else | ||
1789 | make_le_item_head(&ih, NULL, KEY_FORMAT_3_6, SD_OFFSET, | ||
1790 | TYPE_STAT_DATA, SD_SIZE, MAX_US_INT); | ||
1785 | memcpy(INODE_PKEY(inode), &(ih.ih_key), KEY_SIZE); | 1791 | memcpy(INODE_PKEY(inode), &(ih.ih_key), KEY_SIZE); |
1786 | args.dirid = le32_to_cpu(ih.ih_key.k_dir_id); | 1792 | args.dirid = le32_to_cpu(ih.ih_key.k_dir_id); |
1787 | if (insert_inode_locked4(inode, args.objectid, | 1793 | if (insert_inode_locked4(inode, args.objectid, |
@@ -1834,13 +1840,6 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th, | |||
1834 | reiserfs_init_acl_default(inode); | 1840 | reiserfs_init_acl_default(inode); |
1835 | reiserfs_init_xattr_rwsem(inode); | 1841 | reiserfs_init_xattr_rwsem(inode); |
1836 | 1842 | ||
1837 | if (old_format_only(sb)) | ||
1838 | make_le_item_head(&ih, NULL, KEY_FORMAT_3_5, SD_OFFSET, | ||
1839 | TYPE_STAT_DATA, SD_V1_SIZE, MAX_US_INT); | ||
1840 | else | ||
1841 | make_le_item_head(&ih, NULL, KEY_FORMAT_3_6, SD_OFFSET, | ||
1842 | TYPE_STAT_DATA, SD_SIZE, MAX_US_INT); | ||
1843 | |||
1844 | /* key to search for correct place for new stat data */ | 1843 | /* key to search for correct place for new stat data */ |
1845 | _make_cpu_key(&key, KEY_FORMAT_3_6, le32_to_cpu(ih.ih_key.k_dir_id), | 1844 | _make_cpu_key(&key, KEY_FORMAT_3_6, le32_to_cpu(ih.ih_key.k_dir_id), |
1846 | le32_to_cpu(ih.ih_key.k_objectid), SD_OFFSET, | 1845 | le32_to_cpu(ih.ih_key.k_objectid), SD_OFFSET, |
diff --git a/fs/romfs/inode.c b/fs/romfs/inode.c index 60d2f822e87b..c97d4c931715 100644 --- a/fs/romfs/inode.c +++ b/fs/romfs/inode.c | |||
@@ -524,7 +524,6 @@ romfs_iget(struct super_block *sb, unsigned long ino) | |||
524 | i->i_size = be32_to_cpu(ri.size); | 524 | i->i_size = be32_to_cpu(ri.size); |
525 | i->i_mtime.tv_sec = i->i_atime.tv_sec = i->i_ctime.tv_sec = 0; | 525 | i->i_mtime.tv_sec = i->i_atime.tv_sec = i->i_ctime.tv_sec = 0; |
526 | i->i_mtime.tv_nsec = i->i_atime.tv_nsec = i->i_ctime.tv_nsec = 0; | 526 | i->i_mtime.tv_nsec = i->i_atime.tv_nsec = i->i_ctime.tv_nsec = 0; |
527 | i->i_uid = i->i_gid = 0; | ||
528 | 527 | ||
529 | /* Precalculate the data offset */ | 528 | /* Precalculate the data offset */ |
530 | ino = romfs_strnlen(i, ino+ROMFH_SIZE, ROMFS_MAXFN); | 529 | ino = romfs_strnlen(i, ino+ROMFH_SIZE, ROMFS_MAXFN); |
@@ -305,7 +305,7 @@ asmlinkage long sys_readlinkat(int dfd, const char __user *pathname, | |||
305 | struct inode *inode = path.dentry->d_inode; | 305 | struct inode *inode = path.dentry->d_inode; |
306 | 306 | ||
307 | error = -EINVAL; | 307 | error = -EINVAL; |
308 | if (inode->i_op && inode->i_op->readlink) { | 308 | if (inode->i_op->readlink) { |
309 | error = security_inode_readlink(path.dentry); | 309 | error = security_inode_readlink(path.dentry); |
310 | if (!error) { | 310 | if (!error) { |
311 | touch_atime(path.mnt, path.dentry); | 311 | touch_atime(path.mnt, path.dentry); |
@@ -75,14 +75,39 @@ int file_fsync(struct file *filp, struct dentry *dentry, int datasync) | |||
75 | return ret; | 75 | return ret; |
76 | } | 76 | } |
77 | 77 | ||
78 | long do_fsync(struct file *file, int datasync) | 78 | /** |
79 | * vfs_fsync - perform a fsync or fdatasync on a file | ||
80 | * @file: file to sync | ||
81 | * @dentry: dentry of @file | ||
82 | * @data: only perform a fdatasync operation | ||
83 | * | ||
84 | * Write back data and metadata for @file to disk. If @datasync is | ||
85 | * set only metadata needed to access modified file data is written. | ||
86 | * | ||
87 | * In case this function is called from nfsd @file may be %NULL and | ||
88 | * only @dentry is set. This can only happen when the filesystem | ||
89 | * implements the export_operations API. | ||
90 | */ | ||
91 | int vfs_fsync(struct file *file, struct dentry *dentry, int datasync) | ||
79 | { | 92 | { |
80 | int ret; | 93 | const struct file_operations *fop; |
81 | int err; | 94 | struct address_space *mapping; |
82 | struct address_space *mapping = file->f_mapping; | 95 | int err, ret; |
96 | |||
97 | /* | ||
98 | * Get mapping and operations from the file in case we have | ||
99 | * as file, or get the default values for them in case we | ||
100 | * don't have a struct file available. Damn nfsd.. | ||
101 | */ | ||
102 | if (file) { | ||
103 | mapping = file->f_mapping; | ||
104 | fop = file->f_op; | ||
105 | } else { | ||
106 | mapping = dentry->d_inode->i_mapping; | ||
107 | fop = dentry->d_inode->i_fop; | ||
108 | } | ||
83 | 109 | ||
84 | if (!file->f_op || !file->f_op->fsync) { | 110 | if (!fop || !fop->fsync) { |
85 | /* Why? We can still call filemap_fdatawrite */ | ||
86 | ret = -EINVAL; | 111 | ret = -EINVAL; |
87 | goto out; | 112 | goto out; |
88 | } | 113 | } |
@@ -94,7 +119,7 @@ long do_fsync(struct file *file, int datasync) | |||
94 | * livelocks in fsync_buffers_list(). | 119 | * livelocks in fsync_buffers_list(). |
95 | */ | 120 | */ |
96 | mutex_lock(&mapping->host->i_mutex); | 121 | mutex_lock(&mapping->host->i_mutex); |
97 | err = file->f_op->fsync(file, file->f_path.dentry, datasync); | 122 | err = fop->fsync(file, dentry, datasync); |
98 | if (!ret) | 123 | if (!ret) |
99 | ret = err; | 124 | ret = err; |
100 | mutex_unlock(&mapping->host->i_mutex); | 125 | mutex_unlock(&mapping->host->i_mutex); |
@@ -104,15 +129,16 @@ long do_fsync(struct file *file, int datasync) | |||
104 | out: | 129 | out: |
105 | return ret; | 130 | return ret; |
106 | } | 131 | } |
132 | EXPORT_SYMBOL(vfs_fsync); | ||
107 | 133 | ||
108 | static long __do_fsync(unsigned int fd, int datasync) | 134 | static int do_fsync(unsigned int fd, int datasync) |
109 | { | 135 | { |
110 | struct file *file; | 136 | struct file *file; |
111 | int ret = -EBADF; | 137 | int ret = -EBADF; |
112 | 138 | ||
113 | file = fget(fd); | 139 | file = fget(fd); |
114 | if (file) { | 140 | if (file) { |
115 | ret = do_fsync(file, datasync); | 141 | ret = vfs_fsync(file, file->f_path.dentry, datasync); |
116 | fput(file); | 142 | fput(file); |
117 | } | 143 | } |
118 | return ret; | 144 | return ret; |
@@ -120,12 +146,12 @@ static long __do_fsync(unsigned int fd, int datasync) | |||
120 | 146 | ||
121 | asmlinkage long sys_fsync(unsigned int fd) | 147 | asmlinkage long sys_fsync(unsigned int fd) |
122 | { | 148 | { |
123 | return __do_fsync(fd, 0); | 149 | return do_fsync(fd, 0); |
124 | } | 150 | } |
125 | 151 | ||
126 | asmlinkage long sys_fdatasync(unsigned int fd) | 152 | asmlinkage long sys_fdatasync(unsigned int fd) |
127 | { | 153 | { |
128 | return __do_fsync(fd, 1); | 154 | return do_fsync(fd, 1); |
129 | } | 155 | } |
130 | 156 | ||
131 | /* | 157 | /* |
diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c index eb53c632f856..dfa3d94cfc74 100644 --- a/fs/sysfs/inode.c +++ b/fs/sysfs/inode.c | |||
@@ -107,8 +107,6 @@ int sysfs_setattr(struct dentry * dentry, struct iattr * iattr) | |||
107 | static inline void set_default_inode_attr(struct inode * inode, mode_t mode) | 107 | static inline void set_default_inode_attr(struct inode * inode, mode_t mode) |
108 | { | 108 | { |
109 | inode->i_mode = mode; | 109 | inode->i_mode = mode; |
110 | inode->i_uid = 0; | ||
111 | inode->i_gid = 0; | ||
112 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 110 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
113 | } | 111 | } |
114 | 112 | ||
@@ -149,7 +147,6 @@ static void sysfs_init_inode(struct sysfs_dirent *sd, struct inode *inode) | |||
149 | { | 147 | { |
150 | struct bin_attribute *bin_attr; | 148 | struct bin_attribute *bin_attr; |
151 | 149 | ||
152 | inode->i_blocks = 0; | ||
153 | inode->i_mapping->a_ops = &sysfs_aops; | 150 | inode->i_mapping->a_ops = &sysfs_aops; |
154 | inode->i_mapping->backing_dev_info = &sysfs_backing_dev_info; | 151 | inode->i_mapping->backing_dev_info = &sysfs_backing_dev_info; |
155 | inode->i_op = &sysfs_inode_operations; | 152 | inode->i_op = &sysfs_inode_operations; |
diff --git a/fs/xattr.c b/fs/xattr.c index 468377e66531..237804cd6b56 100644 --- a/fs/xattr.c +++ b/fs/xattr.c | |||
@@ -175,7 +175,7 @@ vfs_listxattr(struct dentry *d, char *list, size_t size) | |||
175 | if (error) | 175 | if (error) |
176 | return error; | 176 | return error; |
177 | error = -EOPNOTSUPP; | 177 | error = -EOPNOTSUPP; |
178 | if (d->d_inode->i_op && d->d_inode->i_op->listxattr) { | 178 | if (d->d_inode->i_op->listxattr) { |
179 | error = d->d_inode->i_op->listxattr(d, list, size); | 179 | error = d->d_inode->i_op->listxattr(d, list, size); |
180 | } else { | 180 | } else { |
181 | error = security_inode_listsecurity(d->d_inode, list, size); | 181 | error = security_inode_listsecurity(d->d_inode, list, size); |
diff --git a/include/linux/fs.h b/include/linux/fs.h index f2a3010140e3..8b916ce92e73 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -1830,7 +1830,7 @@ extern int __filemap_fdatawrite_range(struct address_space *mapping, | |||
1830 | extern int filemap_fdatawrite_range(struct address_space *mapping, | 1830 | extern int filemap_fdatawrite_range(struct address_space *mapping, |
1831 | loff_t start, loff_t end); | 1831 | loff_t start, loff_t end); |
1832 | 1832 | ||
1833 | extern long do_fsync(struct file *file, int datasync); | 1833 | extern int vfs_fsync(struct file *file, struct dentry *dentry, int datasync); |
1834 | extern void sync_supers(void); | 1834 | extern void sync_supers(void); |
1835 | extern void sync_filesystems(int wait); | 1835 | extern void sync_filesystems(int wait); |
1836 | extern void __fsync_super(struct super_block *sb); | 1836 | extern void __fsync_super(struct super_block *sb); |
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 04fb47bfb920..18d0a243a7b3 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
@@ -549,7 +549,7 @@ asmlinkage long sys_inotify_init(void); | |||
549 | asmlinkage long sys_inotify_init1(int flags); | 549 | asmlinkage long sys_inotify_init1(int flags); |
550 | asmlinkage long sys_inotify_add_watch(int fd, const char __user *path, | 550 | asmlinkage long sys_inotify_add_watch(int fd, const char __user *path, |
551 | u32 mask); | 551 | u32 mask); |
552 | asmlinkage long sys_inotify_rm_watch(int fd, u32 wd); | 552 | asmlinkage long sys_inotify_rm_watch(int fd, __s32 wd); |
553 | 553 | ||
554 | asmlinkage long sys_spu_run(int fd, __u32 __user *unpc, | 554 | asmlinkage long sys_spu_run(int fd, __u32 __user *unpc, |
555 | __u32 __user *ustatus); | 555 | __u32 __user *ustatus); |
diff --git a/ipc/mqueue.c b/ipc/mqueue.c index d448b69672b5..eddb6247a553 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c | |||
@@ -120,7 +120,6 @@ static struct inode *mqueue_get_inode(struct super_block *sb, int mode, | |||
120 | inode->i_mode = mode; | 120 | inode->i_mode = mode; |
121 | inode->i_uid = current_fsuid(); | 121 | inode->i_uid = current_fsuid(); |
122 | inode->i_gid = current_fsgid(); | 122 | inode->i_gid = current_fsgid(); |
123 | inode->i_blocks = 0; | ||
124 | inode->i_mtime = inode->i_ctime = inode->i_atime = | 123 | inode->i_mtime = inode->i_ctime = inode->i_atime = |
125 | CURRENT_TIME; | 124 | CURRENT_TIME; |
126 | 125 | ||
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 891a84eb9d30..87bb0258fd27 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
@@ -573,7 +573,6 @@ static struct inode *cgroup_new_inode(mode_t mode, struct super_block *sb) | |||
573 | inode->i_mode = mode; | 573 | inode->i_mode = mode; |
574 | inode->i_uid = current_fsuid(); | 574 | inode->i_uid = current_fsuid(); |
575 | inode->i_gid = current_fsgid(); | 575 | inode->i_gid = current_fsgid(); |
576 | inode->i_blocks = 0; | ||
577 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 576 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
578 | inode->i_mapping->backing_dev_info = &cgroup_backing_dev_info; | 577 | inode->i_mapping->backing_dev_info = &cgroup_backing_dev_info; |
579 | } | 578 | } |
diff --git a/mm/filemap.c b/mm/filemap.c index f8c69273c37f..f5769b4dc075 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -1766,7 +1766,7 @@ int should_remove_suid(struct dentry *dentry) | |||
1766 | if (unlikely((mode & S_ISGID) && (mode & S_IXGRP))) | 1766 | if (unlikely((mode & S_ISGID) && (mode & S_IXGRP))) |
1767 | kill |= ATTR_KILL_SGID; | 1767 | kill |= ATTR_KILL_SGID; |
1768 | 1768 | ||
1769 | if (unlikely(kill && !capable(CAP_FSETID))) | 1769 | if (unlikely(kill && !capable(CAP_FSETID) && S_ISREG(mode))) |
1770 | return kill; | 1770 | return kill; |
1771 | 1771 | ||
1772 | return 0; | 1772 | return 0; |
diff --git a/mm/memory.c b/mm/memory.c index 0a2010a9518c..7b9db658aca2 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -2266,7 +2266,7 @@ int vmtruncate(struct inode * inode, loff_t offset) | |||
2266 | unmap_mapping_range(mapping, offset + PAGE_SIZE - 1, 0, 1); | 2266 | unmap_mapping_range(mapping, offset + PAGE_SIZE - 1, 0, 1); |
2267 | } | 2267 | } |
2268 | 2268 | ||
2269 | if (inode->i_op && inode->i_op->truncate) | 2269 | if (inode->i_op->truncate) |
2270 | inode->i_op->truncate(inode); | 2270 | inode->i_op->truncate(inode); |
2271 | return 0; | 2271 | return 0; |
2272 | 2272 | ||
@@ -2286,7 +2286,7 @@ int vmtruncate_range(struct inode *inode, loff_t offset, loff_t end) | |||
2286 | * a way to truncate a range of blocks (punch a hole) - | 2286 | * a way to truncate a range of blocks (punch a hole) - |
2287 | * we should return failure right now. | 2287 | * we should return failure right now. |
2288 | */ | 2288 | */ |
2289 | if (!inode->i_op || !inode->i_op->truncate_range) | 2289 | if (!inode->i_op->truncate_range) |
2290 | return -ENOSYS; | 2290 | return -ENOSYS; |
2291 | 2291 | ||
2292 | mutex_lock(&inode->i_mutex); | 2292 | mutex_lock(&inode->i_mutex); |
diff --git a/mm/msync.c b/mm/msync.c index 144a7570535d..07dae08cf31c 100644 --- a/mm/msync.c +++ b/mm/msync.c | |||
@@ -82,7 +82,7 @@ asmlinkage long sys_msync(unsigned long start, size_t len, int flags) | |||
82 | (vma->vm_flags & VM_SHARED)) { | 82 | (vma->vm_flags & VM_SHARED)) { |
83 | get_file(file); | 83 | get_file(file); |
84 | up_read(&mm->mmap_sem); | 84 | up_read(&mm->mmap_sem); |
85 | error = do_fsync(file, 0); | 85 | error = vfs_fsync(file, file->f_path.dentry, 0); |
86 | fput(file); | 86 | fput(file); |
87 | if (error || start >= end) | 87 | if (error || start >= end) |
88 | goto out; | 88 | goto out; |
diff --git a/mm/nommu.c b/mm/nommu.c index 7695dc850785..1c28ea3a4e9c 100644 --- a/mm/nommu.c +++ b/mm/nommu.c | |||
@@ -86,7 +86,7 @@ do_expand: | |||
86 | i_size_write(inode, offset); | 86 | i_size_write(inode, offset); |
87 | 87 | ||
88 | out_truncate: | 88 | out_truncate: |
89 | if (inode->i_op && inode->i_op->truncate) | 89 | if (inode->i_op->truncate) |
90 | inode->i_op->truncate(inode); | 90 | inode->i_op->truncate(inode); |
91 | return 0; | 91 | return 0; |
92 | out_sig: | 92 | out_sig: |
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index 192453248870..577385a4a5dc 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c | |||
@@ -522,8 +522,6 @@ rpc_get_inode(struct super_block *sb, int mode) | |||
522 | if (!inode) | 522 | if (!inode) |
523 | return NULL; | 523 | return NULL; |
524 | inode->i_mode = mode; | 524 | inode->i_mode = mode; |
525 | inode->i_uid = inode->i_gid = 0; | ||
526 | inode->i_blocks = 0; | ||
527 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 525 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
528 | switch(mode & S_IFMT) { | 526 | switch(mode & S_IFMT) { |
529 | case S_IFDIR: | 527 | case S_IFDIR: |
diff --git a/security/commoncap.c b/security/commoncap.c index 79713545cd63..69fc9952650f 100644 --- a/security/commoncap.c +++ b/security/commoncap.c | |||
@@ -238,7 +238,7 @@ int cap_inode_need_killpriv(struct dentry *dentry) | |||
238 | struct inode *inode = dentry->d_inode; | 238 | struct inode *inode = dentry->d_inode; |
239 | int error; | 239 | int error; |
240 | 240 | ||
241 | if (!inode->i_op || !inode->i_op->getxattr) | 241 | if (!inode->i_op->getxattr) |
242 | return 0; | 242 | return 0; |
243 | 243 | ||
244 | error = inode->i_op->getxattr(dentry, XATTR_NAME_CAPS, NULL, 0); | 244 | error = inode->i_op->getxattr(dentry, XATTR_NAME_CAPS, NULL, 0); |
@@ -259,7 +259,7 @@ int cap_inode_killpriv(struct dentry *dentry) | |||
259 | { | 259 | { |
260 | struct inode *inode = dentry->d_inode; | 260 | struct inode *inode = dentry->d_inode; |
261 | 261 | ||
262 | if (!inode->i_op || !inode->i_op->removexattr) | 262 | if (!inode->i_op->removexattr) |
263 | return 0; | 263 | return 0; |
264 | 264 | ||
265 | return inode->i_op->removexattr(dentry, XATTR_NAME_CAPS); | 265 | return inode->i_op->removexattr(dentry, XATTR_NAME_CAPS); |
@@ -317,7 +317,7 @@ int get_vfs_caps_from_disk(const struct dentry *dentry, struct cpu_vfs_cap_data | |||
317 | 317 | ||
318 | memset(cpu_caps, 0, sizeof(struct cpu_vfs_cap_data)); | 318 | memset(cpu_caps, 0, sizeof(struct cpu_vfs_cap_data)); |
319 | 319 | ||
320 | if (!inode || !inode->i_op || !inode->i_op->getxattr) | 320 | if (!inode || !inode->i_op->getxattr) |
321 | return -ENODATA; | 321 | return -ENODATA; |
322 | 322 | ||
323 | size = inode->i_op->getxattr((struct dentry *)dentry, XATTR_NAME_CAPS, &caps, | 323 | size = inode->i_op->getxattr((struct dentry *)dentry, XATTR_NAME_CAPS, &caps, |
diff --git a/security/inode.c b/security/inode.c index efea5a605466..007ef252dde7 100644 --- a/security/inode.c +++ b/security/inode.c | |||
@@ -61,9 +61,6 @@ static struct inode *get_inode(struct super_block *sb, int mode, dev_t dev) | |||
61 | 61 | ||
62 | if (inode) { | 62 | if (inode) { |
63 | inode->i_mode = mode; | 63 | inode->i_mode = mode; |
64 | inode->i_uid = 0; | ||
65 | inode->i_gid = 0; | ||
66 | inode->i_blocks = 0; | ||
67 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 64 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
68 | switch (mode & S_IFMT) { | 65 | switch (mode & S_IFMT) { |
69 | default: | 66 | default: |
diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c index e5520996a75b..8f612c8becb5 100644 --- a/security/selinux/selinuxfs.c +++ b/security/selinux/selinuxfs.c | |||
@@ -847,8 +847,6 @@ static struct inode *sel_make_inode(struct super_block *sb, int mode) | |||
847 | 847 | ||
848 | if (ret) { | 848 | if (ret) { |
849 | ret->i_mode = mode; | 849 | ret->i_mode = mode; |
850 | ret->i_uid = ret->i_gid = 0; | ||
851 | ret->i_blocks = 0; | ||
852 | ret->i_atime = ret->i_mtime = ret->i_ctime = CURRENT_TIME; | 850 | ret->i_atime = ret->i_mtime = ret->i_ctime = CURRENT_TIME; |
853 | } | 851 | } |
854 | return ret; | 852 | return ret; |