Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3e59ddff authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mfasheh/ocfs2:
  ocfs2: Remove overzealous BUG_ON()
  ocfs2: Don't print on unknown remote blocking call
  ocfs2: Remove EXPERIMENTAL dependency
  ocfs2: implement directory read-ahead
  ocfs2: properly update i_mtime on buffered write
  ocfs2: Fix directory link count checks in ocfs2_link()
  ocfs2: move nlink check in ocfs2_mknod()
  ocfs2: Fix heartbeat sector calculation
  [PATCH] fs/ocfs2/ioctl.c should #include "ioctl.h"
  ocfs2: add ext2 attributes
  configfs: Prevent duplicate subsystem names.
parents 6bbd9b6d eb35746c
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -325,8 +325,8 @@ config FS_POSIX_ACL
source "fs/xfs/Kconfig"

config OCFS2_FS
	tristate "OCFS2 file system support (EXPERIMENTAL)"
	depends on NET && SYSFS && EXPERIMENTAL
	tristate "OCFS2 file system support"
	depends on NET && SYSFS
	select CONFIGFS_FS
	select JBD
	select CRC32
+30 −2
Original line number Diff line number Diff line
@@ -86,6 +86,32 @@ static struct configfs_dirent *configfs_new_dirent(struct configfs_dirent * pare
	return sd;
}

/*
 *
 * Return -EEXIST if there is already a configfs element with the same
 * name for the same parent.
 *
 * called with parent inode's i_mutex held
 */
int configfs_dirent_exists(struct configfs_dirent *parent_sd,
			   const unsigned char *new)
{
	struct configfs_dirent * sd;

	list_for_each_entry(sd, &parent_sd->s_children, s_sibling) {
		if (sd->s_element) {
			const unsigned char *existing = configfs_get_name(sd);
			if (strcmp(existing, new))
				continue;
			else
				return -EEXIST;
		}
	}

	return 0;
}


int configfs_make_dirent(struct configfs_dirent * parent_sd,
			 struct dentry * dentry, void * element,
			 umode_t mode, int type)
