mirror of
https://github.com/team-infusion-developers/android_kernel_samsung_msm8976.git
synced 2024-09-21 03:43:03 +00:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs
Pull v9fs updates from Eric Van Hensbergen: "Just fixes and simplifications" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs: fs/9p: Fix atomic_open fs/9p: Don't use O_TRUNC flag in TOPEN and TLOPEN request locking in fs/9p ->readdir()
This commit is contained in:
commit
2608e3d0fa
|
@ -52,10 +52,9 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct p9_rdir {
|
struct p9_rdir {
|
||||||
struct mutex mutex;
|
|
||||||
int head;
|
int head;
|
||||||
int tail;
|
int tail;
|
||||||
uint8_t *buf;
|
uint8_t buf[];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -93,33 +92,12 @@ static void p9stat_init(struct p9_wstat *stbuf)
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int v9fs_alloc_rdir_buf(struct file *filp, int buflen)
|
static struct p9_rdir *v9fs_alloc_rdir_buf(struct file *filp, int buflen)
|
||||||
{
|
{
|
||||||
struct p9_rdir *rdir;
|
struct p9_fid *fid = filp->private_data;
|
||||||
struct p9_fid *fid;
|
if (!fid->rdir)
|
||||||
int err = 0;
|
fid->rdir = kzalloc(sizeof(struct p9_rdir) + buflen, GFP_KERNEL);
|
||||||
|
return fid->rdir;
|
||||||
fid = filp->private_data;
|
|
||||||
if (!fid->rdir) {
|
|
||||||
rdir = kmalloc(sizeof(struct p9_rdir) + buflen, GFP_KERNEL);
|
|
||||||
|
|
||||||
if (rdir == NULL) {
|
|
||||||
err = -ENOMEM;
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
spin_lock(&filp->f_dentry->d_lock);
|
|
||||||
if (!fid->rdir) {
|
|
||||||
rdir->buf = (uint8_t *)rdir + sizeof(struct p9_rdir);
|
|
||||||
mutex_init(&rdir->mutex);
|
|
||||||
rdir->head = rdir->tail = 0;
|
|
||||||
fid->rdir = (void *) rdir;
|
|
||||||
rdir = NULL;
|
|
||||||
}
|
|
||||||
spin_unlock(&filp->f_dentry->d_lock);
|
|
||||||
kfree(rdir);
|
|
||||||
}
|
|
||||||
exit:
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -145,20 +123,16 @@ static int v9fs_dir_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
||||||
|
|
||||||
buflen = fid->clnt->msize - P9_IOHDRSZ;
|
buflen = fid->clnt->msize - P9_IOHDRSZ;
|
||||||
|
|
||||||
err = v9fs_alloc_rdir_buf(filp, buflen);
|
rdir = v9fs_alloc_rdir_buf(filp, buflen);
|
||||||
if (err)
|
if (!rdir)
|
||||||
goto exit;
|
return -ENOMEM;
|
||||||
rdir = (struct p9_rdir *) fid->rdir;
|
|
||||||
|
|
||||||
err = mutex_lock_interruptible(&rdir->mutex);
|
while (1) {
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
while (err == 0) {
|
|
||||||
if (rdir->tail == rdir->head) {
|
if (rdir->tail == rdir->head) {
|
||||||
err = v9fs_file_readn(filp, rdir->buf, NULL,
|
err = v9fs_file_readn(filp, rdir->buf, NULL,
|
||||||
buflen, filp->f_pos);
|
buflen, filp->f_pos);
|
||||||
if (err <= 0)
|
if (err <= 0)
|
||||||
goto unlock_and_exit;
|
return err;
|
||||||
|
|
||||||
rdir->head = 0;
|
rdir->head = 0;
|
||||||
rdir->tail = err;
|
rdir->tail = err;
|
||||||
|
@ -169,9 +143,8 @@ static int v9fs_dir_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
||||||
rdir->tail - rdir->head, &st);
|
rdir->tail - rdir->head, &st);
|
||||||
if (err) {
|
if (err) {
|
||||||
p9_debug(P9_DEBUG_VFS, "returned %d\n", err);
|
p9_debug(P9_DEBUG_VFS, "returned %d\n", err);
|
||||||
err = -EIO;
|
|
||||||
p9stat_free(&st);
|
p9stat_free(&st);
|
||||||
goto unlock_and_exit;
|
return -EIO;
|
||||||
}
|
}
|
||||||
reclen = st.size+2;
|
reclen = st.size+2;
|
||||||
|
|
||||||
|
@ -180,19 +153,13 @@ static int v9fs_dir_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
||||||
|
|
||||||
p9stat_free(&st);
|
p9stat_free(&st);
|
||||||
|
|
||||||
if (over) {
|
if (over)
|
||||||
err = 0;
|
return 0;
|
||||||
goto unlock_and_exit;
|
|
||||||
}
|
|
||||||
rdir->head += reclen;
|
rdir->head += reclen;
|
||||||
filp->f_pos += reclen;
|
filp->f_pos += reclen;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unlock_and_exit:
|
|
||||||
mutex_unlock(&rdir->mutex);
|
|
||||||
exit:
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -218,21 +185,16 @@ static int v9fs_dir_readdir_dotl(struct file *filp, void *dirent,
|
||||||
|
|
||||||
buflen = fid->clnt->msize - P9_READDIRHDRSZ;
|
buflen = fid->clnt->msize - P9_READDIRHDRSZ;
|
||||||
|
|
||||||
err = v9fs_alloc_rdir_buf(filp, buflen);
|
rdir = v9fs_alloc_rdir_buf(filp, buflen);
|
||||||
if (err)
|
if (!rdir)
|
||||||
goto exit;
|
return -ENOMEM;
|
||||||
rdir = (struct p9_rdir *) fid->rdir;
|
|
||||||
|
|
||||||
err = mutex_lock_interruptible(&rdir->mutex);
|
while (1) {
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
|
|
||||||
while (err == 0) {
|
|
||||||
if (rdir->tail == rdir->head) {
|
if (rdir->tail == rdir->head) {
|
||||||
err = p9_client_readdir(fid, rdir->buf, buflen,
|
err = p9_client_readdir(fid, rdir->buf, buflen,
|
||||||
filp->f_pos);
|
filp->f_pos);
|
||||||
if (err <= 0)
|
if (err <= 0)
|
||||||
goto unlock_and_exit;
|
return err;
|
||||||
|
|
||||||
rdir->head = 0;
|
rdir->head = 0;
|
||||||
rdir->tail = err;
|
rdir->tail = err;
|
||||||
|
@ -245,8 +207,7 @@ static int v9fs_dir_readdir_dotl(struct file *filp, void *dirent,
|
||||||
&curdirent);
|
&curdirent);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
p9_debug(P9_DEBUG_VFS, "returned %d\n", err);
|
p9_debug(P9_DEBUG_VFS, "returned %d\n", err);
|
||||||
err = -EIO;
|
return -EIO;
|
||||||
goto unlock_and_exit;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* d_off in dirent structure tracks the offset into
|
/* d_off in dirent structure tracks the offset into
|
||||||
|
@ -261,20 +222,13 @@ static int v9fs_dir_readdir_dotl(struct file *filp, void *dirent,
|
||||||
curdirent.d_type);
|
curdirent.d_type);
|
||||||
oldoffset = curdirent.d_off;
|
oldoffset = curdirent.d_off;
|
||||||
|
|
||||||
if (over) {
|
if (over)
|
||||||
err = 0;
|
return 0;
|
||||||
goto unlock_and_exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
filp->f_pos = curdirent.d_off;
|
filp->f_pos = curdirent.d_off;
|
||||||
rdir->head += err;
|
rdir->head += err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unlock_and_exit:
|
|
||||||
mutex_unlock(&rdir->mutex);
|
|
||||||
exit:
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -80,10 +80,6 @@ int v9fs_file_open(struct inode *inode, struct file *file)
|
||||||
p9_client_clunk(fid);
|
p9_client_clunk(fid);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
if (file->f_flags & O_TRUNC) {
|
|
||||||
i_size_write(inode, 0);
|
|
||||||
inode->i_blocks = 0;
|
|
||||||
}
|
|
||||||
if ((file->f_flags & O_APPEND) &&
|
if ((file->f_flags & O_APPEND) &&
|
||||||
(!v9fs_proto_dotu(v9ses) && !v9fs_proto_dotl(v9ses)))
|
(!v9fs_proto_dotu(v9ses) && !v9fs_proto_dotl(v9ses)))
|
||||||
generic_file_llseek(file, 0, SEEK_END);
|
generic_file_llseek(file, 0, SEEK_END);
|
||||||
|
|
|
@ -192,9 +192,6 @@ int v9fs_uflags2omode(int uflags, int extended)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (uflags & O_TRUNC)
|
|
||||||
ret |= P9_OTRUNC;
|
|
||||||
|
|
||||||
if (extended) {
|
if (extended) {
|
||||||
if (uflags & O_EXCL)
|
if (uflags & O_EXCL)
|
||||||
ret |= P9_OEXCL;
|
ret |= P9_OEXCL;
|
||||||
|
|
|
@ -186,7 +186,6 @@ static int v9fs_mapped_dotl_flags(int flags)
|
||||||
{ O_CREAT, P9_DOTL_CREATE },
|
{ O_CREAT, P9_DOTL_CREATE },
|
||||||
{ O_EXCL, P9_DOTL_EXCL },
|
{ O_EXCL, P9_DOTL_EXCL },
|
||||||
{ O_NOCTTY, P9_DOTL_NOCTTY },
|
{ O_NOCTTY, P9_DOTL_NOCTTY },
|
||||||
{ O_TRUNC, P9_DOTL_TRUNC },
|
|
||||||
{ O_APPEND, P9_DOTL_APPEND },
|
{ O_APPEND, P9_DOTL_APPEND },
|
||||||
{ O_NONBLOCK, P9_DOTL_NONBLOCK },
|
{ O_NONBLOCK, P9_DOTL_NONBLOCK },
|
||||||
{ O_DSYNC, P9_DOTL_DSYNC },
|
{ O_DSYNC, P9_DOTL_DSYNC },
|
||||||
|
@ -268,8 +267,14 @@ v9fs_vfs_atomic_open_dotl(struct inode *dir, struct dentry *dentry,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Only creates */
|
/* Only creates */
|
||||||
if (!(flags & O_CREAT) || dentry->d_inode)
|
if (!(flags & O_CREAT))
|
||||||
return finish_no_open(file, res);
|
return finish_no_open(file, res);
|
||||||
|
else if (dentry->d_inode) {
|
||||||
|
if ((flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL))
|
||||||
|
return -EEXIST;
|
||||||
|
else
|
||||||
|
return finish_no_open(file, res);
|
||||||
|
}
|
||||||
|
|
||||||
v9ses = v9fs_inode2v9ses(dir);
|
v9ses = v9fs_inode2v9ses(dir);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue