Commit 2596627c authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mfasheh/ocfs2

* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mfasheh/ocfs2:
  ocfs2: Add backup superblock info to ocfs2_fs.h
  ocfs2: cleanup ocfs2_iget() errors
  ocfs2: Directory c/mtime update fixes
  ocfs2: Don't print errors when following symlinks
parents 19e805cb 50af94b1
...@@ -60,14 +60,11 @@ static struct dentry *ocfs2_get_dentry(struct super_block *sb, void *vobjp) ...@@ -60,14 +60,11 @@ static struct dentry *ocfs2_get_dentry(struct super_block *sb, void *vobjp)
inode = ocfs2_iget(OCFS2_SB(sb), handle->ih_blkno, 0); inode = ocfs2_iget(OCFS2_SB(sb), handle->ih_blkno, 0);
if (IS_ERR(inode)) { if (IS_ERR(inode))
mlog_errno(PTR_ERR(inode));
return (void *)inode; return (void *)inode;
}
if (handle->ih_generation != inode->i_generation) { if (handle->ih_generation != inode->i_generation) {
iput(inode); iput(inode);
mlog_errno(-ESTALE);
return ERR_PTR(-ESTALE); return ERR_PTR(-ESTALE);
} }
......
...@@ -146,7 +146,6 @@ struct inode *ocfs2_iget(struct ocfs2_super *osb, u64 blkno, int flags) ...@@ -146,7 +146,6 @@ struct inode *ocfs2_iget(struct ocfs2_super *osb, u64 blkno, int flags)
if (is_bad_inode(inode)) { if (is_bad_inode(inode)) {
iput(inode); iput(inode);
inode = ERR_PTR(-ESTALE); inode = ERR_PTR(-ESTALE);
mlog_errno(PTR_ERR(inode));
goto bail; goto bail;
} }
...@@ -155,8 +154,7 @@ bail: ...@@ -155,8 +154,7 @@ bail:
mlog(0, "returning inode with number %llu\n", mlog(0, "returning inode with number %llu\n",
(unsigned long long)OCFS2_I(inode)->ip_blkno); (unsigned long long)OCFS2_I(inode)->ip_blkno);
mlog_exit_ptr(inode); mlog_exit_ptr(inode);
} else }
mlog_errno(PTR_ERR(inode));
return inode; return inode;
} }
...@@ -247,7 +245,7 @@ int ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe, ...@@ -247,7 +245,7 @@ int ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe,
* today. change if needed. */ * today. change if needed. */
if (!OCFS2_IS_VALID_DINODE(fe) || if (!OCFS2_IS_VALID_DINODE(fe) ||
!(fe->i_flags & cpu_to_le32(OCFS2_VALID_FL))) { !(fe->i_flags & cpu_to_le32(OCFS2_VALID_FL))) {
mlog(ML_ERROR, "Invalid dinode: i_ino=%lu, i_blkno=%llu, " mlog(0, "Invalid dinode: i_ino=%lu, i_blkno=%llu, "
"signature = %.*s, flags = 0x%x\n", "signature = %.*s, flags = 0x%x\n",
inode->i_ino, inode->i_ino,
(unsigned long long)le64_to_cpu(fe->i_blkno), 7, (unsigned long long)le64_to_cpu(fe->i_blkno), 7,
...@@ -478,11 +476,8 @@ static int ocfs2_read_locked_inode(struct inode *inode, ...@@ -478,11 +476,8 @@ static int ocfs2_read_locked_inode(struct inode *inode,
S_ISBLK(le16_to_cpu(fe->i_mode))) S_ISBLK(le16_to_cpu(fe->i_mode)))
inode->i_rdev = huge_decode_dev(le64_to_cpu(fe->id1.dev1.i_rdev)); inode->i_rdev = huge_decode_dev(le64_to_cpu(fe->id1.dev1.i_rdev));
if (ocfs2_populate_inode(inode, fe, 0) < 0) { if (ocfs2_populate_inode(inode, fe, 0) < 0)
mlog(ML_ERROR, "populate failed! i_blkno=%llu, i_ino=%lu\n",
(unsigned long long)fe->i_blkno, inode->i_ino);
goto bail; goto bail;
}
BUG_ON(args->fi_blkno != le64_to_cpu(fe->i_blkno)); BUG_ON(args->fi_blkno != le64_to_cpu(fe->i_blkno));
......
...@@ -932,15 +932,16 @@ static int ocfs2_unlink(struct inode *dir, ...@@ -932,15 +932,16 @@ static int ocfs2_unlink(struct inode *dir,
goto leave; goto leave;
} }
if (S_ISDIR(inode->i_mode)) { dir->i_ctime = dir->i_mtime = CURRENT_TIME;
if (S_ISDIR(inode->i_mode))
drop_nlink(dir); drop_nlink(dir);
status = ocfs2_mark_inode_dirty(handle, dir,
parent_node_bh); status = ocfs2_mark_inode_dirty(handle, dir, parent_node_bh);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
if (S_ISDIR(inode->i_mode))
inc_nlink(dir); inc_nlink(dir);
} }
}
leave: leave:
if (handle) if (handle)
...@@ -1068,6 +1069,7 @@ static int ocfs2_rename(struct inode *old_dir, ...@@ -1068,6 +1069,7 @@ static int ocfs2_rename(struct inode *old_dir,
char orphan_name[OCFS2_ORPHAN_NAMELEN + 1]; char orphan_name[OCFS2_ORPHAN_NAMELEN + 1];
struct buffer_head *orphan_entry_bh = NULL; struct buffer_head *orphan_entry_bh = NULL;
struct buffer_head *newfe_bh = NULL; struct buffer_head *newfe_bh = NULL;
struct buffer_head *old_inode_bh = NULL;
struct buffer_head *insert_entry_bh = NULL; struct buffer_head *insert_entry_bh = NULL;
struct ocfs2_super *osb = NULL; struct ocfs2_super *osb = NULL;
u64 newfe_blkno; u64 newfe_blkno;
...@@ -1079,7 +1081,7 @@ static int ocfs2_rename(struct inode *old_dir, ...@@ -1079,7 +1081,7 @@ static int ocfs2_rename(struct inode *old_dir,
struct buffer_head *new_de_bh = NULL, *old_de_bh = NULL; // bhs for above struct buffer_head *new_de_bh = NULL, *old_de_bh = NULL; // bhs for above
struct buffer_head *old_inode_de_bh = NULL; // if old_dentry is a dir, struct buffer_head *old_inode_de_bh = NULL; // if old_dentry is a dir,
// this is the 1st dirent bh // this is the 1st dirent bh
nlink_t old_dir_nlink = old_dir->i_nlink, new_dir_nlink = new_dir->i_nlink; nlink_t old_dir_nlink = old_dir->i_nlink;
/* At some point it might be nice to break this function up a /* At some point it might be nice to break this function up a
* bit. */ * bit. */
...@@ -1139,12 +1141,11 @@ static int ocfs2_rename(struct inode *old_dir, ...@@ -1139,12 +1141,11 @@ static int ocfs2_rename(struct inode *old_dir,
} }
/* /*
* Though we don't require an inode meta data update if * Aside from allowing a meta data update, the locking here
* old_inode is not a directory, we lock anyway here to ensure * also ensures that the vote thread on other nodes won't have
* the vote thread on other nodes won't have to concurrently * to concurrently downconvert the inode and the dentry locks.
* downconvert the inode and the dentry locks.
*/ */
status = ocfs2_meta_lock(old_inode, NULL, 1); status = ocfs2_meta_lock(old_inode, &old_inode_bh, 1);
if (status < 0) { if (status < 0) {
if (status != -ENOENT) if (status != -ENOENT)
mlog_errno(status); mlog_errno(status);
...@@ -1355,6 +1356,7 @@ static int ocfs2_rename(struct inode *old_dir, ...@@ -1355,6 +1356,7 @@ static int ocfs2_rename(struct inode *old_dir,
old_inode->i_ctime = CURRENT_TIME; old_inode->i_ctime = CURRENT_TIME;
mark_inode_dirty(old_inode); mark_inode_dirty(old_inode);
ocfs2_mark_inode_dirty(handle, old_inode, old_inode_bh);
/* now that the name has been added to new_dir, remove the old name */ /* now that the name has been added to new_dir, remove the old name */
status = ocfs2_delete_entry(handle, old_dir, old_de, old_de_bh); status = ocfs2_delete_entry(handle, old_dir, old_de, old_de_bh);
...@@ -1384,26 +1386,21 @@ static int ocfs2_rename(struct inode *old_dir, ...@@ -1384,26 +1386,21 @@ static int ocfs2_rename(struct inode *old_dir,
} }
} }
mark_inode_dirty(old_dir); mark_inode_dirty(old_dir);
if (new_inode) ocfs2_mark_inode_dirty(handle, old_dir, old_dir_bh);
if (new_inode) {
mark_inode_dirty(new_inode); mark_inode_dirty(new_inode);
ocfs2_mark_inode_dirty(handle, new_inode, newfe_bh);
if (old_dir != new_dir)
if (new_dir_nlink != new_dir->i_nlink) {
if (!new_dir_bh) {
mlog(ML_ERROR, "need to change nlink for new "
"dir %llu from %d to %d but bh is NULL\n",
(unsigned long long)OCFS2_I(new_dir)->ip_blkno,
(int)new_dir_nlink, new_dir->i_nlink);
} else {
struct ocfs2_dinode *fe;
status = ocfs2_journal_access(handle,
new_dir,
new_dir_bh,
OCFS2_JOURNAL_ACCESS_WRITE);
fe = (struct ocfs2_dinode *) new_dir_bh->b_data;
fe->i_links_count = cpu_to_le16(new_dir->i_nlink);
status = ocfs2_journal_dirty(handle, new_dir_bh);
} }
if (old_dir != new_dir) {
/* Keep the same times on both directories.*/
new_dir->i_ctime = new_dir->i_mtime = old_dir->i_ctime;
/*
* This will also pick up the i_nlink change from the
* block above.
*/
ocfs2_mark_inode_dirty(handle, new_dir, new_dir_bh);
} }
if (old_dir_nlink != old_dir->i_nlink) { if (old_dir_nlink != old_dir->i_nlink) {
...@@ -1455,6 +1452,8 @@ bail: ...@@ -1455,6 +1452,8 @@ bail:
iput(new_inode); iput(new_inode);
if (newfe_bh) if (newfe_bh)
brelse(newfe_bh); brelse(newfe_bh);
if (old_inode_bh)
brelse(old_inode_bh);
if (old_dir_bh) if (old_dir_bh)
brelse(old_dir_bh); brelse(old_dir_bh);
if (new_dir_bh) if (new_dir_bh)
...@@ -1826,6 +1825,13 @@ static int __ocfs2_add_entry(handle_t *handle, ...@@ -1826,6 +1825,13 @@ static int __ocfs2_add_entry(handle_t *handle,
(le16_to_cpu(de->rec_len) >= rec_len)) || (le16_to_cpu(de->rec_len) >= rec_len)) ||
(le16_to_cpu(de->rec_len) >= (le16_to_cpu(de->rec_len) >=
(OCFS2_DIR_REC_LEN(de->name_len) + rec_len))) { (OCFS2_DIR_REC_LEN(de->name_len) + rec_len))) {
dir->i_mtime = dir->i_ctime = CURRENT_TIME;
retval = ocfs2_mark_inode_dirty(handle, dir, parent_fe_bh);
if (retval < 0) {
mlog_errno(retval);
goto bail;
}
status = ocfs2_journal_access(handle, dir, insert_bh, status = ocfs2_journal_access(handle, dir, insert_bh,
OCFS2_JOURNAL_ACCESS_WRITE); OCFS2_JOURNAL_ACCESS_WRITE);
/* By now the buffer is marked for journaling */ /* By now the buffer is marked for journaling */
...@@ -1848,7 +1854,6 @@ static int __ocfs2_add_entry(handle_t *handle, ...@@ -1848,7 +1854,6 @@ static int __ocfs2_add_entry(handle_t *handle,
de->name_len = namelen; de->name_len = namelen;
memcpy(de->name, name, namelen); memcpy(de->name, name, namelen);
dir->i_mtime = dir->i_ctime = CURRENT_TIME;
dir->i_version++; dir->i_version++;
status = ocfs2_journal_dirty(handle, insert_bh); status = ocfs2_journal_dirty(handle, insert_bh);
retval = 0; retval = 0;
......
...@@ -85,7 +85,7 @@ ...@@ -85,7 +85,7 @@
#define OCFS2_CLEAR_INCOMPAT_FEATURE(sb,mask) \ #define OCFS2_CLEAR_INCOMPAT_FEATURE(sb,mask) \
OCFS2_SB(sb)->s_feature_incompat &= ~(mask) OCFS2_SB(sb)->s_feature_incompat &= ~(mask)
#define OCFS2_FEATURE_COMPAT_SUPP 0 #define OCFS2_FEATURE_COMPAT_SUPP OCFS2_FEATURE_COMPAT_BACKUP_SB
#define OCFS2_FEATURE_INCOMPAT_SUPP OCFS2_FEATURE_INCOMPAT_LOCAL_MOUNT #define OCFS2_FEATURE_INCOMPAT_SUPP OCFS2_FEATURE_INCOMPAT_LOCAL_MOUNT
#define OCFS2_FEATURE_RO_COMPAT_SUPP 0 #define OCFS2_FEATURE_RO_COMPAT_SUPP 0
...@@ -109,6 +109,20 @@ ...@@ -109,6 +109,20 @@
/* Support for sparse allocation in b-trees */ /* Support for sparse allocation in b-trees */
#define OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC 0x0010 #define OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC 0x0010
/*
* backup superblock flag is used to indicate that this volume
* has backup superblocks.
*/
#define OCFS2_FEATURE_COMPAT_BACKUP_SB 0x0001
/* The byte offset of the first backup block will be 1G.
* The following will be 4G, 16G, 64G, 256G and 1T.
*/
#define OCFS2_BACKUP_SB_START 1 << 30
/* the max backup superblock nums */
#define OCFS2_MAX_BACKUP_SUPERBLOCKS 6
/* /*
* Flags on ocfs2_dinode.i_flags * Flags on ocfs2_dinode.i_flags
*/ */
...@@ -566,6 +580,20 @@ static inline int ocfs2_truncate_recs_per_inode(struct super_block *sb) ...@@ -566,6 +580,20 @@ static inline int ocfs2_truncate_recs_per_inode(struct super_block *sb)
return size / sizeof(struct ocfs2_truncate_rec); return size / sizeof(struct ocfs2_truncate_rec);
} }
static inline u64 ocfs2_backup_super_blkno(struct super_block *sb, int index)
{
u64 offset = OCFS2_BACKUP_SB_START;
if (index >= 0 && index < OCFS2_MAX_BACKUP_SUPERBLOCKS) {
offset <<= (2 * index);
offset /= sb->s_blocksize;
return offset;
}
return 0;
}
#else #else
static inline int ocfs2_fast_symlink_chars(int blocksize) static inline int ocfs2_fast_symlink_chars(int blocksize)
{ {
...@@ -631,6 +659,19 @@ static inline int ocfs2_truncate_recs_per_inode(int blocksize) ...@@ -631,6 +659,19 @@ static inline int ocfs2_truncate_recs_per_inode(int blocksize)
return size / sizeof(struct ocfs2_truncate_rec); return size / sizeof(struct ocfs2_truncate_rec);
} }
static inline uint64_t ocfs2_backup_super_blkno(int blocksize, int index)
{
uint64_t offset = OCFS2_BACKUP_SB_START;
if (index >= 0 && index < OCFS2_MAX_BACKUP_SUPERBLOCKS) {
offset <<= (2 * index);
offset /= blocksize;
return offset;
}
return 0;
}
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
......
...@@ -158,8 +158,7 @@ static void *ocfs2_follow_link(struct dentry *dentry, ...@@ -158,8 +158,7 @@ static void *ocfs2_follow_link(struct dentry *dentry,
} }
status = vfs_follow_link(nd, link); status = vfs_follow_link(nd, link);
if (status && status != -ENOENT)
mlog_errno(status);
bail: bail:
if (page) { if (page) {
kunmap(page); kunmap(page);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment