[Ocfs2-devel] [PATCH]2.6 fixes in inode.c

Rusty Lynch rusty at linux.co.intel.com
Wed Feb 25 07:41:41 CST 2004


The following patch fixes some more 2.6 issues that come out of
porting inode.c

* In 2.6, direct-io is accomplished by just providing a direct_IO
  mechanism in the address_space_operations.  This means there is
  no need to treat direct IO differently in read/write operations.
* There were a couple of more timespec related bumps
* A typo in 2.6 code for handling inode devices
* Several more 2.6 prototype variants that cause compiler
  errors/warnings
* Small changes in the inode structure


diff -urN ocfs2/src/file.c ocfs2_patched/src/file.c
--- ocfs2/src/file.c	2004-02-25 07:23:54.000000000 -0800
+++ ocfs2_patched/src/file.c	2004-02-25 07:25:34.000000000 -0800
@@ -761,11 +761,19 @@
 		}
 	}
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+	/* 
+	 * On a 2.6 kernel, all a filesystem needs to do to support
+	 * direct-io is pass in method for getting blocks via the
+	 * address_space_operations struct
+	 */
+	ret = generic_file_write (filp, buf, count, ppos);
+#else
 	if (filp->f_flags & O_DIRECT)
 		ret = ocfs_rw_direct (WRITE, filp, (char *) buf, count, ppos);
 	else
 		ret = generic_file_write (filp, buf, count, ppos);
-
+#endif
 	if (writingAtEOF) {
 		LOG_TRACE_STR
 		    ("Generic_file_write ok, asking for OIN update now");
@@ -846,11 +854,19 @@
 		}
 	}
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+	/* 
+	 * On a 2.6 kernel, all a filesystem needs to do to support
+	 * direct-io is pass in method for getting blocks via the
+	 * address_space_operations struct
+	 */
+	ret = generic_file_read (filp, buf, count, ppos);
+#else
 	if (filp->f_flags & O_DIRECT)
 		ret = ocfs_rw_direct (READ, filp, buf, count, ppos);
 	else
 		ret = generic_file_read (filp, buf, count, ppos);
-
+#endif
 	if (ret == -EINVAL)
 		LOG_TRACE_STR ("Generic_file_read returned -EINVAL");
 
diff -urN ocfs2/src/inc/ocfs.h ocfs2_patched/src/inc/ocfs.h
--- ocfs2/src/inc/ocfs.h	2004-02-25 07:23:57.000000000 -0800
+++ ocfs2_patched/src/inc/ocfs.h	2004-02-25 07:25:34.000000000 -0800
@@ -206,7 +206,7 @@
 		*t += (__u64)(CURRENT_TIME.tv_nsec) / (__u64) 100;	      \
 	} while (0)
 #define OCFS_CURRENT_TIME   (CURRENT_TIME.tv_sec)
-#define OCFS_SET_INODE_TIME(i, x, y)   i->##x.tv_sec = (y)
+#define OCFS_SET_INODE_TIME(i, x, y)   (i->x.tv_sec = (y))
 #else
 /* time is in 0.1 microsecs */
 #define OcfsQuerySystemTime(t)                                                \
@@ -1134,7 +1134,7 @@
 
 /* Operates on a struct super_block * */
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-#define OCFS_SET_INODE_DEV(sb, inode)   (inode->i_rdev = sb->sdev)
+#define OCFS_SET_INODE_DEV(sb, inode)   (inode->i_rdev = sb->s_dev)
 typedef struct block_device * ocfs_blockdev;
 typedef dev_t ocfs_dev;
 #define OCFS_NODEV     0
diff -urN ocfs2/src/inc/proto.h ocfs2_patched/src/inc/proto.h
--- ocfs2/src/inc/proto.h	2004-02-25 07:23:57.000000000 -0800
+++ ocfs2_patched/src/inc/proto.h	2004-02-25 07:25:34.000000000 -0800
@@ -244,12 +244,19 @@
 int ocfs_empty (struct dentry *dentry);
 int ocfs_dentry_revalidate (struct dentry *dentry, int flags);
 int ocfs_foreach_child (struct dentry *dentry, int (*func)(struct dentry *, void *), void *data);
-
 int ocfs_readdir (struct file *filp, void *dirent, filldir_t filldir);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+struct dentry *ocfs_lookup (struct inode *dir, struct dentry *dentry, struct nameidata *nd);
+#else
 struct dentry *ocfs_lookup (struct inode *dir, struct dentry *dentry);
+#endif
 int ocfs_mknod (struct inode *dir, struct dentry *dentry, int mode, ocfs_dev dev);
 int ocfs_mkdir (struct inode *dir, struct dentry *dentry, int mode);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+int ocfs_create (struct inode *dir, struct dentry *dentry, int mode, struct nameidata *nd);
