All of lore.kernel.org
 help / color / mirror / Atom feed
* [Ocfs2-devel] [PATCH 1/2] Ocfs2: Add macro OCFS2_VOL_UUIDSTR_LEN in ocfs2_fs.h
@ 2010-04-20  6:59 Tristan Ye
  2010-04-20  6:59 ` [Ocfs2-devel] [PATCH 2/2] Ocfs2: Add new OCFS2_IOC_INFO ioctl for ocfs2 v7 Tristan Ye
                   ` (3 more replies)
  0 siblings, 4 replies; 13+ messages in thread
From: Tristan Ye @ 2010-04-20  6:59 UTC (permalink / raw)
  To: ocfs2-devel

Since we've been using uuid_str in most of ocfs2 codes, adding
such a macro would be helpful.

Signed-off-by: Tristan Ye <tristan.ye@oracle.com>
---
 fs/ocfs2/ocfs2_fs.h |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/fs/ocfs2/ocfs2_fs.h b/fs/ocfs2/ocfs2_fs.h
index bb37218..b313c83 100644
--- a/fs/ocfs2/ocfs2_fs.h
+++ b/fs/ocfs2/ocfs2_fs.h
@@ -274,6 +274,7 @@
 
 #define OCFS2_VOL_UUID_LEN		16
 #define OCFS2_MAX_VOL_LABEL_LEN		64
+#define OCFS2_VOL_UUIDSTR_LEN		(OCFS2_VOL_UUID_LEN * 2 + 1)
 
 /* The alternate, userspace stack fields */
 #define OCFS2_STACK_LABEL_LEN		4
-- 
1.5.5

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [Ocfs2-devel] [PATCH 2/2] Ocfs2: Add new OCFS2_IOC_INFO ioctl for ocfs2 v7.
  2010-04-20  6:59 [Ocfs2-devel] [PATCH 1/2] Ocfs2: Add macro OCFS2_VOL_UUIDSTR_LEN in ocfs2_fs.h Tristan Ye