@@ -136,6 +162,8 @@ static int create_dir(struct config_item * k, struct dentry * p,
	int error;
	umode_t mode = S_IFDIR| S_IRWXU | S_IRUGO | S_IXUGO;

	error = configfs_dirent_exists(p->d_fsdata, d->d_name.name);
	if (!error)
		error = configfs_make_dirent(p->d_fsdata, d, k, mode,
					     CONFIGFS_DIR);
	if (!error) {
+1 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ ocfs2-objs := \
	file.o 			\
	heartbeat.o 		\
	inode.o 		\
	ioctl.o 		\
	journal.o 		\
	localalloc.o 		\
	mmap.o 			\
+20 −8
Original line number Diff line number Diff line
@@ -1717,10 +1717,21 @@ static int ocfs2_do_truncate(struct ocfs2_super *osb,

			ocfs2_remove_from_cache(inode, eb_bh);

			BUG_ON(eb->h_suballoc_slot);
			BUG_ON(el->l_recs[0].e_clusters);
			BUG_ON(el->l_recs[0].e_cpos);
			BUG_ON(el->l_recs[0].e_blkno);
			if (eb->h_suballoc_slot == 0) {
				/*
				 * This code only understands how to
				 * lock the suballocator in slot 0,
				 * which is fine because allocation is
				 * only ever done out of that
				 * suballocator too. A future version
				 * might change that however, so avoid
				 * a free if we don't know how to
				 * handle it. This way an fs incompat
				 * bit will not be necessary.
				 */
				status = ocfs2_free_extent_block(handle,
								 tc->tc_ext_alloc_inode,
								 tc->tc_ext_alloc_bh,
@@ -1730,6 +1741,7 @@ static int ocfs2_do_truncate(struct ocfs2_super *osb,
					goto bail;
				}
			}
		}
		brelse(eb_bh);
		eb_bh = NULL;
		depth--;
+34 −49
Original line number Diff line number Diff line
@@ -391,31 +391,28 @@ out:
static int ocfs2_commit_write(struct file *file, struct page *page,
			      unsigned from, unsigned to)
{
	int ret, extending = 0, locklevel = 0;
	loff_t new_i_size;
	int ret;
	struct buffer_head *di_bh = NULL;
	struct inode *inode = page->mapping->host;
	struct ocfs2_journal_handle *handle = NULL;
	struct ocfs2_dinode *di;

	mlog_entry("(0x%p, 0x%p, %u, %u)\n", file, page, from, to);

	/* NOTE: ocfs2_file_aio_write has ensured that it's safe for
	 * us to sample inode->i_size here without the metadata lock:
	 * us to continue here without rechecking the I/O against
	 * changed inode values.
	 *
	 * 1) We're currently holding the inode alloc lock, so no
	 *    nodes can change it underneath us.
	 *
	 * 2) We've had to take the metadata lock at least once
	 *    already to check for extending writes, hence insuring
	 *    that our current copy is also up to date.
	 *    already to check for extending writes, suid removal, etc.
	 *    The meta data update code then ensures that we don't get a
	 *    stale inode allocation image (i_size, i_clusters, etc).
	 */
	new_i_size = ((loff_t)page->index << PAGE_CACHE_SHIFT) + to;
	if (new_i_size > i_size_read(inode)) {
		extending = 1;
		locklevel = 1;
	}

	ret = ocfs2_meta_lock_with_page(inode, NULL, &di_bh, locklevel, page);
	ret = ocfs2_meta_lock_with_page(inode, NULL, &di_bh, 1, page);
	if (ret != 0) {
		mlog_errno(ret);
		goto out;
@@ -427,11 +424,9 @@ static int ocfs2_commit_write(struct file *file, struct page *page,
		goto out_unlock_meta;
	}

	if (extending) {
	handle = ocfs2_start_walk_page_trans(inode, page, from, to);
	if (IS_ERR(handle)) {
		ret = PTR_ERR(handle);
			handle = NULL;
		goto out_unlock_data;
	}

@@ -444,7 +439,6 @@ static int ocfs2_commit_write(struct file *file, struct page *page,
		mlog_errno(ret);
		goto out_commit;
	}
	}

	/* might update i_size */
	ret = generic_commit_write(file, page, from, to);
@@ -453,37 +447,28 @@ static int ocfs2_commit_write(struct file *file, struct page *page,
		goto out_commit;
	}

	if (extending) {
		loff_t size = (u64) i_size_read(inode);
		struct ocfs2_dinode *di =
			(struct ocfs2_dinode *)di_bh->b_data;
	di = (struct ocfs2_dinode *)di_bh->b_data;

		/* ocfs2_mark_inode_dirty is too heavy to use here. */
		inode->i_blocks = ocfs2_align_bytes_to_sectors(size);
		inode->i_ctime = inode->i_mtime = CURRENT_TIME;
	/* ocfs2_mark_inode_dirty() is too heavy to use here. */
	inode->i_mtime = inode->i_ctime = CURRENT_TIME;
	di->i_mtime = di->i_ctime = cpu_to_le64(inode->i_mtime.tv_sec);
	di->i_mtime_nsec = di->i_ctime_nsec = cpu_to_le32(inode->i_mtime.tv_nsec);

		di->i_size = cpu_to_le64(size);
		di->i_ctime = di->i_mtime = 
				cpu_to_le64(inode->i_mtime.tv_sec);
		di->i_ctime_nsec = di->i_mtime_nsec = 
				cpu_to_le32(inode->i_mtime.tv_nsec);
	inode->i_blocks = ocfs2_align_bytes_to_sectors((u64)(i_size_read(inode)));
	di->i_size = cpu_to_le64((u64)i_size_read(inode));

	ret = ocfs2_journal_dirty(handle, di_bh);
	if (ret < 0) {
		mlog_errno(ret);
		goto out_commit;
	}
	}

	BUG_ON(extending && (i_size_read(inode) != new_i_size));

out_commit:
	if (handle)
	ocfs2_commit_trans(handle);
out_unlock_data:
	ocfs2_data_unlock(inode, 1);
out_unlock_meta:
	ocfs2_meta_unlock(inode, locklevel);
	ocfs2_meta_unlock(inode, 1);
out:
	if (di_bh)
		brelse(di_bh);
Loading