--- linux-2.6.18.2/fs/ocfs2/Makefile 2006-01-18 06:08:34 +0100 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/Makefile 2006-09-25 15:40:02 +0200 @@ -16,6 +16,7 @@ ocfs2-objs := \ file.o \ heartbeat.o \ inode.o \ + ioctl.o \ journal.o \ localalloc.o \ mmap.o \ --- linux-2.6.18.2/fs/ocfs2/dlm/dlmfs.c 2006-09-20 16:58:35 +0200 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/dlm/dlmfs.c 2006-09-25 15:40:02 +0200 @@ -335,6 +336,7 @@ static struct inode *dlmfs_get_root_inod inode->i_mode = mode; inode->i_uid = current->fsuid; inode->i_gid = current->fsgid; + inode->i_tag = dx_current_fstag(sb); inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_mapping->backing_dev_info = &dlmfs_backing_dev_info; --- linux-2.6.18.2/fs/ocfs2/dlm/dlmfs.c 2006-09-20 16:58:35 +0200 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/dlm/dlmfs.c 2006-09-25 15:40:02 +0200 @@ -362,6 +364,7 @@ static struct inode *dlmfs_get_inode(str inode->i_mode = mode; inode->i_uid = current->fsuid; inode->i_gid = current->fsgid; + inode->i_tag = dx_current_fstag(sb); inode->i_blksize = PAGE_CACHE_SIZE; inode->i_blocks = 0; inode->i_mapping->backing_dev_info = &dlmfs_backing_dev_info; --- linux-2.6.18.2/fs/ocfs2/dlmglue.c 2006-09-20 16:58:35 +0200 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/dlmglue.c 2006-09-25 15:40:02 +0200 @@ -1320,8 +1320,10 @@ static void __ocfs2_stuff_meta_lvb(struc lvb->lvb_version = cpu_to_be32(OCFS2_LVB_VERSION); lvb->lvb_isize = cpu_to_be64(i_size_read(inode)); lvb->lvb_iclusters = cpu_to_be32(oi->ip_clusters); + lvb->lvb_iflags = cpu_to_be32(oi->ip_flags) & OCFS2_FL_MASK; lvb->lvb_iuid = cpu_to_be32(inode->i_uid); lvb->lvb_igid = cpu_to_be32(inode->i_gid); + lvb->lvb_itag = cpu_to_be16(inode->i_tag); lvb->lvb_imode = cpu_to_be16(inode->i_mode); lvb->lvb_inlink = cpu_to_be16(inode->i_nlink); lvb->lvb_iatime_packed = --- linux-2.6.18.2/fs/ocfs2/dlmglue.c 2006-09-20 16:58:35 +0200 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/dlmglue.c 2006-09-25 15:40:02 +0200 @@ -1367,8 +1369,12 @@ static void ocfs2_refresh_inode_from_lvb inode->i_blocks = ocfs2_align_bytes_to_sectors(i_size_read(inode)); + oi->ip_flags &= ~OCFS2_FL_MASK; + oi->ip_flags |= be32_to_cpu(lvb->lvb_iflags) & OCFS2_FL_MASK; + inode->i_uid = be32_to_cpu(lvb->lvb_iuid); inode->i_gid = be32_to_cpu(lvb->lvb_igid); + inode->i_tag = be16_to_cpu(lvb->lvb_itag); inode->i_mode = be16_to_cpu(lvb->lvb_imode); inode->i_nlink = be16_to_cpu(lvb->lvb_inlink); ocfs2_unpack_timespec(&inode->i_atime, --- linux-2.6.18.2/fs/ocfs2/dlmglue.h 2006-01-18 06:08:34 +0100 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/dlmglue.h 2006-09-25 15:40:02 +0200 @@ -27,7 +27,7 @@ #ifndef DLMGLUE_H #define DLMGLUE_H -#define OCFS2_LVB_VERSION 2 +#define OCFS2_LVB_VERSION 3 struct ocfs2_meta_lvb { __be32 lvb_version; --- linux-2.6.18.2/fs/ocfs2/dlmglue.h 2006-01-18 06:08:34 +0100 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/dlmglue.h 2006-09-25 15:40:02 +0200 @@ -40,7 +40,9 @@ struct ocfs2_meta_lvb { __be64 lvb_isize; __be16 lvb_imode; __be16 lvb_inlink; - __be32 lvb_reserved[3]; + __be16 lvb_itag; + __be32 lvb_iflags; + __be32 lvb_reserved[2]; }; /* ocfs2_meta_lock_full() and ocfs2_data_lock_full() 'arg_flags' flags */ --- linux-2.6.18.2/fs/ocfs2/file.c 2006-06-18 04:54:44 +0200 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/file.c 2006-09-25 15:40:02 +0200 @@ -794,7 +797,7 @@ ***** mlog(0, "time change...\n"); #define OCFS2_VALID_ATTRS (ATTR_ATIME | ATTR_MTIME | ATTR_CTIME | ATTR_SIZE \ - | ATTR_GID | ATTR_UID | ATTR_MODE) + | ATTR_GID | ATTR_UID | ATTR_TAG | ATTR_MODE) if (!(attr->ia_valid & OCFS2_VALID_ATTRS)) { mlog(0, "can't handle attrs: 0x%x\n", attr->ia_valid); return 0; --- linux-2.6.18.2/fs/ocfs2/file.c 2006-06-18 04:54:44 +0200 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/file.c 2006-09-25 15:40:02 +0200 @@ -1227,6 +1231,7 @@ const struct file_operations ocfs2_fops .open = ocfs2_file_open, .aio_read = ocfs2_file_aio_read, .aio_write = ocfs2_file_aio_write, + .ioctl = ocfs2_ioctl, }; const struct file_operations ocfs2_dops = { --- linux-2.6.18.2/fs/ocfs2/file.c 2006-06-18 04:54:44 +0200 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/file.c 2006-09-25 15:40:02 +0200 @@ -1233,4 +1238,5 @@ ***** .read = generic_read_dir, .readdir = ocfs2_readdir, .fsync = ocfs2_sync_file, + .ioctl = ocfs2_ioctl, }; --- linux-2.6.18.2/fs/ocfs2/inode.c 2006-06-18 04:54:44 +0200 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/inode.c 2006-09-25 15:40:02 +0200 @@ -71,6 +73,62 @@ static int ocfs2_truncate_for_delete(str struct inode *inode, struct buffer_head *fe_bh); +void ocfs2_set_inode_flags(struct inode *inode) +{ + unsigned int flags = OCFS2_I(inode)->ip_flags; + + inode->i_flags &= ~(S_IMMUTABLE | + S_SYNC | S_APPEND | S_NOATIME | S_DIRSYNC); + + if (flags & OCFS2_IMMUTABLE_FL) + inode->i_flags |= S_IMMUTABLE; + if (flags & OCFS2_IUNLINK_FL) + inode->i_flags |= S_IUNLINK; + if (flags & OCFS2_BARRIER_FL) + inode->i_flags |= S_BARRIER; + + if (flags & OCFS2_SYNC_FL) + inode->i_flags |= S_SYNC; + if (flags & OCFS2_APPEND_FL) + inode->i_flags |= S_APPEND; + if (flags & OCFS2_NOATIME_FL) + inode->i_flags |= S_NOATIME; + if (flags & OCFS2_DIRSYNC_FL) + inode->i_flags |= S_DIRSYNC; +} + +int ocfs2_sync_flags(struct inode *inode) +{ + unsigned int oldflags, newflags; + + oldflags = OCFS2_I(inode)->ip_flags; + newflags = oldflags & ~(OCFS2_APPEND_FL | + OCFS2_IMMUTABLE_FL | OCFS2_IUNLINK_FL | + OCFS2_BARRIER_FL | OCFS2_NOATIME_FL | + OCFS2_SYNC_FL | OCFS2_DIRSYNC_FL); + + if (IS_APPEND(inode)) + newflags |= OCFS2_APPEND_FL; + if (IS_IMMUTABLE(inode)) + newflags |= OCFS2_IMMUTABLE_FL; + if (IS_IUNLINK(inode)) + newflags |= OCFS2_IUNLINK_FL; + if (IS_BARRIER(inode)) + newflags |= OCFS2_BARRIER_FL; + + /* we do not want to copy superblock flags */ + if (inode->i_flags & S_NOATIME) + newflags |= OCFS2_NOATIME_FL; + if (inode->i_flags & S_SYNC) + newflags |= OCFS2_SYNC_FL; + if (inode->i_flags & S_DIRSYNC) + newflags |= OCFS2_DIRSYNC_FL; + + if (oldflags ^ newflags) + return ocfs2_set_iflags(inode, newflags, OCFS2_FL_MASK); + return 0; +} + struct inode *ocfs2_ilookup_for_vote(struct ocfs2_super *osb, u64 blkno, int delete_vote) --- linux-2.6.18.2/fs/ocfs2/inode.c 2006-06-18 04:54:44 +0200 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/inode.c 2006-09-25 15:40:02 +0200 @@ -218,6 +276,8 @@ int ocfs2_populate_inode(struct inode *i struct super_block *sb; struct ocfs2_super *osb; int status = -EINVAL; + uid_t uid; + gid_t gid; mlog_entry("(0x%p, size:%llu)\n", inode, (unsigned long long)fe->i_size); --- linux-2.6.18.2/fs/ocfs2/inode.c 2006-06-18 04:54:44 +0200 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/inode.c 2006-09-25 15:40:02 +0200 @@ -260,7 +324,6 @@ int ocfs2_populate_inode(struct inode *i inode->i_blocks = ocfs2_align_bytes_to_sectors(le64_to_cpu(fe->i_size)); inode->i_mapping->a_ops = &ocfs2_aops; - inode->i_flags |= S_NOATIME; inode->i_atime.tv_sec = le64_to_cpu(fe->i_atime); inode->i_atime.tv_nsec = le32_to_cpu(fe->i_atime_nsec); inode->i_mtime.tv_sec = le64_to_cpu(fe->i_mtime); --- linux-2.6.18.2/fs/ocfs2/inode.c 2006-06-18 04:54:44 +0200 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/inode.c 2006-09-25 15:40:02 +0200 @@ -276,6 +339,8 @@ int ocfs2_populate_inode(struct inode *i OCFS2_I(inode)->ip_clusters = le32_to_cpu(fe->i_clusters); OCFS2_I(inode)->ip_orphaned_slot = OCFS2_INVALID_SLOT; + OCFS2_I(inode)->ip_flags &= ~OCFS2_FL_MASK; + OCFS2_I(inode)->ip_flags |= le32_to_cpu(fe->i_flags) & OCFS2_FL_MASK; if (create_ino) inode->i_ino = ino_from_blkno(inode->i_sb, --- linux-2.6.18.2/fs/ocfs2/inode.c 2006-06-18 04:54:44 +0200 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/inode.c 2006-09-25 15:40:02 +0200 @@ -329,7 +394,8 @@ int ocfs2_populate_inode(struct inode *i OCFS2_LOCK_TYPE_META, inode); ocfs2_inode_lock_res_init(&OCFS2_I(inode)->ip_data_lockres, OCFS2_LOCK_TYPE_DATA, inode); - + ocfs2_set_inode_flags(inode); + inode->i_flags |= S_NOATIME; status = 0; bail: mlog_exit(status); --- linux-2.6.18.2/fs/ocfs2/inode.c 2006-06-18 04:54:44 +0200 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/inode.c 2006-09-25 15:40:02 +0200 @@ -1165,6 +1236,8 @@ void ocfs2_refresh_inode(struct inode *i struct ocfs2_dinode *fe) { struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); + uid_t uid; + gid_t gid; spin_lock(&OCFS2_I(inode)->ip_lock); --- linux-2.6.18.2/fs/ocfs2/ioctl.c 1970-01-01 01:00:00 +0100 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/ioctl.c 2006-09-25 15:40:02 +0200 @@ -0,0 +1,166 @@ +/* + * linux/fs/ocfs2/ioctl.c + * + * Copyright (C) 2006 Herbert Poetzl + * adapted from Remy Card's ext2/ioctl.c + */ + +#include +#include + +#define MLOG_MASK_PREFIX ML_INODE +#include + +#include "ocfs2.h" +#include "alloc.h" +#include "dlmglue.h" +#include "inode.h" +#include "journal.h" + +#include "ocfs2_fs.h" +#include + + +static struct { + long ocfs2_flag; + long ext2_flag; +} ocfs2_map[] = { + {OCFS2_NOATIME_FL, EXT2_NOATIME_FL}, + {OCFS2_DIRSYNC_FL, EXT2_DIRSYNC_FL}, + {OCFS2_SYNC_FL, EXT2_SYNC_FL}, + {OCFS2_SECRM_FL, EXT2_SECRM_FL}, + {OCFS2_UNRM_FL, EXT2_UNRM_FL}, + {OCFS2_APPEND_FL, EXT2_APPEND_FL}, + {OCFS2_IMMUTABLE_FL, EXT2_IMMUTABLE_FL}, + {0, 0}, +}; + +static long ocfs2_map_ext2(unsigned long flags, int from) +{ + int index=0; + long mapped=0; + + while (ocfs2_map[index].ocfs2_flag) { + if (from) { + if (ocfs2_map[index].ext2_flag & flags) + mapped |= ocfs2_map[index].ocfs2_flag; + } else { + if (ocfs2_map[index].ocfs2_flag & flags) + mapped |= ocfs2_map[index].ext2_flag; + } + index++; + } + return mapped; +} + + +int ocfs2_get_iflags(struct inode *inode, unsigned *flags) +{ + int status; + + status = ocfs2_meta_lock(inode, NULL, NULL, 0); + if (status < 0) { + mlog_errno(status); + return status; + } + *flags = OCFS2_I(inode)->ip_flags; + ocfs2_meta_unlock(inode, 0); + + mlog_exit(status); + return status; +} + +int ocfs2_set_iflags(struct inode *inode, unsigned flags, unsigned mask) +{ + struct ocfs2_inode_info *ocfs2_inode = OCFS2_I(inode); + struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); + struct ocfs2_journal_handle *handle = NULL; + struct buffer_head *bh = NULL; + unsigned oldflags; + int status; + + status = ocfs2_meta_lock(inode, NULL, &bh, 1); + if (status < 0) { + mlog_errno(status); + goto bail; + } + + status = -EROFS; + if (IS_RDONLY(inode)) + goto bail_unlock; + + status = -EACCES; + if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER)) + goto bail_unlock; + + if (!S_ISDIR(inode->i_mode)) + flags &= ~OCFS2_DIRSYNC_FL; + + handle = ocfs2_start_trans(osb, NULL, OCFS2_INODE_UPDATE_CREDITS); + if (IS_ERR(handle)) { + status = PTR_ERR(handle); + mlog_errno(status); + goto bail_unlock; + } + + oldflags = ocfs2_inode->ip_flags; + flags = flags & mask; + flags |= oldflags & ~mask; + + /* + * The IMMUTABLE and APPEND_ONLY flags can only be changed by + * the relevant capability. + */ + status = -EPERM; + if ((oldflags & OCFS2_IMMUTABLE_FL) || ((flags ^ oldflags) & + (OCFS2_APPEND_FL | OCFS2_IMMUTABLE_FL))) { + if (!capable(CAP_LINUX_IMMUTABLE)) + goto bail_unlock; + } + + ocfs2_inode->ip_flags = flags; + ocfs2_set_inode_flags(inode); + + status = ocfs2_mark_inode_dirty(handle, inode, bh); + if (status < 0) + mlog_errno(status); + + ocfs2_commit_trans(handle); +bail_unlock: + ocfs2_meta_unlock(inode, 1); +bail: + if (bh) + brelse(bh); + + mlog_exit(status); + return status; +} + + +int ocfs2_ioctl(struct inode * inode, struct file * filp, + unsigned int cmd, unsigned long arg) +{ + unsigned int flags; + int status; + + switch (cmd) { + case OCFS2_IOC_GETFLAGS: + status = ocfs2_get_iflags(inode, &flags); + if (status < 0) + return status; + + flags &= OCFS2_FL_VISIBLE; + flags = ocfs2_map_ext2(flags, 0); + return put_user(flags, (int __user *) arg); + case OCFS2_IOC_SETFLAGS: + if (get_user(flags, (int __user *) arg)) + return -EFAULT; + + flags = ocfs2_map_ext2(flags, 1); + return ocfs2_set_iflags(inode, flags, + OCFS2_FL_MODIFIABLE); + default: + return -ENOTTY; + } +} + --- linux-2.6.18.2/fs/ocfs2/ioctl.h 1970-01-01 01:00:00 +0100 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/ioctl.h 2006-09-25 15:40:02 +0200 @@ -0,0 +1,17 @@ +/* + * ioctl.h + * + * Function prototypes + * + * Copyright (C) 2006 Herbert Poetzl + * + */ + +#ifndef OCFS2_IOCTL_H +#define OCFS2_IOCTL_H + +int ocfs2_set_iflags(struct inode *inode, unsigned flags, unsigned mask); +int ocfs2_ioctl(struct inode * inode, struct file * filp, + unsigned int cmd, unsigned long arg); + +#endif /* OCFS2_IOCTL_H */ --- linux-2.6.18.2/fs/ocfs2/namei.c 2006-06-18 04:54:44 +0200 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/namei.c 2006-09-25 15:40:02 +0200 @@ -469,6 +470,9 @@ static int ocfs2_mknod_locked(struct ocf u64 fe_blkno = 0; u16 suballoc_bit; struct inode *inode = NULL; + uid_t uid; + gid_t gid; + tag_t tag; mlog_entry("(0x%p, 0x%p, %d, %lu, '%.*s')\n", dir, dentry, mode, (unsigned long)dev, dentry->d_name.len, --- linux-2.6.18.2/fs/ocfs2/namei.c 2006-06-18 04:54:44 +0200 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/namei.c 2006-09-25 15:40:02 +0200 @@ -528,9 +532,11 @@ static int ocfs2_mknod_locked(struct ocf fe->i_blkno = cpu_to_le64(fe_blkno); fe->i_suballoc_bit = cpu_to_le16(suballoc_bit); fe->i_suballoc_slot = cpu_to_le16(osb->slot_num); - fe->i_uid = cpu_to_le32(current->fsuid); + + tag = dx_current_fstag(osb->sb); + uid = current->fsuid; if (dir->i_mode & S_ISGID) { - fe->i_gid = cpu_to_le32(dir->i_gid); + gid = dir->i_gid; if (S_ISDIR(mode)) mode |= S_ISGID; } else --- linux-2.6.18.2/fs/ocfs2/ocfs2.h 2006-09-20 16:58:35 +0200 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/ocfs2.h 2006-09-25 15:40:02 +0200 @@ -174,6 +174,7 @@ enum ocfs2_mount_options OCFS2_MOUNT_NOINTR = 1 << 2, /* Don't catch signals */ OCFS2_MOUNT_ERRORS_PANIC = 1 << 3, /* Panic on errors */ OCFS2_MOUNT_DATA_WRITEBACK = 1 << 4, /* No data ordering */ + OCFS2_MOUNT_TAGGED = 1 << 8, /* use tagging */ }; #define OCFS2_OSB_SOFT_RO 0x0001 --- linux-2.6.18.2/fs/ocfs2/ocfs2_fs.h 2006-04-09 13:49:54 +0200 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/ocfs2_fs.h 2006-09-25 15:40:02 +0200 @@ -114,6 +114,30 @@ #define OCFS2_CHAIN_FL (0x00000400) /* Chain allocator */ #define OCFS2_DEALLOC_FL (0x00000800) /* Truncate log */ +/* Inode attributes */ +#define OCFS2_SECRM_FL (0x00010000) /* Secure deletion */ +#define OCFS2_UNRM_FL (0x00020000) /* Undelete */ +#define OCFS2_COMPR_FL (0x00040000) /* Compress file */ +#define OCFS2_SYNC_FL (0x00080000) /* Synchronous updates */ +#define OCFS2_IMMUTABLE_FL (0x00100000) /* Immutable file */ +#define OCFS2_APPEND_FL (0x00200000) /* writes to file may only append */ +#define OCFS2_NODUMP_FL (0x00400000) /* do not dump file */ +#define OCFS2_NOATIME_FL (0x00800000) /* do not update atime */ +#define OCFS2_DIRSYNC_FL (0x01000000) /* dirsync behaviour (directories only) */ + +#define OCFS2_BARRIER_FL (0x04000000) /* Barrier for chroot() */ +#define OCFS2_IUNLINK_FL (0x08000000) /* Immutable unlink */ + +#define OCFS2_FL_VISIBLE (0x01FF0000) /* User visible flags */ +#define OCFS2_FL_MODIFIABLE (0x01FF0000) /* User modifiable flags */ +#define OCFS2_FL_MASK (0x0FFF0000) /* ext2 flag mask */ + +/* + * ioctl commands + */ +#define OCFS2_IOC_GETFLAGS _IOR('f', 1, long) +#define OCFS2_IOC_SETFLAGS _IOW('f', 2, long) + /* * Journal Flags (ocfs2_dinode.id1.journal1.i_flags) */ --- linux-2.6.18.2/fs/ocfs2/super.c 2006-09-20 16:58:35 +0200 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/super.c 2006-09-25 17:31:09 +0200 @@ -154,6 +155,10 @@ static match_table_t tokens = { {Opt_hb_local, OCFS2_HB_LOCAL}, {Opt_data_ordered, "data=ordered"}, {Opt_data_writeback, "data=writeback"}, + {Opt_tag, "tag"}, + {Opt_tag, "tagxid"}, + {Opt_notag, "notag"}, + {Opt_tagid, "tagid=%u"}, {Opt_err, NULL} }; --- linux-2.6.18.2/fs/ocfs2/super.c 2006-09-20 16:58:35 +0200 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/super.c 2006-09-25 17:31:09 +0200 @@ -362,6 +367,14 @@ static int ocfs2_remount(struct super_bl goto out; } + printk("ocfs2_remount: %lx,%lx\n", osb->s_mount_opt, sb->s_flags); + if ((parsed_options & OCFS2_MOUNT_TAGGED) && + !(sb->s_flags & MS_TAGGED)) { + ret = -EINVAL; + mlog(ML_ERROR, "Cannot change tagging on remount\n"); + goto out; + } + if ((osb->s_mount_opt & OCFS2_MOUNT_HB_LOCAL) != (parsed_options & OCFS2_MOUNT_HB_LOCAL)) { ret = -EINVAL; --- linux-2.6.18.2/fs/ocfs2/super.c 2006-09-20 16:58:35 +0200 +++ linux-2.6.18.2-vs2.1.1/fs/ocfs2/super.c 2006-09-25 17:31:09 +0200 @@ -635,6 +648,9 @@ static int ocfs2_fill_super(struct super ocfs2_complete_mount_recovery(osb); + if (osb->s_mount_opt & OCFS2_MOUNT_TAGGED) + sb->s_flags |= MS_TAGGED; + printk(KERN_INFO "ocfs2: Mounting device (%s) on (node %d, slot %d) " "with %s data mode.\n", osb->dev_str, osb->node_num, osb->slot_num,