static int
+zpl_open(struct inode *ip, struct file *filp)
+{
+ cred_t *cr = CRED();
+ int error;
+
+ crhold(cr);
+ error = -zfs_open(ip, filp->f_mode, filp->f_flags, cr);
+ crfree(cr);
+ ASSERT3S(error, <=, 0);
+
+ if (error)
+ return (error);
+
+ return generic_file_open(ip, filp);
+}
+
+static int
+zpl_release(struct inode *ip, struct file *filp)
+{
+ cred_t *cr = CRED();
+ int error;
+
+ crhold(cr);
+ error = -zfs_close(ip, filp->f_flags, cr);
+ crfree(cr);
+ ASSERT3S(error, <=, 0);
+
+ return (error);
+}
+
+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);
}
-static int
-zpl_fsync(struct file *filp, struct dentry *dentry, int datasync)
+ZPL_FSYNC_PROTO(zpl_fsync, filp, unused_dentry, datasync)
{
- cred_t *cr;
+ cred_t *cr = CRED();
int error;
- cr = (cred_t *)get_current_cred();
+ crhold(cr);
error = -zfs_fsync(filp->f_path.dentry->d_inode, datasync, cr);
- put_cred(cr);
+ crfree(cr);
ASSERT3S(error, <=, 0);
return (error);
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);
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);
struct inode *ip;
loff_t off, i_size;
size_t len, wrote;
- cred_t *cr;
+ cred_t *cr = CRED();
void *pb;
int error = 0;
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);
memset(pb + len, 0, PAGE_CACHE_SIZE - len);
kunmap(pp);
- put_cred(cr);
+ crfree(cr);
if (error) {
SetPageError(pp);
struct inode *ip;
loff_t off, i_size;
size_t len, read;
- cred_t *cr;
+ cred_t *cr = CRED();
void *pb;
int error = 0;
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);
error = -EIO;
kunmap(pp);
- put_cred(cr);
+ crfree(cr);
if (error) {
SetPageError(pp);
};
const struct file_operations zpl_file_operations = {
- .open = generic_file_open,
+ .open = zpl_open,
+ .release = zpl_release,
.llseek = generic_file_llseek,
.read = zpl_read,
.write = zpl_write,