+#else
 int ocfs_create (struct inode *dir, struct dentry *dentry, int mode);
+#endif
 int ocfs_link (struct dentry *old_dentry, struct inode *dir, struct dentry *dentry);
 int ocfs_unlink (struct inode *dir, struct dentry *dentry);
 int ocfs_rename (struct inode *old_dir, struct dentry *old_dentry, struct inode *new_dir, struct dentry *new_dentry);
diff -urN ocfs2/src/inode.c ocfs2_patched/src/inode.c
--- ocfs2/src/inode.c	2004-02-25 07:23:50.000000000 -0800
+++ ocfs2_patched/src/inode.c	2004-02-25 07:25:34.000000000 -0800
@@ -30,25 +30,26 @@
 
 
 static int ocfs_readpage (struct file *file, struct page *page);
-static int ocfs_writepage (struct page *page);
 static int ocfs_prepare_write (struct file *file, struct page *page, unsigned from, unsigned to);
 static int ocfs_commit_write (struct file *file, struct page *page, unsigned from, unsigned to);
 static int ocfs_get_block (struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create);
-static int ocfs_get_block2 (struct inode *inode, long iblock, long *oblock, int len);
 static int ocfs_extend_allocation(ocfs_super *osb, ocfs_inode *oin, __u64 newsize, bool unlock, struct inode *inode);
 static int ocfs_symlink_get_block (struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create);
-static int ocfs_bmap(struct address_space *mapping, long block);
-
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+static sector_t ocfs_bmap(struct address_space *mapping, sector_t block);
+static int ocfs_writepage (struct page *page, struct writeback_control *wbc);
 static int ocfs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, loff_t offset, unsigned long nr_segs);
-#elif LINUX_VERSION_CODE >= LinuxVersionCode(2,4,10)
-#if LINUX_VERSION_CODE >= LinuxVersionCode(2,4,20) || defined(SUSE)
+#else /* 2.4 kernel */
+static int ocfs_bmap(struct address_space *mapping, long block);
+static int ocfs_writepage (struct page *page);
+static int ocfs_get_block2 (struct inode *inode, long iblock, long *oblock, int len);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20) || defined(SUSE)
 static int ocfs_direct_IO (int rw, struct file *filp, struct kiobuf *iobuf, unsigned long blocknr, int blocksize);
 #else
 static int ocfs_direct_IO (int rw, struct inode *inode, struct kiobuf *iobuf, unsigned long blocknr, int blocksize);
 #endif
-#endif  /* version >= 2.4.10 */
+#endif
 
 #ifdef AIO_ENABLED
 int ocfs_kvec_read(struct file *file, kvec_cb_t cb, size_t size, loff_t pos); 
@@ -65,9 +66,10 @@
 	.commit_write = ocfs_commit_write,
 #if LINUX_VERSION_CODE >= LinuxVersionCode(2,4,10)
 /*
-* we are only adding this here as a dummy basically, just need open with O_DIRECT
-* to succeed, we still call ocfs_rw_direct()
-*/
+ * On a 2.4 system, we are only adding this here as a dummy basically, 
+ * just need open with O_DIRECT to succeed, we still call ocfs_rw_direct().
+ * For a 2.6 system, this is the way a filesystem provides direct-io support. 
+ */
 	.direct_IO = ocfs_direct_IO
 #endif
 };
@@ -256,7 +258,9 @@
 	inode->i_blksize = (__u32) osb->vol_layout.cluster_size;	// sb->s_blocksize;
 	inode->i_blocks = (fe->file_size + sb->s_blocksize) >> sb->s_blocksize_bits;
 	inode->i_mapping->a_ops = &ocfs_aops;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
 	inode->i_attr_flags |= ATTR_FLAG_NOATIME;
+#endif
 	inode->i_flags |= S_NOATIME;
 	OCFS_SET_INODE_TIME(inode, i_atime, fe->modify_time);
 	OCFS_SET_INODE_TIME(inode, i_mtime, fe->modify_time);
@@ -298,11 +302,7 @@
 		    inode->i_size = fe->file_size;
 		    break;
 	    default:
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-		    init_special_inode (inode, mode, inode->i_rdev.value);
-#else
 		    init_special_inode (inode, mode, inode->i_rdev);
-#endif
 		    break;
 	}
 
@@ -317,8 +317,7 @@
  * by this point, i_sb, i_dev, i_ino are filled in
  *
  */
-static void ocfs_read_locked_inode (struct inode *inode, 
-				    ocfs_file_entry *entry)
+void ocfs_read_locked_inode (struct inode *inode, ocfs_file_entry *entry)
 {
 	struct super_block *sb;
 	ocfs_super *osb;
@@ -341,10 +340,9 @@
 		inode->i_blkbits = 9;
 		inode->i_blocks = 0;
 		inode->i_mapping->a_ops = &ocfs_aops;
-		inode->i_atime = OCFS_CURRENT_TIME;
-		inode->i_mtime = OCFS_CURRENT_TIME;
-		inode->i_ctime = OCFS_CURRENT_TIME;
-		inode->i_attr_flags |= ATTR_FLAG_NOATIME;
+		inode->i_atime = CURRENT_TIME;
+		inode->i_mtime = CURRENT_TIME;
+		inode->i_ctime = CURRENT_TIME;
 		inode->i_flags |= S_NOATIME;
 		inode->i_op = &ocfs_dir_iops;
 		inode->i_fop = &ocfs_dops;
@@ -372,11 +370,11 @@
 		    mode |= S_IFDIR;
 		    break;
 	    case OCFS_ATTRIB_CHAR:
-		    inode->i_rdev = mk_kdev (entry->dev_major, entry->dev_minor);
+		    inode->i_rdev = MKDEV (entry->dev_major, entry->dev_minor);
 		    mode |= S_IFCHR;
 		    break;
 	    case OCFS_ATTRIB_BLOCK:
-		    inode->i_rdev = mk_kdev (entry->dev_major, entry->dev_minor);
+		    inode->i_rdev = MKDEV (entry->dev_major, entry->dev_minor);
 		    mode |= S_IFBLK;
 		    break;
 	    case OCFS_ATTRIB_FIFO:
@@ -637,7 +635,7 @@
 			fe = OCFS_BH_GET_DATA_READ(args->fe_bh); /* read */
 		ocfs_read_locked_inode(inode, fe);
 		if (args)
-			OCFS_BH_PUT_DATA(fe_bh);
+			OCFS_BH_PUT_DATA(args->fe_bh);
 		unlock_new_inode(inode);
 	}
 
@@ -1033,7 +1031,11 @@
 	return err;
 }				/* ocfs_get_block */
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+static sector_t ocfs_bmap(struct address_space *mapping, sector_t block) 
+#else
 static int ocfs_bmap(struct address_space *mapping, long block) 
+#endif
 {
 	int disk_block = 0;
 	ocfs_super *osb =(ocfs_super *) OCFS_GENERIC_SB_P(mapping->host->i_sb);
@@ -1260,7 +1262,7 @@
 	if (create && vbo_max > oin->alloc_size) {
 		/* WARNING: How much do we really want to extend the file? 
 		   is 'false' the right argument there? */
-		status = ocfs_extend_allocation(osb, oin, vbo_max, false);
+		status = ocfs_extend_allocation(osb, oin, vbo_max, false, inode);
 		if (status < 0) {
 			LOG_ERROR_STR("ocfs_direct_IO_get_blocks: failed to extend the file!");
 			goto bail;
@@ -1271,7 +1273,7 @@
 	/* This figure out the size of the next contiguous block, and
 	 * our logical offset */	
 	/* TODO: Try our damndest to give sizes in multiples of PAGE_SIZE */
-	status = ocfs_lookup_file_allocation(osb, oin, vbo, &lbo, max_blocks, &new_size);
+	status = ocfs_lookup_file_allocation(osb, oin, vbo, &lbo, max_blocks, &new_size, inode);
 
 	/* Do whatever we need to the buffer_head */
 	if (set_new) {
@@ -1318,7 +1320,7 @@
 	LOG_ENTRY ();
 
 	/* blockdev_direct_IO checks alignment for us, using */
-	ret = blockdev_direct_IO (rw, iocb, inode, inode->i_sb->s_bdev, iov, offset, nr_segs, ocfs_direct_IO_get_blocks);
+	ret = blockdev_direct_IO (rw, iocb, inode, inode->i_sb->s_bdev, iov, offset, nr_segs, ocfs_direct_IO_get_blocks, NULL);
 
 	LOG_EXIT_LONG (ret);
 	return ret;
@@ -1354,6 +1356,7 @@
 #endif
 
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
 /*
  * ocfs_rw_direct()
  *
@@ -1616,8 +1619,7 @@
 #endif
 	return err;
 }				/* ocfs_rw_direct */
-
-
+#endif /* 2.4.x kernel */
 
 #ifdef AIO_ENABLED
 int ocfs_kvec_read(struct file *file, kvec_cb_t cb, size_t size, loff_t pos) 


More information about the Ocfs2-devel mailing list