From: Nick Piggin on
On Wed, Jul 07, 2010 at 11:23:31PM +0530, Aneesh Kumar K. V wrote:
> On Thu, 8 Jul 2010 02:57:19 +1000, Nick Piggin <npiggin(a)suse.de> wrote:
> > I haven't followed this thread closely, so can you just go back
> > and explain to me why you need this? Ie. that you can't achieve with
> > a path-to-handle follow/nofollow option.
>
>
> We need to be able to read the link target using file handle. The exact
> usecase i have is with respect to implementing READLINK operation on a
> userspace NFS server. The request contain the file handle and the
> response include target name.

Fair point, could you include this stuff in your changelog? It may
help with other people reviewing it too who have not followed closely.


> Similarly we need to able to get file attribute based on file handle.
> I was using readlinkat and fstat to obtain both the above information
> using the descriptor returned by open_by_handle on a file handle
> representing symlink
>
> -aneesh
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Aneesh Kumar K. V on
On Thu, 8 Jul 2010 02:48:59 +1000, Nick Piggin <npiggin(a)suse.de> wrote:
> On Tue, Jun 15, 2010 at 10:42:54PM +0530, Aneesh Kumar K.V wrote:
> > The patch update may_open to allow handle based open on symlinks.
> > The file handle based API use file descritor returned from open_by_handle_at
> > to do different file system operations. To find the link target name we
> > need to get a file descriptor on symlinks.
> >
> > Signed-off-by: Aneesh Kumar K.V <aneesh.kumar(a)linux.vnet.ibm.com>
> > ---
> > fs/namei.c | 17 ++++++++++++++---
> > 1 files changed, 14 insertions(+), 3 deletions(-)
> >
> > diff --git a/fs/namei.c b/fs/namei.c
> > index c2d19c7..417bf53 100644
> > --- a/fs/namei.c
> > +++ b/fs/namei.c
> > @@ -1422,7 +1422,7 @@ int vfs_create(struct inode *dir, struct dentry *dentry, int mode,
> > return error;
> > }
> >
> > -int may_open(struct path *path, int acc_mode, int flag)
> > +static int __may_open(struct path *path, int acc_mode, int flag, int handle)
> > {
> > struct dentry *dentry = path->dentry;
> > struct inode *inode = dentry->d_inode;
> > @@ -1433,7 +1433,13 @@ int may_open(struct path *path, int acc_mode, int flag)
> >
> > switch (inode->i_mode & S_IFMT) {
> > case S_IFLNK:
> > - return -ELOOP;
> > + /*
> > + * For file handle based open we should allow
> > + * open of symlink.
> > + */
> > + if (!handle)
> > + return -ELOOP;
> > + break;
> > case S_IFDIR:
> > if (acc_mode & MAY_WRITE)
> > return -EISDIR;
> > @@ -1473,6 +1479,11 @@ int may_open(struct path *path, int acc_mode, int flag)
> > return break_lease(inode, flag);
> > }
> >
> > +int may_open(struct path *path, int acc_mode, int flag)
> > +{
> > + return __may_open(path, acc_mode, flag, 0);
> > +}
>
> Why don't you just add MAY_OPEN_LNK instead of this ugliness?
>

Something like the below ?

commit 69787f5ed6c8a7a63ad21ef5d7de0b62f124ff0a
Author: Aneesh Kumar K.V <aneesh.kumar(a)linux.vnet.ibm.com>
Date: Tue Jul 6 23:25:57 2010 +0530

vfs: Allow handle based open on symlinks

The patch update may_open to allow handle based open on symlinks.
The file handle based API use file descritor returned from open_by_handle_at
to do different file system operations. To find the link target name we
need to get a file descriptor on symlinks.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar(a)linux.vnet.ibm.com>

diff --git a/fs/namei.c b/fs/namei.c
index de40312..2ea5c79 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -1456,7 +1456,15 @@ int may_open(struct path *path, int acc_mode, int flag)

switch (inode->i_mode & S_IFMT) {
case S_IFLNK:
- return -ELOOP;
+ /*
+ * Allow only if acc_mode contain
+ * open link request and read request.
+ */
+ if (acc_mode != (MAY_OPEN_LINK | MAY_READ))
+ return -ELOOP;
+ if (flag != O_RDONLY)
+ return -ELOOP;
+ break;
case S_IFDIR:
if (acc_mode & MAY_WRITE)
return -EISDIR;
diff --git a/fs/open.c b/fs/open.c
index daf2534..a58837a 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -1266,8 +1266,15 @@ static long do_sys_open_by_handle(int mountdirfd,
*/
if (open_flag & __O_SYNC)
open_flag |= O_DSYNC;
+ /*
+ * Handle based API allow open on a symlink
+ */
+ if (S_ISLNK(path->dentry->d_inode->i_mode))
+ acc_mode = MAY_OPEN_LINK;
+ else
+ acc_mode = MAY_OPEN;

- acc_mode = MAY_OPEN | ACC_MODE(open_flag);
+ acc_mode |= ACC_MODE(open_flag);

/* O_TRUNC implies we need access checks for write permissions */
if (open_flag & O_TRUNC)
diff --git a/include/linux/fs.h b/include/linux/fs.h
index cbff4ca..eaf13d1 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -53,6 +53,7 @@ struct inodes_stat_t {
#define MAY_APPEND 8
#define MAY_ACCESS 16
#define MAY_OPEN 32
+#define MAY_OPEN_LINK 64

/*
* flags in file.f_mode. Note that FMODE_READ and FMODE_WRITE must correspond
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Miklos Szeredi on
On Mon, 12 Jul 2010, Aneesh Kumar K.V wrote:
> The patch update may_open to allow handle based open on symlinks.
> The file handle based API use file descritor returned from open_by_handle_at
> to do different file system operations. To find the link target name we
> need to get a file descriptor on symlinks.
>
> We should be able to read the link target using file handle. The exact
> usecase is with respect to implementing READLINK operation on a
> userspace NFS server. The request contain the file handle and the
> response include target name.
>
> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar(a)linux.vnet.ibm.com>
> ---
> fs/namei.c | 10 +++++++++-
> fs/open.c | 9 ++++++++-
> include/linux/fs.h | 1 +
> 3 files changed, 18 insertions(+), 2 deletions(-)
>
> diff --git a/fs/namei.c b/fs/namei.c
> index 4d590a3..a6a8093 100644
> --- a/fs/namei.c
> +++ b/fs/namei.c
> @@ -1456,7 +1456,15 @@ int may_open(struct path *path, int acc_mode, int flag)
>
> switch (inode->i_mode & S_IFMT) {
> case S_IFLNK:
> - return -ELOOP;
> + /*
> + * Allow only if acc_mode contain
> + * open link request and read request.
> + */
> + if (acc_mode != (MAY_OPEN_LINK | MAY_READ))

Why require MAY_READ?

Actually, open_by_handle() should be a good place to start supporting
O_NOACCESS from the start. I.e. neigher read, nor write access is
permitted on the file.


> + return -ELOOP;
> + if (flag != O_RDONLY)
> + return -ELOOP;
> + break;
> case S_IFDIR:
> if (acc_mode & MAY_WRITE)
> return -EISDIR;
> diff --git a/fs/open.c b/fs/open.c
> index df5d21e..afb089e 100644
> --- a/fs/open.c
> +++ b/fs/open.c
> @@ -1268,8 +1268,15 @@ static long do_sys_open_by_handle(int mountdirfd,
> */
> if (open_flag & __O_SYNC)
> open_flag |= O_DSYNC;
> + /*
> + * Handle based API allow open on a symlink
> + */
> + if (S_ISLNK(path->dentry->d_inode->i_mode))
> + acc_mode = MAY_OPEN_LINK;
> + else
> + acc_mode = MAY_OPEN;
>
> - acc_mode = MAY_OPEN | ACC_MODE(open_flag);
> + acc_mode |= ACC_MODE(open_flag);
>
> /* O_TRUNC implies we need access checks for write permissions */
> if (open_flag & O_TRUNC)
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index a458b4e..08afa72 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -53,6 +53,7 @@ struct inodes_stat_t {
> #define MAY_APPEND 8
> #define MAY_ACCESS 16
> #define MAY_OPEN 32
> +#define MAY_OPEN_LINK 64
>
> /*
> * flags in file.f_mode. Note that FMODE_READ and FMODE_WRITE must correspond
> --
> 1.7.2.rc1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
> the body of a message to majordomo(a)vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Aneesh Kumar K. V on
On Mon, 12 Jul 2010 10:23:21 +0200, Miklos Szeredi <miklos(a)szeredi.hu> wrote:
> On Mon, 12 Jul 2010, Aneesh Kumar K.V wrote:
> > The patch update may_open to allow handle based open on symlinks.
> > The file handle based API use file descritor returned from open_by_handle_at
> > to do different file system operations. To find the link target name we
> > need to get a file descriptor on symlinks.
> >
> > We should be able to read the link target using file handle. The exact
> > usecase is with respect to implementing READLINK operation on a
> > userspace NFS server. The request contain the file handle and the
> > response include target name.
> >
> > Signed-off-by: Aneesh Kumar K.V <aneesh.kumar(a)linux.vnet.ibm.com>
> > ---
> > fs/namei.c | 10 +++++++++-
> > fs/open.c | 9 ++++++++-
> > include/linux/fs.h | 1 +
> > 3 files changed, 18 insertions(+), 2 deletions(-)
> >
> > diff --git a/fs/namei.c b/fs/namei.c
> > index 4d590a3..a6a8093 100644
> > --- a/fs/namei.c
> > +++ b/fs/namei.c
> > @@ -1456,7 +1456,15 @@ int may_open(struct path *path, int acc_mode, int flag)
> >
> > switch (inode->i_mode & S_IFMT) {
> > case S_IFLNK:
> > - return -ELOOP;
> > + /*
> > + * Allow only if acc_mode contain
> > + * open link request and read request.
> > + */
> > + if (acc_mode != (MAY_OPEN_LINK | MAY_READ))
>
> Why require MAY_READ?

a value of 0x0 for flag in open(2) implies a read ?

>
> Actually, open_by_handle() should be a good place to start supporting
> O_NOACCESS from the start. I.e. neigher read, nor write access is
> permitted on the file.

Yes that would be ideal. But that will include much larger change. I was
hoping we could get something in this merge window with the change
suggested above ?

>
>
> > + return -ELOOP;
> > + if (flag != O_RDONLY)
> > + return -ELOOP;
> > + break;
> > case S_IFDIR:
> > if (acc_mode & MAY_WRITE)
> > return -EISDIR;

-aneesh
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Miklos Szeredi on
On Mon, 12 Jul 2010, Aneesh Kumar K. V wrote:
> On Mon, 12 Jul 2010 10:23:21 +0200, Miklos Szeredi <miklos(a)szeredi.hu> wrote:
> > On Mon, 12 Jul 2010, Aneesh Kumar K.V wrote:
> > > The patch update may_open to allow handle based open on symlinks.
> > > The file handle based API use file descritor returned from open_by_handle_at
> > > to do different file system operations. To find the link target name we
> > > need to get a file descriptor on symlinks.
> > >
> > > We should be able to read the link target using file handle. The exact
> > > usecase is with respect to implementing READLINK operation on a
> > > userspace NFS server. The request contain the file handle and the
> > > response include target name.
> > >
> > > Signed-off-by: Aneesh Kumar K.V <aneesh.kumar(a)linux.vnet.ibm.com>
> > > ---
> > > fs/namei.c | 10 +++++++++-
> > > fs/open.c | 9 ++++++++-
> > > include/linux/fs.h | 1 +
> > > 3 files changed, 18 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/fs/namei.c b/fs/namei.c
> > > index 4d590a3..a6a8093 100644
> > > --- a/fs/namei.c
> > > +++ b/fs/namei.c
> > > @@ -1456,7 +1456,15 @@ int may_open(struct path *path, int acc_mode, int flag)
> > >
> > > switch (inode->i_mode & S_IFMT) {
> > > case S_IFLNK:
> > > - return -ELOOP;
> > > + /*
> > > + * Allow only if acc_mode contain
> > > + * open link request and read request.
> > > + */
> > > + if (acc_mode != (MAY_OPEN_LINK | MAY_READ))
> >
> > Why require MAY_READ?
>
> a value of 0x0 for flag in open(2) implies a read ?

Yes.

However a value of 0x3 is not defined in POSIX, and in linux it's a
sort of weird O_NOACCESS: it requires both read and write permission
on the file but allows neither read or write.

Requiring permission is because on device files the open can have side
effects. Not sure if open_by_handle() really wants to allow device
opens, that's another thing to think about.

Thanks,
Miklos
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/