Commit 8018ab057480974e7f26a387bf4ce040e9a5f6f1
Committed by
Al Viro
1 parent
e970a573ce
Exists in
master
and in
7 other branches
sanitize vfs_fsync calling conventions
Now that the last user passing a NULL file pointer is gone we can remove the redundant dentry argument and associated hacks inside vfs_fsynmc_range. The next step will be removig the dentry argument from ->fsync, but given the luck with the last round of method prototype changes I'd rather defer this until after the main merge window. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Showing 11 changed files with 24 additions and 54 deletions Side-by-side Diff
drivers/block/loop.c
| ... | ... | @@ -485,7 +485,7 @@ |
| 485 | 485 | goto out; |
| 486 | 486 | } |
| 487 | 487 | |
| 488 | - ret = vfs_fsync(file, file->f_path.dentry, 0); | |
| 488 | + ret = vfs_fsync(file, 0); | |
| 489 | 489 | if (unlikely(ret)) { |
| 490 | 490 | ret = -EIO; |
| 491 | 491 | goto out; |
| ... | ... | @@ -495,7 +495,7 @@ |
| 495 | 495 | ret = lo_send(lo, bio, pos); |
| 496 | 496 | |
| 497 | 497 | if (barrier && !ret) { |
| 498 | - ret = vfs_fsync(file, file->f_path.dentry, 0); | |
| 498 | + ret = vfs_fsync(file, 0); | |
| 499 | 499 | if (unlikely(ret)) |
| 500 | 500 | ret = -EIO; |
| 501 | 501 | } |
drivers/md/bitmap.c
| ... | ... | @@ -1692,7 +1692,7 @@ |
| 1692 | 1692 | * and bypass the page cache, we must sync the file |
| 1693 | 1693 | * first. |
| 1694 | 1694 | */ |
| 1695 | - vfs_fsync(file, file->f_dentry, 1); | |
| 1695 | + vfs_fsync(file, 1); | |
| 1696 | 1696 | } |
| 1697 | 1697 | /* read superblock from bitmap file (this sets mddev->bitmap_info.chunksize) */ |
| 1698 | 1698 | if (!mddev->bitmap_info.external) |
drivers/usb/gadget/storage_common.c
fs/ceph/file.c
| ... | ... | @@ -844,8 +844,7 @@ |
| 844 | 844 | if ((ret >= 0 || ret == -EIOCBQUEUED) && |
| 845 | 845 | ((file->f_flags & O_SYNC) || IS_SYNC(file->f_mapping->host) |
| 846 | 846 | || ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_NEARFULL))) { |
| 847 | - err = vfs_fsync_range(file, file->f_path.dentry, | |
| 848 | - pos, pos + ret - 1, 1); | |
| 847 | + err = vfs_fsync_range(file, pos, pos + ret - 1, 1); | |
| 849 | 848 | if (err < 0) |
| 850 | 849 | ret = err; |
| 851 | 850 | } |
fs/coda/file.c
| ... | ... | @@ -217,7 +217,7 @@ |
| 217 | 217 | BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); |
| 218 | 218 | host_file = cfi->cfi_container; |
| 219 | 219 | |
| 220 | - err = vfs_fsync(host_file, host_file->f_path.dentry, datasync); | |
| 220 | + err = vfs_fsync(host_file, datasync); | |
| 221 | 221 | if ( !err && !datasync ) { |
| 222 | 222 | lock_kernel(); |
| 223 | 223 | err = venus_fsync(coda_inode->i_sb, coda_i2f(coda_inode)); |
fs/ecryptfs/file.c
| ... | ... | @@ -276,9 +276,7 @@ |
| 276 | 276 | static int |
| 277 | 277 | ecryptfs_fsync(struct file *file, struct dentry *dentry, int datasync) |
| 278 | 278 | { |
| 279 | - return vfs_fsync(ecryptfs_file_to_lower(file), | |
| 280 | - ecryptfs_dentry_to_lower(dentry), | |
| 281 | - datasync); | |
| 279 | + return vfs_fsync(ecryptfs_file_to_lower(file), datasync); | |
| 282 | 280 | } |
| 283 | 281 | |
| 284 | 282 | static int ecryptfs_fasync(int fd, struct file *file, int flag) |
fs/nfsd/nfs4recover.c
| ... | ... | @@ -158,7 +158,7 @@ |
| 158 | 158 | mutex_unlock(&dir->d_inode->i_mutex); |
| 159 | 159 | if (status == 0) { |
| 160 | 160 | clp->cl_firststate = 1; |
| 161 | - vfs_fsync(rec_file, rec_file->f_path.dentry, 0); | |
| 161 | + vfs_fsync(rec_file, 0); | |
| 162 | 162 | } |
| 163 | 163 | nfs4_reset_creds(original_cred); |
| 164 | 164 | dprintk("NFSD: nfsd4_create_clid_dir returns %d\n", status); |
| ... | ... | @@ -288,7 +288,7 @@ |
| 288 | 288 | status = nfsd4_unlink_clid_dir(clp->cl_recdir, HEXDIR_LEN-1); |
| 289 | 289 | nfs4_reset_creds(original_cred); |
| 290 | 290 | if (status == 0) |
| 291 | - vfs_fsync(rec_file, rec_file->f_path.dentry, 0); | |
| 291 | + vfs_fsync(rec_file, 0); | |
| 292 | 292 | mnt_drop_write(rec_file->f_path.mnt); |
| 293 | 293 | out: |
| 294 | 294 | if (status) |
| ... | ... | @@ -325,7 +325,7 @@ |
| 325 | 325 | goto out; |
| 326 | 326 | status = nfsd4_list_rec_dir(rec_file->f_path.dentry, purge_old); |
| 327 | 327 | if (status == 0) |
| 328 | - vfs_fsync(rec_file, rec_file->f_path.dentry, 0); | |
| 328 | + vfs_fsync(rec_file, 0); | |
| 329 | 329 | mnt_drop_write(rec_file->f_path.mnt); |
| 330 | 330 | out: |
| 331 | 331 | if (status) |
fs/nfsd/vfs.c
| ... | ... | @@ -999,7 +999,7 @@ |
| 999 | 999 | |
| 1000 | 1000 | if (inode->i_state & I_DIRTY) { |
| 1001 | 1001 | dprintk("nfsd: write sync %d\n", task_pid_nr(current)); |
| 1002 | - err = vfs_fsync(file, file->f_path.dentry, 0); | |
| 1002 | + err = vfs_fsync(file, 0); | |
| 1003 | 1003 | } |
| 1004 | 1004 | last_ino = inode->i_ino; |
| 1005 | 1005 | last_dev = inode->i_sb->s_dev; |
| ... | ... | @@ -1175,8 +1175,7 @@ |
| 1175 | 1175 | if (err) |
| 1176 | 1176 | goto out; |
| 1177 | 1177 | if (EX_ISSYNC(fhp->fh_export)) { |
| 1178 | - int err2 = vfs_fsync_range(file, file->f_path.dentry, | |
| 1179 | - offset, end, 0); | |
| 1178 | + int err2 = vfs_fsync_range(file, offset, end, 0); | |
| 1180 | 1179 | |
| 1181 | 1180 | if (err2 != -EINVAL) |
| 1182 | 1181 | err = nfserrno(err2); |
fs/sync.c
| ... | ... | @@ -158,7 +158,6 @@ |
| 158 | 158 | /** |
| 159 | 159 | * vfs_fsync_range - helper to sync a range of data & metadata to disk |
| 160 | 160 | * @file: file to sync |
| 161 | - * @dentry: dentry of @file | |
| 162 | 161 | * @start: offset in bytes of the beginning of data range to sync |
| 163 | 162 | * @end: offset in bytes of the end of data range (inclusive) |
| 164 | 163 | * @datasync: perform only datasync |
| 165 | 164 | |
| 166 | 165 | |
| 167 | 166 | |
| ... | ... | @@ -166,32 +165,13 @@ |
| 166 | 165 | * Write back data in range @start..@end and metadata for @file to disk. If |
| 167 | 166 | * @datasync is set only metadata needed to access modified file data is |
| 168 | 167 | * written. |
| 169 | - * | |
| 170 | - * In case this function is called from nfsd @file may be %NULL and | |
| 171 | - * only @dentry is set. This can only happen when the filesystem | |
| 172 | - * implements the export_operations API. | |
| 173 | 168 | */ |
| 174 | -int vfs_fsync_range(struct file *file, struct dentry *dentry, loff_t start, | |
| 175 | - loff_t end, int datasync) | |
| 169 | +int vfs_fsync_range(struct file *file, loff_t start, loff_t end, int datasync) | |
| 176 | 170 | { |
| 177 | - const struct file_operations *fop; | |
| 178 | - struct address_space *mapping; | |
| 171 | + struct address_space *mapping = file->f_mapping; | |
| 179 | 172 | int err, ret; |
| 180 | 173 | |
| 181 | - /* | |
| 182 | - * Get mapping and operations from the file in case we have | |
| 183 | - * as file, or get the default values for them in case we | |
| 184 | - * don't have a struct file available. Damn nfsd.. | |
| 185 | - */ | |
| 186 | - if (file) { | |
| 187 | - mapping = file->f_mapping; | |
| 188 | - fop = file->f_op; | |
| 189 | - } else { | |
| 190 | - mapping = dentry->d_inode->i_mapping; | |
| 191 | - fop = dentry->d_inode->i_fop; | |
| 192 | - } | |
| 193 | - | |
| 194 | - if (!fop || !fop->fsync) { | |
| 174 | + if (!file->f_op || !file->f_op->fsync) { | |
| 195 | 175 | ret = -EINVAL; |
| 196 | 176 | goto out; |
| 197 | 177 | } |
| ... | ... | @@ -203,7 +183,7 @@ |
| 203 | 183 | * livelocks in fsync_buffers_list(). |
| 204 | 184 | */ |
| 205 | 185 | mutex_lock(&mapping->host->i_mutex); |
| 206 | - err = fop->fsync(file, dentry, datasync); | |
| 186 | + err = file->f_op->fsync(file, file->f_path.dentry, datasync); | |
| 207 | 187 | if (!ret) |
| 208 | 188 | ret = err; |
| 209 | 189 | mutex_unlock(&mapping->host->i_mutex); |
| 210 | 190 | |
| 211 | 191 | |
| 212 | 192 | |
| ... | ... | @@ -216,19 +196,14 @@ |
| 216 | 196 | /** |
| 217 | 197 | * vfs_fsync - perform a fsync or fdatasync on a file |
| 218 | 198 | * @file: file to sync |
| 219 | - * @dentry: dentry of @file | |
| 220 | 199 | * @datasync: only perform a fdatasync operation |
| 221 | 200 | * |
| 222 | 201 | * Write back data and metadata for @file to disk. If @datasync is |
| 223 | 202 | * set only metadata needed to access modified file data is written. |
| 224 | - * | |
| 225 | - * In case this function is called from nfsd @file may be %NULL and | |
| 226 | - * only @dentry is set. This can only happen when the filesystem | |
| 227 | - * implements the export_operations API. | |
| 228 | 203 | */ |
| 229 | -int vfs_fsync(struct file *file, struct dentry *dentry, int datasync) | |
| 204 | +int vfs_fsync(struct file *file, int datasync) | |
| 230 | 205 | { |
| 231 | - return vfs_fsync_range(file, dentry, 0, LLONG_MAX, datasync); | |
| 206 | + return vfs_fsync_range(file, 0, LLONG_MAX, datasync); | |
| 232 | 207 | } |
| 233 | 208 | EXPORT_SYMBOL(vfs_fsync); |
| 234 | 209 | |
| ... | ... | @@ -239,7 +214,7 @@ |
| 239 | 214 | |
| 240 | 215 | file = fget(fd); |
| 241 | 216 | if (file) { |
| 242 | - ret = vfs_fsync(file, file->f_path.dentry, datasync); | |
| 217 | + ret = vfs_fsync(file, datasync); | |
| 243 | 218 | fput(file); |
| 244 | 219 | } |
| 245 | 220 | return ret; |
| ... | ... | @@ -267,8 +242,7 @@ |
| 267 | 242 | { |
| 268 | 243 | if (!(file->f_flags & O_DSYNC) && !IS_SYNC(file->f_mapping->host)) |
| 269 | 244 | return 0; |
| 270 | - return vfs_fsync_range(file, file->f_path.dentry, pos, | |
| 271 | - pos + count - 1, | |
| 245 | + return vfs_fsync_range(file, pos, pos + count - 1, | |
| 272 | 246 | (file->f_flags & __O_SYNC) ? 0 : 1); |
| 273 | 247 | } |
| 274 | 248 | EXPORT_SYMBOL(generic_write_sync); |
include/linux/fs.h
| ... | ... | @@ -2084,9 +2084,9 @@ |
| 2084 | 2084 | extern int filemap_fdatawrite_range(struct address_space *mapping, |
| 2085 | 2085 | loff_t start, loff_t end); |
| 2086 | 2086 | |
| 2087 | -extern int vfs_fsync_range(struct file *file, struct dentry *dentry, | |
| 2088 | - loff_t start, loff_t end, int datasync); | |
| 2089 | -extern int vfs_fsync(struct file *file, struct dentry *dentry, int datasync); | |
| 2087 | +extern int vfs_fsync_range(struct file *file, loff_t start, loff_t end, | |
| 2088 | + int datasync); | |
| 2089 | +extern int vfs_fsync(struct file *file, int datasync); | |
| 2090 | 2090 | extern int generic_write_sync(struct file *file, loff_t pos, loff_t count); |
| 2091 | 2091 | extern void sync_supers(void); |
| 2092 | 2092 | extern void emergency_sync(void); |
mm/msync.c