* [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 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 ` 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 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: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
* [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
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 a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).