From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
To: hch@infradead.org, viro@zeniv.linux.org.uk, adilger@sun.com,
corbet@lwn.net, serue@us.ibm.com, neilb@suse.de
Cc: linux-fsdevel@vger.kernel.org, sfrench@us.ibm.com,
philippe.deniel@CEA.FR, linux-kernel@vger.kernel.org,
"Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Subject: [PATCH -V8 2/9] vfs: Add name to file handle conversion support
Date: Mon, 17 May 2010 11:03:45 +0530 [thread overview]
Message-ID: <1274074432-29695-3-git-send-email-aneesh.kumar@linux.vnet.ibm.com> (raw)
In-Reply-To: <1274074432-29695-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com>
This patch add a new superblock operations get_fsid that returns the
UUID mapping for the file system. The UUID returned is used to
identify the file system apart of file_handle
Acked-by: Serge Hallyn <serue@us.ibm.com>
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
fs/open.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++
include/linux/fs.h | 15 +++++++++
2 files changed, 101 insertions(+), 0 deletions(-)
diff --git a/fs/open.c b/fs/open.c
index 74e5cd9..f63550b 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -30,6 +30,7 @@
#include <linux/falloc.h>
#include <linux/fs_struct.h>
#include <linux/ima.h>
+#include <linux/exportfs.h>
#include "internal.h"
@@ -1206,3 +1207,88 @@ int nonseekable_open(struct inode *inode, struct file *filp)
}
EXPORT_SYMBOL(nonseekable_open);
+
+/* limit the handle size to some value */
+#define MAX_HANDLE_SZ 4096
+static long do_sys_name_to_handle(struct path *path,
+ struct file_handle __user *ufh)
+{
+ int retval;
+ int handle_size;
+ struct super_block *sb;
+ struct uuid this_fs_id;
+ struct file_handle f_handle;
+ struct file_handle *handle = NULL;
+
+ if (copy_from_user(&f_handle, ufh, sizeof(struct file_handle))) {
+ retval = -EFAULT;
+ goto err_out;
+ }
+ if (f_handle.handle_size > MAX_HANDLE_SZ) {
+ retval = -EINVAL;
+ goto err_out;
+ }
+ handle = kzalloc(sizeof(struct file_handle) + f_handle.handle_size,
+ GFP_KERNEL);
+ if (!handle) {
+ retval = -ENOMEM;
+ goto err_out;
+ }
+ handle_size = f_handle.handle_size;
+
+ /* we ask for a non connected handle */
+ retval = exportfs_encode_fh(path->dentry,
+ (struct fid *)handle->f_handle,
+ &handle_size, 0);
+ /* convert handle size to bytes */
+ handle_size *= sizeof(u32);
+ handle->handle_type = retval;
+ handle->handle_size = handle_size;
+ if (handle_size <= f_handle.handle_size) {
+ /* get the uuid */
+ sb = path->mnt->mnt_sb;
+ if (sb->s_op->get_fsid) {
+ retval = sb->s_op->get_fsid(sb, &this_fs_id);
+ if (!retval)
+ memcpy(handle->fsid.uuid,
+ this_fs_id.uuid,
+ sizeof(handle->fsid.uuid));
+ }
+ } else {
+ /*
+ * set the handle_size to zero so we copy only
+ * non variable part of the file_handle
+ */
+ handle_size = 0;
+ retval = -EOVERFLOW;
+ }
+ if (copy_to_user(ufh, handle,
+ sizeof(struct file_handle) + handle_size))
+ retval = -EFAULT;
+
+ kfree(handle);
+err_out:
+ return retval;
+}
+
+SYSCALL_DEFINE4(name_to_handle_at, int, dfd, const char __user *, name,
+ struct file_handle __user *, handle, int, flag)
+{
+ int follow;
+ long ret = -EINVAL;
+ struct path path;
+
+ if ((flag & ~AT_SYMLINK_FOLLOW) != 0)
+ goto err_out;
+
+ follow = (flag & AT_SYMLINK_FOLLOW) ? LOOKUP_FOLLOW : 0;
+ ret = user_path_at(dfd, name, follow, &path);
+ if (ret)
+ goto err_out;
+ ret = do_sys_name_to_handle(&path, handle);
+ path_put(&path);
+err_out:
+ /* avoid REGPARM breakage on x86: */
+ asmlinkage_protect(4, ret, dfd, name, handle, flag);
+ return ret;
+}
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 44f35ae..055734c 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -948,6 +948,20 @@ struct file {
unsigned long f_mnt_write_state;
#endif
};
+
+struct uuid {
+ unsigned char uuid[16];
+};
+
+struct file_handle {
+ int handle_size;
+ int handle_type;
+ /* File system identifier */
+ struct uuid fsid;
+ /* file identifier */
+ unsigned char f_handle[0];
+};
+
extern spinlock_t files_lock;
#define file_list_lock() spin_lock(&files_lock);
#define file_list_unlock() spin_unlock(&files_lock);
@@ -1580,6 +1594,7 @@ struct super_operations {
ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t);
#endif
int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t);
+ int (*get_fsid)(struct super_block *, struct uuid *);
};
/*
--
1.7.1.78.g212f0
next prev parent reply other threads:[~2010-05-17 5:36 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-17 5:33 [PATCH -V8 0/9] Generic name to handle and open by handle syscalls Aneesh Kumar K.V
2010-05-17 5:33 ` [PATCH -V8 1/9] exportfs: Return the minimum required handle size Aneesh Kumar K.V
2010-05-17 5:33 ` Aneesh Kumar K.V [this message]
2010-05-18 2:33 ` [PATCH -V8 2/9] vfs: Add name to file handle conversion support J. R. Okajima
2010-05-18 5:40 ` Aneesh Kumar K. V
2010-05-18 6:18 ` J. R. Okajima
2010-05-18 6:58 ` Aneesh Kumar K. V
2010-05-18 6:43 ` Dave Chinner
2010-05-18 10:17 ` Aneesh Kumar K. V
2010-05-19 7:15 ` J. R. Okajima
2010-05-19 8:52 ` Aneesh Kumar K. V
2010-05-19 9:26 ` Aneesh Kumar K. V
2010-05-19 13:50 ` J. R. Okajima
2010-05-17 5:33 ` [PATCH -V8 3/9] vfs: Add open by file handle support Aneesh Kumar K.V
2010-05-17 5:33 ` [PATCH -V8 4/9] vfs: Allow handle based open on symlinks Aneesh Kumar K.V
2010-05-17 5:33 ` [PATCH -V8 5/9] vfs: Support null pathname in readlink Aneesh Kumar K.V
2010-05-17 5:33 ` [PATCH -V8 6/9] ext4: Add get_fsid callback Aneesh Kumar K.V
2010-05-17 5:33 ` [PATCH -V8 7/9] x86: Add new syscalls for x86_32 Aneesh Kumar K.V
2010-05-17 5:33 ` [PATCH -V8 8/9] x86: Add new syscalls for x86_64 Aneesh Kumar K.V
2010-05-17 5:33 ` [PATCH -V8 9/9] ext3: Add get_fsid callback Aneesh Kumar K.V
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1274074432-29695-3-git-send-email-aneesh.kumar@linux.vnet.ibm.com \
--to=aneesh.kumar@linux.vnet.ibm.com \
--cc=adilger@sun.com \
--cc=corbet@lwn.net \
--cc=hch@infradead.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=neilb@suse.de \
--cc=philippe.deniel@CEA.FR \
--cc=serue@us.ibm.com \
--cc=sfrench@us.ibm.com \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.