X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=module%2Fzfs%2Fzpl_file.c;h=de66ff4b49200f6bf6d997bdfde8f9ced671cb9f;hb=36391312afdfac5584ca40ef1af7721108ce4c20;hp=d76e62d4326a16257e88d9e78034bf2dc24bebad;hpb=126400a1ca656d41dea9d2ad88afbec3ed32d391;p=zfs.git diff --git a/module/zfs/zpl_file.c b/module/zfs/zpl_file.c index d76e62d..de66ff4 100644 --- a/module/zfs/zpl_file.c +++ b/module/zfs/zpl_file.c @@ -32,12 +32,12 @@ static int zpl_open(struct inode *ip, struct file *filp) { - cred_t *cr; + cred_t *cr = CRED(); int error; - cr = (cred_t *)get_current_cred(); + crhold(cr); error = -zfs_open(ip, filp->f_mode, filp->f_flags, cr); - put_cred(cr); + crfree(cr); ASSERT3S(error, <=, 0); if (error) @@ -49,12 +49,12 @@ zpl_open(struct inode *ip, struct file *filp) static int zpl_release(struct inode *ip, struct file *filp) { - cred_t *cr; + cred_t *cr = CRED(); int error; - cr = (cred_t *)get_current_cred(); + crhold(cr); error = -zfs_close(ip, filp->f_flags, cr); - put_cred(cr); + crfree(cr); ASSERT3S(error, <=, 0); return (error); @@ -64,26 +64,45 @@ static int zpl_readdir(struct file *filp, void *dirent, filldir_t filldir) { struct dentry *dentry = filp->f_path.dentry; - cred_t *cr; + cred_t *cr = CRED(); int error; - cr = (cred_t *)get_current_cred(); + crhold(cr); error = -zfs_readdir(dentry->d_inode, dirent, filldir, &filp->f_pos, cr); - put_cred(cr); + crfree(cr); ASSERT3S(error, <=, 0); return (error); } -ZPL_FSYNC_PROTO(zpl_fsync, filp, unused_dentry, datasync) +/* + * 2.6.35 API change, + * As of 2.6.35 the dentry argument to the .fsync() vfs hook was deemed + * redundant. The dentry is still accessible via filp->f_path.dentry, + * and we are guaranteed that filp will never be NULL. + * + * 2.6.34 API change, + * Prior to 2.6.34 the nfsd kernel server would pass a NULL file struct * + * to the .fsync() hook. For this reason, we must be careful not to use + * filp unconditionally in the 3 argument case. + */ +#ifdef HAVE_2ARGS_FSYNC +static int +zpl_fsync(struct file *filp, int datasync) +{ + struct dentry *dentry = filp->f_path.dentry; +#else +static int +zpl_fsync(struct file *filp, struct dentry *dentry, int datasync) { - cred_t *cr; +#endif /* HAVE_2ARGS_FSYNC */ + cred_t *cr = CRED(); int error; - cr = (cred_t *)get_current_cred(); - error = -zfs_fsync(filp->f_path.dentry->d_inode, datasync, cr); - put_cred(cr); + crhold(cr); + error = -zfs_fsync(dentry->d_inode, datasync, cr); + crfree(cr); ASSERT3S(error, <=, 0); return (error); @@ -117,13 +136,13 @@ zpl_read_common(struct inode *ip, const char *buf, size_t len, loff_t pos, static ssize_t zpl_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos) { - cred_t *cr; + cred_t *cr = CRED(); ssize_t read; - cr = (cred_t *)get_current_cred(); + crhold(cr); read = zpl_read_common(filp->f_mapping->host, buf, len, *ppos, UIO_USERSPACE, filp->f_flags, cr); - put_cred(cr); + crfree(cr); if (read < 0) return (read); @@ -160,13 +179,13 @@ zpl_write_common(struct inode *ip, const char *buf, size_t len, loff_t pos, static ssize_t zpl_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos) { - cred_t *cr; + cred_t *cr = CRED(); ssize_t wrote; - cr = (cred_t *)get_current_cred(); + crhold(cr); wrote = zpl_write_common(filp->f_mapping->host, buf, len, *ppos, UIO_USERSPACE, filp->f_flags, cr); - put_cred(cr); + crfree(cr); if (wrote < 0) return (wrote); @@ -250,7 +269,7 @@ zpl_readpage(struct file *filp, struct page *pp) struct inode *ip; loff_t off, i_size; size_t len, wrote; - cred_t *cr; + cred_t *cr = CRED(); void *pb; int error = 0; @@ -260,7 +279,7 @@ zpl_readpage(struct file *filp, struct page *pp) i_size = i_size_read(ip); ASSERT3S(off, <, i_size); - cr = (cred_t *)get_current_cred(); + crhold(cr); len = MIN(PAGE_CACHE_SIZE, i_size - off); pb = kmap(pp); @@ -274,7 +293,7 @@ zpl_readpage(struct file *filp, struct page *pp) memset(pb + len, 0, PAGE_CACHE_SIZE - len); kunmap(pp); - put_cred(cr); + crfree(cr); if (error) { SetPageError(pp); @@ -306,7 +325,7 @@ zpl_writepage(struct page *pp, struct writeback_control *wbc) struct inode *ip; loff_t off, i_size; size_t len, read; - cred_t *cr; + cred_t *cr = CRED(); void *pb; int error = 0; @@ -315,7 +334,7 @@ zpl_writepage(struct page *pp, struct writeback_control *wbc) off = page_offset(pp); i_size = i_size_read(ip); - cr = (cred_t *)get_current_cred(); + crhold(cr); len = MIN(PAGE_CACHE_SIZE, i_size - off); pb = kmap(pp); @@ -326,7 +345,7 @@ zpl_writepage(struct page *pp, struct writeback_control *wbc) error = -EIO; kunmap(pp); - put_cred(cr); + crfree(cr); if (error) { SetPageError(pp);