On 09/18/2009 04:50 PM, Serge E. Hallyn wrote: > Quoting Tyler Hicks ([email protected]): >> If the lower inode is read-only, don't attempt to open the lower file >> read/write and don't hand off the open request to the privileged >> eCryptfs kthread for opening it read/write. Instead, only try an >> unprivileged, read-only open of the file and give up if that fails. >> This patch fixes an oops when eCryptfs is mounted on top of a read-only >> mount. >> >> Cc: Serge Hallyn <[email protected]> >> Cc: Eric Sandeen <[email protected]> >> Cc: Dave Kleikamp <[email protected]> >> Cc: [email protected] >> Signed-off-by: Tyler Hicks <[email protected]> > > They all look ok to me, with about 20 mins of looking over.
Thanks for taking the time! > > This one also seems to fix a problem at the caller which was > taking PTR_ERR(lower_file) as its rc, even though the code > you're removing here was setting lower_file to NULL on failure. > > No, wait. If the second step fails, then you still keep > lower_file as an open file instead of closing it and > setting it to ERR_PTR(rc)... I'm not quite following this. What is the second step that you're referring to? The privileged kthread open in ecryptfs_threadfn()? If that fails, then the file won't be open. > It's possible I'm on an older > tree than you are, so can you please re-confirm that > ecryptfs_init_persistent_file()'s usage of rc and its > rc = PTR_ERR(inode_info->lower_file; > jives with what you do in ecryptfs_privileged_open()? You're right, the handling of rc in the caller is pretty kludgy. It can just use the return code of ecryptfs_privileged_open() and not mess inode_info->lower_file upon failure. I'll respond with a patch. > > Still, > > Acked-by: Serge Hallyn <[email protected]> > > for the set. > > thanks, > -serge > >> --- >> fs/ecryptfs/kthread.c | 24 ++++++++---------------- >> 1 files changed, 8 insertions(+), 16 deletions(-) >> >> diff --git a/fs/ecryptfs/kthread.c b/fs/ecryptfs/kthread.c >> index c6d7a4d..e14cf7e 100644 >> --- a/fs/ecryptfs/kthread.c >> +++ b/fs/ecryptfs/kthread.c >> @@ -136,6 +136,7 @@ int ecryptfs_privileged_open(struct file **lower_file, >> const struct cred *cred) >> { >> struct ecryptfs_open_req *req; >> + int flags = O_LARGEFILE; >> int rc = 0; >> >> /* Corresponding dput() and mntput() are done when the >> @@ -143,10 +144,14 @@ int ecryptfs_privileged_open(struct file **lower_file, >> * destroyed. */ >> dget(lower_dentry); >> mntget(lower_mnt); >> - (*lower_file) = dentry_open(lower_dentry, lower_mnt, >> - (O_RDWR | O_LARGEFILE), cred); >> + flags |= IS_RDONLY(lower_dentry->d_inode) ? O_RDONLY : O_RDWR; >> + (*lower_file) = dentry_open(lower_dentry, lower_mnt, flags, cred); >> if (!IS_ERR(*lower_file)) >> goto out; >> + if (flags & O_RDONLY) { >> + rc = PTR_ERR((*lower_file)); >> + goto out; >> + } >> req = kmem_cache_alloc(ecryptfs_open_req_cache, GFP_KERNEL); >> if (!req) { >> rc = -ENOMEM; >> @@ -180,21 +185,8 @@ int ecryptfs_privileged_open(struct file **lower_file, >> __func__); >> goto out_unlock; >> } >> - if (IS_ERR(*req->lower_file)) { >> + if (IS_ERR(*req->lower_file)) >> rc = PTR_ERR(*req->lower_file); >> - dget(lower_dentry); >> - mntget(lower_mnt); >> - (*lower_file) = dentry_open(lower_dentry, lower_mnt, >> - (O_RDONLY | O_LARGEFILE), cred); >> - if (IS_ERR(*lower_file)) { >> - rc = PTR_ERR(*req->lower_file); >> - (*lower_file) = NULL; >> - printk(KERN_WARNING "%s: Error attempting privileged " >> - "open of lower file with either RW or RO " >> - "perms; rc = [%d]. Giving up.\n", >> - __func__, rc); >> - } >> - } >> out_unlock: >> mutex_unlock(&req->mux); >> out_free: >> -- >> 1.6.2.5 _______________________________________________ Mailing list: https://launchpad.net/~ecryptfs-devel Post to : [email protected] Unsubscribe : https://launchpad.net/~ecryptfs-devel More help : https://help.launchpad.net/ListHelp