@ 2010-04-20  6:59 ` Tristan Ye
  2010-04-20 20:31   ` Sunil Mushran
  2010-04-20 20:26 ` [Ocfs2-devel] [PATCH 1/2] Ocfs2: Add macro OCFS2_VOL_UUIDSTR_LEN in ocfs2_fs.h Sunil Mushran
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 13+ messages in thread
From: Tristan Ye @ 2010-04-20  6:59 UTC (permalink / raw)
  To: ocfs2-devel

The reason why we need this ioctl is to offer the none-privileged
end-user a possibility to get filesys info gathering.

We use OCFS2_IOC_INFO to manipulate the new ioctl, userspace passes a
structure to kernel containing an array of request pointers and request
count, such as,

* From userspace:

struct ocfs2_info_blocksize oib = {
        .ib_req = {
                .ir_magic = OCFS2_INFO_MAGIC,
                .ir_code = OCFS2_INFO_BLOCKSIZE,
                ...
        }
        ...
}

struct ocfs2_info_clustersize oic = {
        ...
}

uint64_t reqs[2] = {(unsigned long)&oib,
                    (unsigned long)&oic};

struct ocfs2_info info = {
        .oi_requests = reqs,
        .oi_count = 2,
}

ret = ioctl(fd, OCFS2_IOC_INFO, &info);

* In kernel:

Get the request pointers from *info*, then handle each request one bye one.

Idea here is to make the spearated request small enough to guarantee
a better backward&forward compatibility since a small piece of request
would be less likely to be broken if filesys on raw disk get changed.

Currently, following 8 ioctls get implemented per the requirement from
userspace tool o2info, and I believe it will grow over time:-)

        OCFS2_INFO_CLUSTERSIZE
        OCFS2_INFO_BLOCKSIZE
        OCFS2_INFO_MAXSLOTS
        OCFS2_INFO_LABEL
        OCFS2_INFO_UUID
        OCFS2_INFO_FS_FEATURES

This ioctl is only specific to OCFS2.

Signed-off-by: Tristan Ye <tristan.ye@oracle.com>
---
 fs/ocfs2/ioctl.c       |  275 ++++++++++++++++++++++++++++++++++++++++++++++++
 fs/ocfs2/ocfs2_ioctl.h |   80 ++++++++++++++
 2 files changed, 355 insertions(+), 0 deletions(-)

diff --git a/fs/ocfs2/ioctl.c b/fs/ocfs2/ioctl.c
index 7d9d9c1..5e10340 100644
--- a/fs/ocfs2/ioctl.c
+++ b/fs/ocfs2/ioctl.c
@@ -23,8 +23,18 @@
 #include "ioctl.h"
 #include "resize.h"
 #include "refcounttree.h"
+#include "sysfile.h"
+#include "buffer_head_io.h"
+#include "suballoc.h"
+
 
 #include <linux/ext2_fs.h>
+#include <linux/compat.h>
+
+#define o2info_from_user(a, b)	\
+		copy_from_user(&(a), (b), sizeof(a))
+#define o2info_to_user(a, b)	\
+		copy_to_user((typeof(a) __user *)b, &(a), sizeof(a))
 
 static int ocfs2_get_inode_attr(struct inode *inode, unsigned *flags)
 {
@@ -109,6 +119,257 @@ bail:
 	return status;
 }
 
+int ocfs2_info_handle_blocksize(struct inode *inode,
+				struct ocfs2_info_request __user *req)
+{
+	int status = -EFAULT;
+	struct ocfs2_info_blocksize oib;
+
+	if (o2info_from_user(oib, req))
+		goto bail;
+
+	oib.ib_blocksize = inode->i_sb->s_blocksize;
+	oib.ib_req.ir_flags |= OCFS2_INFO_FL_FILLED;
+
+	if (o2info_to_user(oib, req))
+		goto bail;
+
+	status = 0;
+bail:
+	return status;
+}
+
+int ocfs2_info_handle_clustersize(struct inode *inode,
+				  struct ocfs2_info_request __user *req)
+{
+	int status = -EFAULT;
+	struct ocfs2_info_clustersize oic;
+	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
+
+	if (o2info_from_user(oic, req))
+		goto bail;
+
+	oic.ic_clustersize = osb->s_clustersize;
+	oic.ic_req.ir_flags |= OCFS2_INFO_FL_FILLED;
+
+	if (o2info_to_user(oic, req))
+		goto bail;
+
+	status = 0;
+bail:
+	return status;
+}
+
+int ocfs2_info_handle_maxslots(struct inode *inode,
+			       struct ocfs2_info_request __user *req)
+{
+	int status = -EFAULT;
+	struct ocfs2_info_maxslots oim;
+	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
+
+	if (o2info_from_user(oim, req))
+		goto bail;
+
+	oim.im_max_slots = osb->max_slots;
+	oim.im_req.ir_flags |= OCFS2_INFO_FL_FILLED;
+
+	if (o2info_to_user(oim, req))
+		goto bail;
+
+	status = 0;
+bail:
+	return status;
+}
+
+int ocfs2_info_handle_label(struct inode *inode,
+			    struct ocfs2_info_request __user *req)
+{
+	int status = -EFAULT;
+	struct ocfs2_info_label oil;
+	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
+
+	if (o2info_from_user(oil, req))
+		goto bail;
+
+	memcpy(oil.il_label, osb->vol_label, OCFS2_MAX_VOL_LABEL_LEN);
+	oil.il_req.ir_flags |= OCFS2_INFO_FL_FILLED;
+
+	if (o2info_to_user(oil, req))
+		goto bail;
+
+	status = 0;
+bail:
+	return status;
+}
+
+int ocfs2_info_handle_uuid(struct inode *inode,
+			   struct ocfs2_info_request __user *req)
+{
+	int status = -EFAULT;
+	struct ocfs2_info_uuid oiu;
+	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
+
+	if (o2info_from_user(oiu, req))
+		goto bail;
+
+	memcpy(oiu.iu_uuid_str, osb->uuid_str, OCFS2_VOL_UUIDSTR_LEN);
+	oiu.iu_req.ir_flags |= OCFS2_INFO_FL_FILLED;
+
+	if (o2info_to_user(oiu, req))
+		goto bail;
+
+	status = 0;
+bail:
+	return status;
+}
+
+int ocfs2_info_handle_fs_features(struct inode *inode,
+				  struct ocfs2_info_request __user *req)
+{
+	int status = -EFAULT;
+	struct ocfs2_info_fs_features oif;
+	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
+
+	if (o2info_from_user(oif, req))
+		goto bail;
+
+	oif.if_compat_features = osb->s_feature_compat;
+	oif.if_incompat_features = osb->s_feature_incompat;
+	oif.if_ro_compat_features = osb->s_feature_ro_compat;
+	oif.if_req.ir_flags |= OCFS2_INFO_FL_FILLED;
+
+	if (o2info_to_user(oif, req))
+		goto bail;
+
+	status = 0;
+bail:
+	return status;
+}
+
+int ocfs2_info_handle_unknown(struct inode *inode,
+			      struct ocfs2_info_request __user *req)
+{
+	int status = -EFAULT;
+	struct ocfs2_info_request oir;
+
+	if (o2info_from_user(oir, req))
+		goto bail;
+
+	oir.ir_flags &= ~OCFS2_INFO_FL_FILLED;
+
+	if (o2info_to_user(oir, req))
+		goto bail;
+
+	status = 0;
+bail:
+	return status;
+}
+
+/*
+ * Validate and distinguish OCFS2_IOC_INFO requests.
+ *
+ * - validate the magic number.
+ * - distinguish different requests.
+ * - validate size of different requests.
+ */
+int ocfs2_info_handle_request(struct inode *inode,
+			      struct ocfs2_info_request __user *req)
+{
+	int status = -EFAULT;
+	struct ocfs2_info_request oir;
+
+	if (o2info_from_user(oir, req))
+		goto bail;
+
+	status = -EINVAL;
+	if (oir.ir_magic != OCFS2_INFO_MAGIC)
+		goto bail;
+
+	switch (oir.ir_code) {
+	case OCFS2_INFO_BLOCKSIZE:
+		if (oir.ir_size == sizeof(struct ocfs2_info_blocksize))
+			status = ocfs2_info_handle_blocksize(inode, req);
+		break;
+	case OCFS2_INFO_CLUSTERSIZE:
+		if (oir.ir_size == sizeof(struct ocfs2_info_clustersize))
+			status = ocfs2_info_handle_clustersize(inode, req);
+		break;
+	case OCFS2_INFO_MAXSLOTS:
+		if (oir.ir_size == sizeof(struct ocfs2_info_maxslots))
+			status = ocfs2_info_handle_maxslots(inode, req);
+		break;
+	case OCFS2_INFO_LABEL:
+		if (oir.ir_size == sizeof(struct ocfs2_info_label))
+			status = ocfs2_info_handle_label(inode, req);
+		break;
+	case OCFS2_INFO_UUID:
+		if (oir.ir_size == sizeof(struct ocfs2_info_uuid))
+			status = ocfs2_info_handle_uuid(inode, req);
+		break;
+	case OCFS2_INFO_FS_FEATURES:
+		if (oir.ir_size == sizeof(struct ocfs2_info_fs_features))
+			status = ocfs2_info_handle_fs_features(inode, req);
+		break;
+	default:
+		status = ocfs2_info_handle_unknown(inode, req);
+		break;
+	}
+
+bail:
+	return status;
+}
+
+/*
+ * OCFS2_IOC_INFO handles an array of requests passed from userspace.
+ *
+ * ocfs2_info_handle() recevies a large info aggregation, grab and
+ * validate the request count from header, then break it into small
+ * pieces, later specific handlers can handle them one by one.
+ *
+ * Idea here is to make each separate request small enough to ensure
+ * a better backward&forward compatibility, since a small piece of
+ * request will be less likely to be broken if disk layout get changed.
+ */
+int ocfs2_info_handle(struct inode *inode, struct ocfs2_info *info,
+		      int compat_flag)
+{
+	int i, status = 0;
+	u64 req_addr;
+	struct ocfs2_info_request __user *reqp;
+
+	if ((info->oi_count > OCFS2_INFO_MAX_REQUEST) ||
+	    (!info->oi_requests)) {
+		status = -EINVAL;
+		goto bail;
+	}
+
+	for (i = 0; i < info->oi_count; i++) {
+		status = -EFAULT;
+		if (compat_flag) {
+			if (get_user(req_addr,
+			     (u64 __user *)compat_ptr(info->oi_requests) + i))
+				goto bail;
+		} else {
+			if (get_user(req_addr,
+				     (u64 __user *)(info->oi_requests) + i))
+				goto bail;
+		}
+
+		reqp = (struct ocfs2_info_request *)req_addr;
+		if (!reqp) {
+			status = -EINVAL;
+			goto bail;
+		}
+
+		status = ocfs2_info_handle_request(inode, reqp);
+		if (status)
+			goto bail;
+	}
+
+bail:
+	return status;
+}
+
 long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 {
 	struct inode *inode = filp->f_path.dentry->d_inode;
@@ -120,6 +381,7 @@ long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 	struct reflink_arguments args;
 	const char *old_path, *new_path;
 	bool preserve;
+	struct ocfs2_info info;
 
 	switch (cmd) {
 	case OCFS2_IOC_GETFLAGS:
@@ -174,6 +436,12 @@ long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 		preserve = (args.preserve != 0);
 
 		return ocfs2_reflink_ioctl(inode, old_path, new_path, preserve);
+	case OCFS2_IOC_INFO:
+		if (copy_from_user(&info, (struct ocfs2_info __user *)arg,
+				   sizeof(struct ocfs2_info)))
+			return -EFAULT;
+
+		return ocfs2_info_handle(inode, &info, 0);
 	default:
 		return -ENOTTY;
 	}
@@ -185,6 +453,7 @@ long ocfs2_compat_ioctl(struct file *file, unsigned cmd, unsigned long arg)
 	bool preserve;
 	struct reflink_arguments args;
 	struct inode *inode = file->f_path.dentry->d_inode;
+	struct ocfs2_info info;
 
 	switch (cmd) {
 	case OCFS2_IOC32_GETFLAGS:
@@ -209,6 +478,12 @@ long ocfs2_compat_ioctl(struct file *file, unsigned cmd, unsigned long arg)
 
 		return ocfs2_reflink_ioctl(inode, compat_ptr(args.old_path),
 					   compat_ptr(args.new_path), preserve);
+	case OCFS2_IOC_INFO:
+		if (copy_from_user(&info, (struct ocfs2_info __user *)arg,
+				   sizeof(struct ocfs2_info)))
+			return -EFAULT;
+
+		return ocfs2_info_handle(inode, &info, 1);
 	default:
 		return -ENOIOCTLCMD;
 	}
diff --git a/fs/ocfs2/ocfs2_ioctl.h b/fs/ocfs2/ocfs2_ioctl.h
index 2d3420a..12a5502 100644
--- a/fs/ocfs2/ocfs2_ioctl.h
+++ b/fs/ocfs2/ocfs2_ioctl.h
@@ -76,4 +76,84 @@ struct reflink_arguments {
 };
 #define OCFS2_IOC_REFLINK	_IOW('o', 4, struct reflink_arguments)
 
+/* Following definitions dedicated for ocfs2_info_request ioctls. */
+#define OCFS2_INFO_MAX_REQUEST		(50)
+
+/* Magic number of all requests */
+#define OCFS2_INFO_MAGIC		(0x4F32494E)
+
+/*
+ * Always try to separate info request into small pieces to
+ * guarantee the backward&forward compatibility.
+ */
+struct ocfs2_info {
+	__u64 oi_requests;	/* Array of __u64 pointers to requests */
+	__u32 oi_count;	/* Number of requests in info_requests */
+};
+
+struct ocfs2_info_request {
+/*00*/	__u32 ir_magic;	/* Magic number */
+	__u32 ir_code;	/* Info request code */
+	__u32 ir_size;	/* Size of request */
+	__u32 ir_flags;	/* Request flags */
+/*10*/	/* Request specific fields */
+};
+
+struct ocfs2_info_clustersize {
+	struct ocfs2_info_request ic_req;
+	__u32 ic_clustersize;
+};
+
+struct ocfs2_info_blocksize {
+	struct ocfs2_info_request ib_req;
+	__u32 ib_blocksize;
+};
+
+struct ocfs2_info_maxslots {
+	struct ocfs2_info_request im_req;
+	__u16 im_max_slots;
+};
+
+struct ocfs2_info_label {
+	struct ocfs2_info_request il_req;
+	__u8	il_label[OCFS2_MAX_VOL_LABEL_LEN];
+};
+
+struct ocfs2_info_uuid {
+	struct ocfs2_info_request iu_req;
+	__u8	iu_uuid_str[OCFS2_VOL_UUIDSTR_LEN];
+};
+
+struct ocfs2_info_fs_features {
+	struct ocfs2_info_request if_req;
+	__u32 if_compat_features;
+	__u32 if_incompat_features;
+	__u32 if_ro_compat_features;
+};
+
+/* Codes for ocfs2_info_request */
+enum ocfs2_info_type {
+	OCFS2_INFO_CLUSTERSIZE = 1,
+	OCFS2_INFO_BLOCKSIZE,
+	OCFS2_INFO_MAXSLOTS,
+	OCFS2_INFO_LABEL,
+	OCFS2_INFO_UUID,
+	OCFS2_INFO_FS_FEATURES,
+	OCFS2_INFO_NUM_TYPES
+};
+
+/* Flags for struct ocfs2_info_request */
+/* Filled by the caller */
+#define OCFS2_INFO_FL_NON_COHERENT	(0x00000001)	/* Cluster coherency not
+							   required. This is a hint.
+							   It is up to ocfs2 whether
+							   the request can be fulfilled
+							   without locking. */
+/* Filled by ocfs2 */
+#define OCFS2_INFO_FL_FILLED		(0x80000000)	/* Filesystem understood
+							   this request and
+							   filled in the answer */
+
+#define OCFS2_IOC_INFO		_IOR('o', 5, struct ocfs2_info)
+
 #endif /* OCFS2_IOCTL_H */
-- 
1.5.5

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [Ocfs2-devel] [PATCH 1/2] Ocfs2: Add macro OCFS2_VOL_UUIDSTR_LEN in ocfs2_fs.h
  2010-04-20  6:59 [Ocfs2-devel] [PATCH 1/2] Ocfs2: Add macro OCFS2_VOL_UUIDSTR_LEN in ocfs2_fs.h Tristan Ye
  2010-04-20  6:59 ` [Ocfs2-devel] [PATCH 2/2] Ocfs2: Add new OCFS2_IOC_INFO ioctl for ocfs2 v7 Tristan Ye
@ 2010-04-20 20:26 ` Sunil Mushran
  2010-04-20 22:14 ` Joel Becker
  2010-04-20 22:32 ` Joel Becker
  3 siblings, 0 replies; 13+ messages in thread
From: Sunil Mushran @ 2010-04-20 20:26 UTC (permalink / raw)
  To: ocfs2-devel

Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com>


Tristan Ye wrote:
> Since we've been using uuid_str in most of ocfs2 codes, adding
> such a macro would be helpful.
>
> Signed-off-by: Tristan Ye <tristan.ye@oracle.com>
> ---
>  fs/ocfs2/ocfs2_fs.h |    1 +
>  1 files changed, 1 insertions(+), 0 deletions(-)
>
> diff --git a/fs/ocfs2/ocfs2_fs.h b/fs/ocfs2/ocfs2_fs.h
> index bb37218..b313c83 100644
> --- a/fs/ocfs2/ocfs2_fs.h
> +++ b/fs/ocfs2/ocfs2_fs.h
> @@ -274,6 +274,7 @@
>  
>  #define OCFS2_VOL_UUID_LEN		16
>  #define OCFS2_MAX_VOL_LABEL_LEN		64
> +#define OCFS2_VOL_UUIDSTR_LEN		(OCFS2_VOL_UUID_LEN * 2 + 1)
>  
>  /* The alternate, userspace stack fields */
>  #define OCFS2_STACK_LABEL_LEN		4
>   

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Ocfs2-devel] [PATCH 2/2] Ocfs2: Add new OCFS2_IOC_INFO ioctl for ocfs2 v7.
  2010-04-20  6:59 ` [Ocfs2-devel] [PATCH 2/2] Ocfs2: Add new OCFS2_IOC_INFO ioctl for ocfs2 v7 Tristan Ye
@ 2010-04-20 20:31   ` Sunil Mushran
  0 siblings, 0 replies; 13+ messages in thread
From: Sunil Mushran @ 2010-04-20 20:31 UTC (permalink / raw)
  To: ocfs2-devel

Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com>


Tristan Ye wrote:
> The reason why we need this ioctl is to offer the none-privileged
> end-user a possibility to get filesys info gathering.
>
> We use OCFS2_IOC_INFO to manipulate the new ioctl, userspace passes a
> structure to kernel containing an array of request pointers and request
> count, such as,
>
> * From userspace:
>
> struct ocfs2_info_blocksize oib = {
>         .ib_req = {
>                 .ir_magic = OCFS2_INFO_MAGIC,
>                 .ir_code = OCFS2_INFO_BLOCKSIZE,
>                 ...
>         }
>         ...
> }
>
> struct ocfs2_info_clustersize oic = {
>         ...
> }
>
> uint64_t reqs[2] = {(unsigned long)&oib,
>                     (unsigned long)&oic};
>
> struct ocfs2_info info = {
>         .oi_requests = reqs,
>         .oi_count = 2,
> }
>
> ret = ioctl(fd, OCFS2_IOC_INFO, &info);
>
> * In kernel:
>
> Get the request pointers from *info*, then handle each request one bye one.
>
> Idea here is to make the spearated request small enough to guarantee
> a better backward&forward compatibility since a small piece of request
> would be less likely to be broken if filesys on raw disk get changed.
>
> Currently, following 8 ioctls get implemented per the requirement from
> userspace tool o2info, and I believe it will grow over time:-)
>
>         OCFS2_INFO_CLUSTERSIZE
>         OCFS2_INFO_BLOCKSIZE
>         OCFS2_INFO_MAXSLOTS
>         OCFS2_INFO_LABEL
>         OCFS2_INFO_UUID
>         OCFS2_INFO_FS_FEATURES
>
> This ioctl is only specific to OCFS2.
>
> Signed-off-by: Tristan Ye <tristan.ye@oracle.com>
> ---
>  fs/ocfs2/ioctl.c       |  275 ++++++++++++++++++++++++++++++++++++++++++++++++
>  fs/ocfs2/ocfs2_ioctl.h |   80 ++++++++++++++
>  2 files changed, 355 insertions(+), 0 deletions(-)
>
> diff --git a/fs/ocfs2/ioctl.c b/fs/ocfs2/ioctl.c
> index 7d9d9c1..5e10340 100644
> --- a/fs/ocfs2/ioctl.c
> +++ b/fs/ocfs2/ioctl.c
> @@ -23,8 +23,18 @@
>  #include "ioctl.h"
>  #include "resize.h"
>  #include "refcounttree.h"
> +#include "sysfile.h"
> +#include "buffer_head_io.h"
> +#include "suballoc.h"
> +
>  
>  #include <linux/ext2_fs.h>
> +#include <linux/compat.h>
> +
> +#define o2info_from_user(a, b)	\
> +		copy_from_user(&(a), (b), sizeof(a))
> +#define o2info_to_user(a, b)	\
> +		copy_to_user((typeof(a) __user *)b, &(a), sizeof(a))
>  
>  static int ocfs2_get_inode_attr(struct inode *inode, unsigned *flags)
>  {
> @@ -109,6 +119,257 @@ bail:
>  	return status;
>  }
>  
> +int ocfs2_info_handle_blocksize(struct inode *inode,
> +				struct ocfs2_info_request __user *req)
> +{
> +	int status = -EFAULT;
> +	struct ocfs2_info_blocksize oib;
> +
> +	if (o2info_from_user(oib, req))
> +		goto bail;
> +
> +	oib.ib_blocksize = inode->i_sb->s_blocksize;
> +	oib.ib_req.ir_flags |= OCFS2_INFO_FL_FILLED;
> +
> +	if (o2info_to_user(oib, req))
> +		goto bail;
> +
> +	status = 0;
> +bail:
> +	return status;
> +}
> +
> +int ocfs2_info_handle_clustersize(struct inode *inode,
> +				  struct ocfs2_info_request __user *req)
> +{
> +	int status = -EFAULT;
> +	struct ocfs2_info_clustersize oic;
> +	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
> +
> +	if (o2info_from_user(oic, req))
> +		goto bail;
> +
> +	oic.ic_clustersize = osb->s_clustersize;
> +	oic.ic_req.ir_flags |= OCFS2_INFO_FL_FILLED;
> +
> +	if (o2info_to_user(oic, req))
> +		goto bail;
> +
> +	status = 0;
> +bail:
> +	return status;
> +}
> +
> +int ocfs2_info_handle_maxslots(struct inode *inode,
> +			       struct ocfs2_info_request __user *req)
> +{
> +	int status = -EFAULT;
> +	struct ocfs2_info_maxslots oim;
> +	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
> +
> +	if (o2info_from_user(oim, req))
> +		goto bail;
> +
> +	oim.im_max_slots = osb->max_slots;
> +	oim.im_req.ir_flags |= OCFS2_INFO_FL_FILLED;
> +
> +	if (o2info_to_user(oim, req))
> +		goto bail;
> +
> +	status = 0;
> +bail:
> +	return status;
> +}
> +
> +int ocfs2_info_handle_label(struct inode *inode,
> +			    struct ocfs2_info_request __user *req)
> +{
> +	int status = -EFAULT;
> +	struct ocfs2_info_label oil;
> +	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
> +
> +	if (o2info_from_user(oil, req))
> +		goto bail;
> +
> +	memcpy(oil.il_label, osb->vol_label, OCFS2_MAX_VOL_LABEL_LEN);
> +	oil.il_req.ir_flags |= OCFS2_INFO_FL_FILLED;
> +
> +	if (o2info_to_user(oil, req))
> +		goto bail;
> +
> +	status = 0;
> +bail:
> +	return status;
> +}
> +
> +int ocfs2_info_handle_uuid(struct inode *inode,
> +			   struct ocfs2_info_request __user *req)
> +{
> +	int status = -EFAULT;
> +	struct ocfs2_info_uuid oiu;
> +	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
> +
> +	if (o2info_from_user(oiu, req))
> +		goto bail;
> +
> +	memcpy(oiu.iu_uuid_str, osb->uuid_str, OCFS2_VOL_UUIDSTR_LEN);
> +	oiu.iu_req.ir_flags |= OCFS2_INFO_FL_FILLED;
> +
> +	if (o2info_to_user(oiu, req))
> +		goto bail;
> +
> +	status = 0;
> +bail:
> +	return status;
> +}
> +
> +int ocfs2_info_handle_fs_features(struct inode *inode,
> +				  struct ocfs2_info_request __user *req)
> +{
> +	int status = -EFAULT;
> +	struct ocfs2_info_fs_features oif;
> +	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
> +
> +	if (o2info_from_user(oif, req))
> +		goto bail;
> +
> +	oif.if_compat_features = osb->s_feature_compat;
> +	oif.if_incompat_features = osb->s_feature_incompat;
> +	oif.if_ro_compat_features = osb->s_feature_ro_compat;
> +	oif.if_req.ir_flags |= OCFS2_INFO_FL_FILLED;
> +
> +	if (o2info_to_user(oif, req))
> +		goto bail;
> +
> +	status = 0;
> +bail:
> +	return status;
> +}
> +
> +int ocfs2_info_handle_unknown(struct inode *inode,
> +			      struct ocfs2_info_request __user *req)
> +{
> +	int status = -EFAULT;
> +	struct ocfs2_info_request oir;
> +
> +	if (o2info_from_user(oir, req))
> +		goto bail;
> +
> +	oir.ir_flags &= ~OCFS2_INFO_FL_FILLED;
> +
> +	if (o2info_to_user(oir, req))
> +		goto bail;
> +
> +	status = 0;
> +bail:
> +	return status;
> +}
> +
> +/*
> + * Validate and distinguish OCFS2_IOC_INFO requests.
> + *
> + * - validate the magic number.
> + * - distinguish different requests.
> + * - validate size of different requests.
> + */
> +int ocfs2_info_handle_request(struct inode *inode,
> +			      struct ocfs2_info_request __user *req)
> +{
> +	int status = -EFAULT;
> +	struct ocfs2_info_request oir;
> +
> +	if (o2info_from_user(oir, req))
> +		goto bail;
> +
> +	status = -EINVAL;
> +	if (oir.ir_magic != OCFS2_INFO_MAGIC)
> +		goto bail;
> +
> +	switch (oir.ir_code) {
> +	case OCFS2_INFO_BLOCKSIZE:
> +		if (oir.ir_size == sizeof(struct ocfs2_info_blocksize))
> +			status = ocfs2_info_handle_blocksize(inode, req);
> +		break;
> +	case OCFS2_INFO_CLUSTERSIZE:
> +		if (oir.ir_size == sizeof(struct ocfs2_info_clustersize))
> +			status = ocfs2_info_handle_clustersize(inode, req);
> +		break;
> +	case OCFS2_INFO_MAXSLOTS:
> +		if (oir.ir_size == sizeof(struct ocfs2_info_maxslots))
> +			status = ocfs2_info_handle_maxslots(inode, req);
> +		break;
> +	case OCFS2_INFO_LABEL:
> +		if (oir.ir_size == sizeof(struct ocfs2_info_label))
> +			status = ocfs2_info_handle_label(inode, req);
> +		break;
> +	case OCFS2_INFO_UUID:
> +		if (oir.ir_size == sizeof(struct ocfs2_info_uuid))
> +			status = ocfs2_info_handle_uuid(inode, req);
> +		break;
> +	case OCFS2_INFO_FS_FEATURES:
> +		if (oir.ir_size == sizeof(struct ocfs2_info_fs_features))
> +			status = ocfs2_info_handle_fs_features(inode, req);
> +		break;
> +	default:
> +		status = ocfs2_info_handle_unknown(inode, req);
> +		break;
> +	}
> +
> +bail:
> +	return status;
> +}
> +
> +/*
> + * OCFS2_IOC_INFO handles an array of requests passed from userspace.
> + *
> + * ocfs2_info_handle() recevies a large info aggregation, grab and
> + * validate the request count from header, then break it into small
> + * pieces, later specific handlers can handle them one by one.
> + *
> + * Idea here is to make each separate request small enough to ensure
> + * a better backward&forward compatibility, since a small piece of
> + * request will be less likely to be broken if disk layout get changed.
> + */
> +int ocfs2_info_handle(struct inode *inode, struct ocfs2_info *info,
> +		      int compat_flag)
> +{
> +	int i, status = 0;
> +	u64 req_addr;
> +	struct ocfs2_info_request __user *reqp;
> +
> +	if ((info->oi_count > OCFS2_INFO_MAX_REQUEST) ||
> +	    (!info->oi_requests)) {
> +		status = -EINVAL;
> +		goto bail;
> +	}
> +
> +	for (i = 0; i < info->oi_count; i++) {
> +		status = -EFAULT;
> +		if (compat_flag) {
> +			if (get_user(req_addr,
> +			     (u64 __user *)compat_ptr(info->oi_requests) + i))
> +				goto bail;
> +		} else {
> +			if (get_user(req_addr,
> +				     (u64 __user *)(info->oi_requests) + i))
> +				goto bail;
> +		}
> +
> +		reqp = (struct ocfs2_info_request *)req_addr;
> +		if (!reqp) {
> +			status = -EINVAL;
> +			goto bail;
> +		}
> +
> +		status = ocfs2_info_handle_request(inode, reqp);
> +		if (status)
> +			goto bail;
> +	}
> +
> +bail:
> +	return status;
> +}
> +
>  long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
>  {
>  	struct inode *inode = filp->f_path.dentry->d_inode;
> @@ -120,6 +381,7 @@ long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
>  	struct reflink_arguments args;
>  	const char *old_path, *new_path;
>  	bool preserve;
> +	struct ocfs2_info info;
>  
>  	switch (cmd) {
>  	case OCFS2_IOC_GETFLAGS:
> @@ -174,6 +436,12 @@ long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
>  		preserve = (args.preserve != 0);
>  
>  		return ocfs2_reflink_ioctl(inode, old_path, new_path, preserve);
> +	case OCFS2_IOC_INFO:
> +		if (copy_from_user(&info, (struct ocfs2_info __user *)arg,
> +				   sizeof(struct ocfs2_info)))
> +			return -EFAULT;
> +
> +		return ocfs2_info_handle(inode, &info, 0);
>  	default:
>  		return -ENOTTY;
>  	}
> @@ -185,6 +453,7 @@ long ocfs2_compat_ioctl(struct file *file, unsigned cmd, unsigned long arg)
>  	bool preserve;
>  	struct reflink_arguments args;
>  	struct inode *inode = file->f_path.dentry->d_inode;
> +	struct ocfs2_info info;
>  
>  	switch (cmd) {
>  	case OCFS2_IOC32_GETFLAGS:
> @@ -209,6 +478,12 @@ long ocfs2_compat_ioctl(struct file *file, unsigned cmd, unsigned long arg)
>  
>  		return ocfs2_reflink_ioctl(inode, compat_ptr(args.old_path),
>  					   compat_ptr(args.new_path), preserve);
> +	case OCFS2_IOC_INFO:
> +		if (copy_from_user(&info, (struct ocfs2_info __user *)arg,
> +				   sizeof(struct ocfs2_info)))
> +			return -EFAULT;
> +
> +		return ocfs2_info_handle(inode, &info, 1);
>  	default:
>  		return -ENOIOCTLCMD;
>  	}
> diff --git a/fs/ocfs2/ocfs2_ioctl.h b/fs/ocfs2/ocfs2_ioctl.h
> index 2d3420a..12a5502 100644
> --- a/fs/ocfs2/ocfs2_ioctl.h
> +++ b/fs/ocfs2/ocfs2_ioctl.h
> @@ -76,4 +76,84 @@ struct reflink_arguments {
>  };
>  #define OCFS2_IOC_REFLINK	_IOW('o', 4, struct reflink_arguments)
>  
> +/* Following definitions dedicated for ocfs2_info_request ioctls. */
> +#define OCFS2_INFO_MAX_REQUEST		(50)
> +
> +/* Magic number of all requests */
> +#define OCFS2_INFO_MAGIC		(0x4F32494E)
> +
> +/*
> + * Always try to separate info request into small pieces to
> + * guarantee the backward&forward compatibility.
> + */
> +struct ocfs2_info {
> +	__u64 oi_requests;	/* Array of __u64 pointers to requests */
> +	__u32 oi_count;	/* Number of requests in info_requests */
> +};
> +
> +struct ocfs2_info_request {
> +/*00*/	__u32 ir_magic;	/* Magic number */
> +	__u32 ir_code;	/* Info request code */
> +	__u32 ir_size;	/* Size of request */
> +	__u32 ir_flags;	/* Request flags */
> +/*10*/	/* Request specific fields */
> +};
> +
> +struct ocfs2_info_clustersize {
> +	struct ocfs2_info_request ic_req;
> +	__u32 ic_clustersize;
> +};
> +
> +struct ocfs2_info_blocksize {
> +	struct ocfs2_info_request ib_req;
> +	__u32 ib_blocksize;
> +};
> +
> +struct ocfs2_info_maxslots {
> +	struct ocfs2_info_request im_req;
> +	__u16 im_max_slots;
> +};
> +
> +struct ocfs2_info_label {
> +	struct ocfs2_info_request il_req;
> +	__u8	il_label[OCFS2_MAX_VOL_LABEL_LEN];
> +};
> +
> +struct ocfs2_info_uuid {
> +	struct ocfs2_info_request iu_req;
> +	__u8	iu_uuid_str[OCFS2_VOL_UUIDSTR_LEN];
> +};
> +
> +struct ocfs2_info_fs_features {
> +	struct ocfs2_info_request if_req;
> +	__u32 if_compat_features;
> +	__u32 if_incompat_features;
> +	__u32 if_ro_compat_features;
> +};
> +
> +/* Codes for ocfs2_info_request */
> +enum ocfs2_info_type {
> +	OCFS2_INFO_CLUSTERSIZE = 1,
> +	OCFS2_INFO_BLOCKSIZE,
> +	OCFS2_INFO_MAXSLOTS,
> +	OCFS2_INFO_LABEL,
> +	OCFS2_INFO_UUID,
> +	OCFS2_INFO_FS_FEATURES,
> +	OCFS2_INFO_NUM_TYPES
> +};
> +
> +/* Flags for struct ocfs2_info_request */
> +/* Filled by the caller */
> +#define OCFS2_INFO_FL_NON_COHERENT	(0x00000001)	/* Cluster coherency not
> +							   required. This is a hint.
> +							   It is up to ocfs2 whether
> +							   the request can be fulfilled
> +							   without locking. */
> +/* Filled by ocfs2 */
> +#define OCFS2_INFO_FL_FILLED		(0x80000000)	/* Filesystem understood
> +							   this request and
> +							   filled in the answer */
> +
> +#define OCFS2_IOC_INFO		_IOR('o', 5, struct ocfs2_info)
> +
>  #endif /* OCFS2_IOCTL_H */
>   

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Ocfs2-devel] [PATCH 1/2] Ocfs2: Add macro OCFS2_VOL_UUIDSTR_LEN in ocfs2_fs.h
  2010-04-20  6:59 [Ocfs2-devel] [PATCH 1/2] Ocfs2: Add macro OCFS2_VOL_UUIDSTR_LEN in ocfs2_fs.h Tristan Ye
  2010-04-20  6:59 ` [Ocfs2-devel] [PATCH 2/2] Ocfs2: Add new OCFS2_IOC_INFO ioctl for ocfs2 v7 Tristan Ye
  2010-04-20 20:26 ` [Ocfs2-devel] [PATCH 1/2] Ocfs2: Add macro OCFS2_VOL_UUIDSTR_LEN in ocfs2_fs.h Sunil Mushran
@ 2010-04-20 22:14 ` Joel Becker
  2010-04-20 22:32 ` Joel Becker
  3 siblings, 0 replies; 13+ messages in thread
From: Joel Becker @ 2010-04-20 22:14 UTC (permalink / raw)
  To: ocfs2-devel

On Tue, Apr 20, 2010 at 02:59:02PM +0800, Tristan Ye wrote:
> Since we've been using uuid_str in most of ocfs2 codes, adding
> such a macro would be helpful.
> 
> Signed-off-by: Tristan Ye <tristan.ye@oracle.com>
> ---
>  fs/ocfs2/ocfs2_fs.h |    1 +
>  1 files changed, 1 insertions(+), 0 deletions(-)
> 
> diff --git a/fs/ocfs2/ocfs2_fs.h b/fs/ocfs2/ocfs2_fs.h
> index bb37218..b313c83 100644
> --- a/fs/ocfs2/ocfs2_fs.h
> +++ b/fs/ocfs2/ocfs2_fs.h
> @@ -274,6 +274,7 @@
>  
>  #define OCFS2_VOL_UUID_LEN		16
>  #define OCFS2_MAX_VOL_LABEL_LEN		64
> +#define OCFS2_VOL_UUIDSTR_LEN		(OCFS2_VOL_UUID_LEN * 2 + 1)

	Do we want this _LEN macro to include the NUL?

Joel

-- 

"Sometimes I think the surest sign intelligent
 life exists elsewhere in the universe is that
 none of it has tried to contact us."
                                -Calvin & Hobbes

Joel Becker
Principal Software Developer
Oracle
E-mail: joel.becker at oracle.com
Phone: (650) 506-8127

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Ocfs2-devel] [PATCH 1/2] Ocfs2: Add macro OCFS2_VOL_UUIDSTR_LEN in ocfs2_fs.h
  2010-04-20  6:59 [Ocfs2-devel] [PATCH 1/2] Ocfs2: Add macro OCFS2_VOL_UUIDSTR_LEN in ocfs2_fs.h Tristan Ye
                   ` (2 preceding siblings ...)
  2010-04-20 22:14 ` Joel Becker
@ 2010-04-20 22:32 ` Joel Becker
  2010-04-20 22:34   ` Sunil Mushran
  3 siblings, 1 reply; 13+ messages in thread
From: Joel Becker @ 2010-04-20 22:32 UTC (permalink / raw)
  To: ocfs2-devel

On Tue, Apr 20, 2010 at 02:59:02PM +0800, Tristan Ye wrote:
> Since we've been using uuid_str in most of ocfs2 codes, adding
> such a macro would be helpful.
> 
> Signed-off-by: Tristan Ye <tristan.ye@oracle.com>
> ---
>  fs/ocfs2/ocfs2_fs.h |    1 +
>  1 files changed, 1 insertions(+), 0 deletions(-)
> 
> diff --git a/fs/ocfs2/ocfs2_fs.h b/fs/ocfs2/ocfs2_fs.h
> index bb37218..b313c83 100644
> --- a/fs/ocfs2/ocfs2_fs.h
> +++ b/fs/ocfs2/ocfs2_fs.h
> @@ -274,6 +274,7 @@
>  
>  #define OCFS2_VOL_UUID_LEN		16
>  #define OCFS2_MAX_VOL_LABEL_LEN		64
> +#define OCFS2_VOL_UUIDSTR_LEN		(OCFS2_VOL_UUID_LEN * 2 + 1)

	Also, why is this in ocfs2_fs.h?  It's not a structural
feature.

Joel

-- 

"If you are ever in doubt as to whether or not to kiss a pretty girl, 
 give her the benefit of the doubt"
                                        -Thomas Carlyle

Joel Becker
Principal Software Developer
Oracle
E-mail: joel.becker at oracle.com
Phone: (650) 506-8127

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Ocfs2-devel] [PATCH 1/2] Ocfs2: Add macro OCFS2_VOL_UUIDSTR_LEN in ocfs2_fs.h
  2010-04-20 22:32 ` Joel Becker
@ 2010-04-20 22:34   ` Sunil Mushran
  2010-04-20 22:48     ` Sunil Mushran
  2010-04-21  1:37     ` tristan
  0 siblings, 2 replies; 13+ messages in thread
From: Sunil Mushran @ 2010-04-20 22:34 UTC (permalink / raw)
  To: ocfs2-devel

True. I had asked Tristan to put it in ocfs2.h

Joel Becker wrote:
> On Tue, Apr 20, 2010 at 02:59:02PM +0800, Tristan Ye wrote:
>   
>> Since we've been using uuid_str in most of ocfs2 codes, adding
>> such a macro would be helpful.
>>
>> Signed-off-by: Tristan Ye <tristan.ye@oracle.com>
>> ---
>>  fs/ocfs2/ocfs2_fs.h |    1 +
>>  1 files changed, 1 insertions(+), 0 deletions(-)
>>
>> diff --git a/fs/ocfs2/ocfs2_fs.h b/fs/ocfs2/ocfs2_fs.h
>> index bb37218..b313c83 100644
>> --- a/fs/ocfs2/ocfs2_fs.h
>> +++ b/fs/ocfs2/ocfs2_fs.h
>> @@ -274,6 +274,7 @@
>>  
>>  #define OCFS2_VOL_UUID_LEN		16
>>  #define OCFS2_MAX_VOL_LABEL_LEN		64
>> +#define OCFS2_VOL_UUIDSTR_LEN		(OCFS2_VOL_UUID_LEN * 2 + 1)
>>     
>
> 	Also, why is this in ocfs2_fs.h?  It's not a structural
> feature.
>
> Joel
>
>   

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Ocfs2-devel] [PATCH 1/2] Ocfs2: Add macro OCFS2_VOL_UUIDSTR_LEN in ocfs2_fs.h
  2010-04-20 22:34   ` Sunil Mushran
@ 2010-04-20 22:48     ` Sunil Mushran
  2010-04-21  1:40       ` tristan
  2010-04-21  1:37     ` tristan
  1 sibling, 1 reply; 13+ messages in thread
From: Sunil Mushran @ 2010-04-20 22:48 UTC (permalink / raw)
  To: ocfs2-devel

ok. So how about we remove this #define totally and have
the ioctl interface return the binary uuid. The o2info tool
can convert do the conversion.

Sunil Mushran wrote:
> True. I had asked Tristan to put it in ocfs2.h
>
> Joel Becker wrote:
>   
>> On Tue, Apr 20, 2010 at 02:59:02PM +0800, Tristan Ye wrote:
>>   
>>     
>>> Since we've been using uuid_str in most of ocfs2 codes, adding
>>> such a macro would be helpful.
>>>
>>> Signed-off-by: Tristan Ye <tristan.ye@oracle.com>
>>> ---
>>>  fs/ocfs2/ocfs2_fs.h |    1 +
>>>  1 files changed, 1 insertions(+), 0 deletions(-)
>>>
>>> diff --git a/fs/ocfs2/ocfs2_fs.h b/fs/ocfs2/ocfs2_fs.h
>>> index bb37218..b313c83 100644
>>> --- a/fs/ocfs2/ocfs2_fs.h
>>> +++ b/fs/ocfs2/ocfs2_fs.h
>>> @@ -274,6 +274,7 @@
>>>  
>>>  #define OCFS2_VOL_UUID_LEN		16
>>>  #define OCFS2_MAX_VOL_LABEL_LEN		64
>>> +#define OCFS2_VOL_UUIDSTR_LEN		(OCFS2_VOL_UUID_LEN * 2 + 1)
>>>     
>>>       
>> 	Also, why is this in ocfs2_fs.h?  It's not a structural
>> feature.
>>
>> Joel
>>
>>   
>>     
>
>
> _______________________________________________
> Ocfs2-devel mailing list
> Ocfs2-devel at oss.oracle.com
> http://oss.oracle.com/mailman/listinfo/ocfs2-devel
>   

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Ocfs2-devel] [PATCH 1/2] Ocfs2: Add macro OCFS2_VOL_UUIDSTR_LEN in ocfs2_fs.h
  2010-04-20 22:34   ` Sunil Mushran
  2010-04-20 22:48     ` Sunil Mushran
@ 2010-04-21  1:37     ` tristan
  1 sibling, 0 replies; 13+ messages in thread
From: tristan @ 2010-04-21  1:37 UTC (permalink / raw)
  To: ocfs2-devel

Sunil Mushran wrote:
> True. I had asked Tristan to put it in ocfs2.h
>
> Joel Becker wrote:
>> On Tue, Apr 20, 2010 at 02:59:02PM +0800, Tristan Ye wrote:
>>> Since we've been using uuid_str in most of ocfs2 codes, adding
>>> such a macro would be helpful.
>>>
>>> Signed-off-by: Tristan Ye <tristan.ye@oracle.com>
>>> ---
>>> fs/ocfs2/ocfs2_fs.h | 1 +
>>> 1 files changed, 1 insertions(+), 0 deletions(-)
>>>
>>> diff --git a/fs/ocfs2/ocfs2_fs.h b/fs/ocfs2/ocfs2_fs.h
>>> index bb37218..b313c83 100644
>>> --- a/fs/ocfs2/ocfs2_fs.h
>>> +++ b/fs/ocfs2/ocfs2_fs.h
>>> @@ -274,6 +274,7 @@
>>>
>>> #define ' 16
>>> #define OCFS2_MAX_VOL_LABEL_LEN 64
>>> +#define OCFS2_VOL_UUIDSTR_LEN (OCFS2_VOL_UUID_LEN * 2 + 1)
>>
>> Also, why is this in ocfs2_fs.h? It's not a structural
>> feature.

Yes I remembered sunil has asked me to add this in ocfs2.h, that's 
really my fault.

I thought it should be together with 'OCFS2_VOL_UUID_LEN', that's 
definitely wrong.


>>
>> Joel
>>
>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Ocfs2-devel] [PATCH 1/2] Ocfs2: Add macro OCFS2_VOL_UUIDSTR_LEN in ocfs2_fs.h
  2010-04-20 22:48     ` Sunil Mushran
@ 2010-04-21  1:40       ` tristan
  2010-04-21  1:44         ` tristan
  2010-04-21 18:32         ` Sunil Mushran
  0 siblings, 2 replies; 13+ messages in thread
From: tristan @ 2010-04-21  1:40 UTC (permalink / raw)
  To: ocfs2-devel

Sunil Mushran wrote:
> ok. So how about we remove this #define totally and have
> the ioctl interface return the binary uuid. The o2info tool
> can convert do the conversion.

But... returning binary uuid from o2info was not that easy, ocfs2 
in-memory super_block osb only successfully initialized the osb->uuid, 
while did nothing to uuid_str, I remembered we've been discussing on 
that issue:

http://oss.oracle.com/pipermail/ocfs2-devel/2009-November/005514.html


That patch was not adopted, and we're still using uuid_str in most places.


Tristan.

>
> Sunil Mushran wrote:
>> True. I had asked Tristan to put it in ocfs2.h
>>
>> Joel Becker wrote:
>>> On Tue, Apr 20, 2010 at 02:59:02PM +0800, Tristan Ye wrote:
>>>> Since we've been using uuid_str in most of ocfs2 codes, adding
>>>> such a macro would be helpful.
>>>>
>>>> Signed-off-by: Tristan Ye <tristan.ye@oracle.com>
>>>> ---
>>>> fs/ocfs2/ocfs2_fs.h | 1 +
>>>> 1 files changed, 1 insertions(+), 0 deletions(-)
>>>>
>>>> diff --git a/fs/ocfs2/ocfs2_fs.h b/fs/ocfs2/ocfs2_fs.h
>>>> index bb37218..b313c83 100644
>>>> --- a/fs/ocfs2/ocfs2_fs.h
>>>> +++ b/fs/ocfs2/ocfs2_fs.h
>>>> @@ -274,6 +274,7 @@
>>>>
>>>> #define OCFS2_VOL_UUID_LEN 16
>>>> #define OCFS2_MAX_VOL_LABEL_LEN 64
>>>> +#define OCFS2_VOL_UUIDSTR_LEN (OCFS2_VOL_UUID_LEN * 2 + 1)
>>> Also, why is this in ocfs2_fs.h? It's not a structural
>>> feature.
>>>
>>> Joel
>>>
>>
>>
>> _______________________________________________
>> Ocfs2-devel mailing list
>> Ocfs2-devel at oss.oracle.com
>> http://oss.oracle.com/mailman/listinfo/ocfs2-devel
>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Ocfs2-devel] [PATCH 1/2] Ocfs2: Add macro OCFS2_VOL_UUIDSTR_LEN in ocfs2_fs.h
  2010-04-21  1:40       ` tristan
@ 2010-04-21  1:44         ` tristan
  2010-04-21 18:32         ` Sunil Mushran
  1 sibling, 0 replies; 13+ messages in thread
From: tristan @ 2010-04-21  1:44 UTC (permalink / raw)
  To: ocfs2-devel

tristan wrote:
> Sunil Mushran wrote:
>> ok. So how about we remove this #define totally and have
>> the ioctl interface return the binary uuid. The o2info tool
>> can convert do the conversion.
>
> But... returning binary uuid from o2info was not that easy, ocfs2 
> in-memory super_block osb only successfully initialized the osb->uuid, 
> while did nothing to uuid_str, I remembered we've been discussing on 
> that issue:

Oh, sorry for the typo here , I meant it successfully initialized 
osb->uuid_str, while did nothing to osb->uuid.


>
> http://oss.oracle.com/pipermail/ocfs2-devel/2009-November/005514.html
>
>
> That patch was not adopted, and we're still using uuid_str in most places.
>
>
> Tristan.
>
>> Sunil Mushran wrote:
>>> True. I had asked Tristan to put it in ocfs2.h
>>>
>>> Joel Becker wrote:
>>>> On Tue, Apr 20, 2010 at 02:59:02PM +0800, Tristan Ye wrote:
>>>>> Since we've been using uuid_str in most of ocfs2 codes, adding
>>>>> such a macro would be helpful.
>>>>>
>>>>> Signed-off-by: Tristan Ye <tristan.ye@oracle.com>
>>>>> ---
>>>>> fs/ocfs2/ocfs2_fs.h | 1 +
>>>>> 1 files changed, 1 insertions(+), 0 deletions(-)
>>>>>
>>>>> diff --git a/fs/ocfs2/ocfs2_fs.h b/fs/ocfs2/ocfs2_fs.h
>>>>> index bb37218..b313c83 100644
>>>>> --- a/fs/ocfs2/ocfs2_fs.h
>>>>> +++ b/fs/ocfs2/ocfs2_fs.h
>>>>> @@ -274,6 +274,7 @@
>>>>>
>>>>> #define OCFS2_VOL_UUID_LEN 16
>>>>> #define OCFS2_MAX_VOL_LABEL_LEN 64
>>>>> +#define OCFS2_VOL_UUIDSTR_LEN (OCFS2_VOL_UUID_LEN * 2 + 1)
>>>> Also, why is this in ocfs2_fs.h? It's not a structural
>>>> feature.
>>>>
>>>> Joel
>>>>
>>>
>>> _______________________________________________
>>> Ocfs2-devel mailing list
>>> Ocfs2-devel at oss.oracle.com
>>> http://oss.oracle.com/mailman/listinfo/ocfs2-devel
>
>
> _______________________________________________
> Ocfs2-devel mailing list
> Ocfs2-devel at oss.oracle.com
> http://oss.oracle.com/mailman/listinfo/ocfs2-devel

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Ocfs2-devel] [PATCH 1/2] Ocfs2: Add macro OCFS2_VOL_UUIDSTR_LEN in ocfs2_fs.h
  2010-04-21  1:40       ` tristan
  2010-04-21  1:44         ` tristan
@ 2010-04-21 18:32         ` Sunil Mushran
  2010-04-22 10:18           ` Joel Becker
  1 sibling, 1 reply; 13+ messages in thread
From: Sunil Mushran @ 2010-04-21 18:32 UTC (permalink / raw)
  To: ocfs2-devel

tristan wrote:
> Sunil Mushran wrote:
>> ok. So how about we remove this #define totally and have
>> the ioctl interface return the binary uuid. The o2info tool
>> can convert do the conversion.
>
> But... returning binary uuid from o2info was not that easy, ocfs2 
> in-memory super_block osb only successfully initialized the osb->uuid, 
> while did nothing to uuid_str, I remembered we've been discussing on 
> that issue:
>
> http://oss.oracle.com/pipermail/ocfs2-devel/2009-November/005514.html
>
>
> That patch was not adopted, and we're still using uuid_str in most 
> places.

Ok. Thanks for reminding me.

It appears we already have OCFS2_TEXT_UUID_LEN in stack_user.c. That's a
clean name. In the patch below, I have moved it to ocfs2.h so that we can
use it elsewhere.

http://oss.oracle.com/~smushran/0001-ocfs2-Cleanup-uuid-strings.patch

I am waiting for Joel to comment. If he approves, then you can use the
same #define in your ioctl.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [Ocfs2-devel] [PATCH 1/2] Ocfs2: Add macro OCFS2_VOL_UUIDSTR_LEN in ocfs2_fs.h
  2010-04-21 18:32         ` Sunil Mushran
@ 2010-04-22 10:18           ` Joel Becker
  0 siblings, 0 replies; 13+ messages in thread
From: Joel Becker @ 2010-04-22 10:18 UTC (permalink / raw)
  To: ocfs2-devel

On Wed, Apr 21, 2010 at 11:32:37AM -0700, Sunil Mushran wrote:
> tristan wrote:
> > Sunil Mushran wrote:
> >> ok. So how about we remove this #define totally and have
> >> the ioctl interface return the binary uuid. The o2info tool
> >> can convert do the conversion.
> >
> > But... returning binary uuid from o2info was not that easy, ocfs2 
> > in-memory super_block osb only successfully initialized the osb->uuid, 
> > while did nothing to uuid_str, I remembered we've been discussing on 
> > that issue:
> >
> > http://oss.oracle.com/pipermail/ocfs2-devel/2009-November/005514.html
> >
> >
> > That patch was not adopted, and we're still using uuid_str in most 
> > places.
> 
> Ok. Thanks for reminding me.
> 
> It appears we already have OCFS2_TEXT_UUID_LEN in stack_user.c. That's a
> clean name. In the patch below, I have moved it to ocfs2.h so that we can
> use it elsewhere.
> 
> http://oss.oracle.com/~smushran/0001-ocfs2-Cleanup-uuid-strings.patch
> 
> I am waiting for Joel to comment. If he approves, then you can use the
> same #define in your ioctl.

	I'm glad you like the name, and I'm fine with you adding it to
ocfs2.h, but it should not be removing the define from stack_user.c.
Note that stack_user.c does not include ocfs2.h.

Joel

-- 

"Any man who is under 30, and is not a liberal, has not heart;
 and any man who is over 30, and is not a conservative, has no brains."
         - Sir Winston Churchill 

Joel Becker
Principal Software Developer
Oracle
E-mail: joel.becker at oracle.com
Phone: (650) 506-8127

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2010-04-22 10:18 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-04-20  6:59 [Ocfs2-devel] [PATCH 1/2] Ocfs2: Add macro OCFS2_VOL_UUIDSTR_LEN in ocfs2_fs.h Tristan Ye
2010-04-20  6:59 ` [Ocfs2-devel] [PATCH 2/2] Ocfs2: Add new OCFS2_IOC_INFO ioctl for ocfs2 v7 Tristan Ye
2010-04-20 20:31   ` Sunil Mushran
2010-04-20 20:26 ` [Ocfs2-devel] [PATCH 1/2] Ocfs2: Add macro OCFS2_VOL_UUIDSTR_LEN in ocfs2_fs.h Sunil Mushran
2010-04-20 22:14 ` Joel Becker
2010-04-20 22:32 ` Joel Becker
2010-04-20 22:34   ` Sunil Mushran
2010-04-20 22:48     ` Sunil Mushran
2010-04-21  1:40       ` tristan
2010-04-21  1:44         ` tristan
2010-04-21 18:32         ` Sunil Mushran
2010-04-22 10:18           ` Joel Becker
2010-04-21  1:37     ` tristan

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.