On Sat, Dec 08, 2012 at 07:08:16AM -0500, Christoph Hellwig wrote: > Call xfs_alloc_file_space or xfs_free_file_space directly from > xfs_file_fallocate instead of going through xfs_change_file_space. > > This simplified the code by removing the unessecary marshalling of the > arguments into an xfs_flock64_t structure and allows removing checks that > are already done in the VFS code. ..... > goto out_unlock; > + setprealloc = true; You don't use this flag anywhere ;) > } > > - if (file->f_flags & O_DSYNC) > - attr_flags |= XFS_ATTR_SYNC; > > - error = -xfs_change_file_space(ip, cmd, &bf, 0, attr_flags); > + tp = xfs_trans_alloc(ip->i_mount, XFS_TRANS_WRITEID); > + error = xfs_trans_reserve(tp, 0, XFS_WRITEID_LOG_RES(ip->i_mount), > + 0, 0, 0); > + if (error) { > + xfs_trans_cancel(tp, 0); > + goto out_unlock; > + } > + > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); > + ip->i_d.di_mode &= ~S_ISUID; > + if (ip->i_d.di_mode & S_IXGRP) > + ip->i_d.di_mode &= ~S_ISGID; > + > + if (!(mode & FALLOC_FL_PUNCH_HOLE)) > + ip->i_d.di_flags |= XFS_DIFLAG_PREALLOC; > + > + xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); > + > + if (file->f_flags & O_DSYNC) > + xfs_trans_set_sync(tp); > + error = xfs_trans_commit(tp, 0); While I like most of this series, I don't really like the duplication of this piece of code. It seems to me that a simple helper like: int xfs_inode_set_prealloc( struct xfs_inode *ip, bool set_prealloc, bool clear_prealloc, bool clear_sguid, bool sync) might be better, and call it from both the ioctl and fallocate code... Cheers, Dave. -- Dave Chinner david@xxxxxxxxxxxxx _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs