Commit fa24aa56 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: Force use of GFP_NOFS in ocfs2_write()
  ocfs2: fix sparse warnings in fs/ocfs2/cluster
  ocfs2: fix sparse warnings in fs/ocfs2/dlm
  ocfs2: fix sparse warnings in fs/ocfs2
  [PATCH] Copy i_flags to ocfs2 inode flags on write
  [PATCH] ocfs2: use __set_current_state()
  ocfs2: Wrap access of directory allocations with ip_alloc_sem.
  [PATCH] fs/ocfs2/: make 3 functions static
  ocfs2: Implement compat_ioctl()
parents 6cbf0c70 9315f130
...@@ -2869,7 +2869,7 @@ int ocfs2_complete_truncate_log_recovery(struct ocfs2_super *osb, ...@@ -2869,7 +2869,7 @@ int ocfs2_complete_truncate_log_recovery(struct ocfs2_super *osb,
tl = &tl_copy->id2.i_dealloc; tl = &tl_copy->id2.i_dealloc;
num_recs = le16_to_cpu(tl->tl_used); num_recs = le16_to_cpu(tl->tl_used);
mlog(0, "cleanup %u records from %llu\n", num_recs, mlog(0, "cleanup %u records from %llu\n", num_recs,
(unsigned long long)tl_copy->i_blkno); (unsigned long long)le64_to_cpu(tl_copy->i_blkno));
mutex_lock(&tl_inode->i_mutex); mutex_lock(&tl_inode->i_mutex);
for(i = 0; i < num_recs; i++) { for(i = 0; i < num_recs; i++) {
...@@ -3801,8 +3801,8 @@ int ocfs2_prepare_truncate(struct ocfs2_super *osb, ...@@ -3801,8 +3801,8 @@ int ocfs2_prepare_truncate(struct ocfs2_super *osb,
fe = (struct ocfs2_dinode *) fe_bh->b_data; fe = (struct ocfs2_dinode *) fe_bh->b_data;
mlog(0, "fe->i_clusters = %u, new_i_clusters = %u, fe->i_size =" mlog(0, "fe->i_clusters = %u, new_i_clusters = %u, fe->i_size ="
"%llu\n", fe->i_clusters, new_i_clusters, "%llu\n", le32_to_cpu(fe->i_clusters), new_i_clusters,
(unsigned long long)fe->i_size); (unsigned long long)le64_to_cpu(fe->i_size));
*tc = kzalloc(sizeof(struct ocfs2_truncate_context), GFP_KERNEL); *tc = kzalloc(sizeof(struct ocfs2_truncate_context), GFP_KERNEL);
if (!(*tc)) { if (!(*tc)) {
......
...@@ -78,7 +78,8 @@ static int ocfs2_symlink_get_block(struct inode *inode, sector_t iblock, ...@@ -78,7 +78,8 @@ static int ocfs2_symlink_get_block(struct inode *inode, sector_t iblock,
if (!OCFS2_IS_VALID_DINODE(fe)) { if (!OCFS2_IS_VALID_DINODE(fe)) {
mlog(ML_ERROR, "Invalid dinode #%llu: signature = %.*s\n", mlog(ML_ERROR, "Invalid dinode #%llu: signature = %.*s\n",
(unsigned long long)fe->i_blkno, 7, fe->i_signature); (unsigned long long)le64_to_cpu(fe->i_blkno), 7,
fe->i_signature);
goto bail; goto bail;
} }
...@@ -939,7 +940,7 @@ int ocfs2_map_and_write_user_data(struct inode *inode, ...@@ -939,7 +940,7 @@ int ocfs2_map_and_write_user_data(struct inode *inode,
* Returns a negative error code or the number of bytes copied into * Returns a negative error code or the number of bytes copied into
* the page. * the page.
*/ */
int ocfs2_write_data_page(struct inode *inode, handle_t *handle, static int ocfs2_write_data_page(struct inode *inode, handle_t *handle,
u64 *p_blkno, struct page *page, u64 *p_blkno, struct page *page,
struct ocfs2_write_ctxt *wc, int new) struct ocfs2_write_ctxt *wc, int new)
{ {
...@@ -1086,7 +1087,7 @@ static ssize_t ocfs2_write(struct file *file, u32 phys, handle_t *handle, ...@@ -1086,7 +1087,7 @@ static ssize_t ocfs2_write(struct file *file, u32 phys, handle_t *handle,
for(i = 0; i < numpages; i++) { for(i = 0; i < numpages; i++) {
index = start + i; index = start + i;
cpages[i] = grab_cache_page(mapping, index); cpages[i] = find_or_create_page(mapping, index, GFP_NOFS);
if (!cpages[i]) { if (!cpages[i]) {
ret = -ENOMEM; ret = -ENOMEM;
mlog_errno(ret); mlog_errno(ret);
......
...@@ -438,7 +438,7 @@ static inline void o2hb_prepare_block(struct o2hb_region *reg, ...@@ -438,7 +438,7 @@ static inline void o2hb_prepare_block(struct o2hb_region *reg,
hb_block)); hb_block));
mlog(ML_HB_BIO, "our node generation = 0x%llx, cksum = 0x%x\n", mlog(ML_HB_BIO, "our node generation = 0x%llx, cksum = 0x%x\n",
(long long)cpu_to_le64(generation), (long long)generation,
le32_to_cpu(hb_block->hb_cksum)); le32_to_cpu(hb_block->hb_cksum));
} }
......
...@@ -1496,7 +1496,7 @@ static void o2net_start_connect(struct work_struct *work) ...@@ -1496,7 +1496,7 @@ static void o2net_start_connect(struct work_struct *work)
sock->sk->sk_allocation = GFP_ATOMIC; sock->sk->sk_allocation = GFP_ATOMIC;
myaddr.sin_family = AF_INET; myaddr.sin_family = AF_INET;
myaddr.sin_addr.s_addr = (__force u32)mynode->nd_ipv4_address; myaddr.sin_addr.s_addr = mynode->nd_ipv4_address;
myaddr.sin_port = (__force u16)htons(0); /* any port */ myaddr.sin_port = (__force u16)htons(0); /* any port */
ret = sock->ops->bind(sock, (struct sockaddr *)&myaddr, ret = sock->ops->bind(sock, (struct sockaddr *)&myaddr,
...@@ -1521,8 +1521,8 @@ static void o2net_start_connect(struct work_struct *work) ...@@ -1521,8 +1521,8 @@ static void o2net_start_connect(struct work_struct *work)
spin_unlock(&nn->nn_lock); spin_unlock(&nn->nn_lock);
remoteaddr.sin_family = AF_INET; remoteaddr.sin_family = AF_INET;
remoteaddr.sin_addr.s_addr = (__force u32)node->nd_ipv4_address; remoteaddr.sin_addr.s_addr = node->nd_ipv4_address;
remoteaddr.sin_port = (__force u16)node->nd_ipv4_port; remoteaddr.sin_port = node->nd_ipv4_port;
ret = sc->sc_sock->ops->connect(sc->sc_sock, ret = sc->sc_sock->ops->connect(sc->sc_sock,
(struct sockaddr *)&remoteaddr, (struct sockaddr *)&remoteaddr,
...@@ -1810,8 +1810,8 @@ static int o2net_open_listening_sock(__be32 addr, __be16 port) ...@@ -1810,8 +1810,8 @@ static int o2net_open_listening_sock(__be32 addr, __be16 port)
int ret; int ret;
struct sockaddr_in sin = { struct sockaddr_in sin = {
.sin_family = PF_INET, .sin_family = PF_INET,
.sin_addr = { .s_addr = (__force u32)addr }, .sin_addr = { .s_addr = addr },
.sin_port = (__force u16)port, .sin_port = port,
}; };
ret = sock_create(PF_INET, SOCK_STREAM, IPPROTO_TCP, &sock); ret = sock_create(PF_INET, SOCK_STREAM, IPPROTO_TCP, &sock);
......
...@@ -403,7 +403,7 @@ static int ocfs2_extend_dir(struct ocfs2_super *osb, ...@@ -403,7 +403,7 @@ static int ocfs2_extend_dir(struct ocfs2_super *osb,
struct buffer_head **new_de_bh) struct buffer_head **new_de_bh)
{ {
int status = 0; int status = 0;
int credits, num_free_extents; int credits, num_free_extents, drop_alloc_sem = 0;
loff_t dir_i_size; loff_t dir_i_size;
struct ocfs2_dinode *fe = (struct ocfs2_dinode *) parent_fe_bh->b_data; struct ocfs2_dinode *fe = (struct ocfs2_dinode *) parent_fe_bh->b_data;
struct ocfs2_alloc_context *data_ac = NULL; struct ocfs2_alloc_context *data_ac = NULL;
...@@ -452,6 +452,9 @@ static int ocfs2_extend_dir(struct ocfs2_super *osb, ...@@ -452,6 +452,9 @@ static int ocfs2_extend_dir(struct ocfs2_super *osb,
credits = OCFS2_SIMPLE_DIR_EXTEND_CREDITS; credits = OCFS2_SIMPLE_DIR_EXTEND_CREDITS;
} }
down_write(&OCFS2_I(dir)->ip_alloc_sem);
drop_alloc_sem = 1;
handle = ocfs2_start_trans(osb, credits); handle = ocfs2_start_trans(osb, credits);
if (IS_ERR(handle)) { if (IS_ERR(handle)) {
status = PTR_ERR(handle); status = PTR_ERR(handle);
...@@ -497,6 +500,8 @@ static int ocfs2_extend_dir(struct ocfs2_super *osb, ...@@ -497,6 +500,8 @@ static int ocfs2_extend_dir(struct ocfs2_super *osb,
*new_de_bh = new_bh; *new_de_bh = new_bh;
get_bh(*new_de_bh); get_bh(*new_de_bh);
bail: bail:
if (drop_alloc_sem)
up_write(&OCFS2_I(dir)->ip_alloc_sem);
if (handle) if (handle)
ocfs2_commit_trans(osb, handle); ocfs2_commit_trans(osb, handle);
......
...@@ -312,8 +312,8 @@ int dlm_proxy_ast_handler(struct o2net_msg *msg, u32 len, void *data, ...@@ -312,8 +312,8 @@ int dlm_proxy_ast_handler(struct o2net_msg *msg, u32 len, void *data,
past->type != DLM_BAST) { past->type != DLM_BAST) {
mlog(ML_ERROR, "Unknown ast type! %d, cookie=%u:%llu" mlog(ML_ERROR, "Unknown ast type! %d, cookie=%u:%llu"
"name=%.*s\n", past->type, "name=%.*s\n", past->type,
dlm_get_lock_cookie_node(be64_to_cpu(cookie)), dlm_get_lock_cookie_node(cookie),
dlm_get_lock_cookie_seq(be64_to_cpu(cookie)), dlm_get_lock_cookie_seq(cookie),
locklen, name); locklen, name);
ret = DLM_IVLOCKID; ret = DLM_IVLOCKID;
goto leave; goto leave;
...@@ -324,8 +324,8 @@ int dlm_proxy_ast_handler(struct o2net_msg *msg, u32 len, void *data, ...@@ -324,8 +324,8 @@ int dlm_proxy_ast_handler(struct o2net_msg *msg, u32 len, void *data,
mlog(0, "got %sast for unknown lockres! " mlog(0, "got %sast for unknown lockres! "
"cookie=%u:%llu, name=%.*s, namelen=%u\n", "cookie=%u:%llu, name=%.*s, namelen=%u\n",
past->type == DLM_AST ? "" : "b", past->type == DLM_AST ? "" : "b",
dlm_get_lock_cookie_node(be64_to_cpu(cookie)), dlm_get_lock_cookie_node(cookie),
dlm_get_lock_cookie_seq(be64_to_cpu(cookie)), dlm_get_lock_cookie_seq(cookie),
locklen, name, locklen); locklen, name, locklen);
ret = DLM_IVLOCKID; ret = DLM_IVLOCKID;
goto leave; goto leave;
...@@ -370,8 +370,8 @@ int dlm_proxy_ast_handler(struct o2net_msg *msg, u32 len, void *data, ...@@ -370,8 +370,8 @@ int dlm_proxy_ast_handler(struct o2net_msg *msg, u32 len, void *data,
mlog(0, "got %sast for unknown lock! cookie=%u:%llu, " mlog(0, "got %sast for unknown lock! cookie=%u:%llu, "
"name=%.*s, namelen=%u\n", past->type == DLM_AST ? "" : "b", "name=%.*s, namelen=%u\n", past->type == DLM_AST ? "" : "b",
dlm_get_lock_cookie_node(be64_to_cpu(cookie)), dlm_get_lock_cookie_node(cookie),
dlm_get_lock_cookie_seq(be64_to_cpu(cookie)), dlm_get_lock_cookie_seq(cookie),
locklen, name, locklen); locklen, name, locklen);
ret = DLM_NORMAL; ret = DLM_NORMAL;
......
...@@ -1769,7 +1769,7 @@ static int dlm_process_recovery_data(struct dlm_ctxt *dlm, ...@@ -1769,7 +1769,7 @@ static int dlm_process_recovery_data(struct dlm_ctxt *dlm,
/* lock is always created locally first, and /* lock is always created locally first, and
* destroyed locally last. it must be on the list */ * destroyed locally last. it must be on the list */
if (!lock) { if (!lock) {
u64 c = ml->cookie; __be64 c = ml->cookie;
mlog(ML_ERROR, "could not find local lock " mlog(ML_ERROR, "could not find local lock "
"with cookie %u:%llu!\n", "with cookie %u:%llu!\n",
dlm_get_lock_cookie_node(be64_to_cpu(c)), dlm_get_lock_cookie_node(be64_to_cpu(c)),
...@@ -1878,7 +1878,7 @@ static int dlm_process_recovery_data(struct dlm_ctxt *dlm, ...@@ -1878,7 +1878,7 @@ static int dlm_process_recovery_data(struct dlm_ctxt *dlm,
spin_lock(&res->spinlock); spin_lock(&res->spinlock);
list_for_each_entry(lock, queue, list) { list_for_each_entry(lock, queue, list) {
if (lock->ml.cookie == ml->cookie) { if (lock->ml.cookie == ml->cookie) {
u64 c = lock->ml.cookie; __be64 c = lock->ml.cookie;
mlog(ML_ERROR, "%s:%.*s: %u:%llu: lock already " mlog(ML_ERROR, "%s:%.*s: %u:%llu: lock already "
"exists on this lockres!\n", dlm->name, "exists on this lockres!\n", dlm->name,
res->lockname.len, res->lockname.name, res->lockname.len, res->lockname.name,
......
...@@ -76,7 +76,7 @@ void __dlm_wait_on_lockres_flags(struct dlm_lock_resource *res, int flags) ...@@ -76,7 +76,7 @@ void __dlm_wait_on_lockres_flags(struct dlm_lock_resource *res, int flags)
goto repeat; goto repeat;
} }
remove_wait_queue(&res->wq, &wait); remove_wait_queue(&res->wq, &wait);
current->state = TASK_RUNNING; __set_current_state(TASK_RUNNING);
} }
int __dlm_lockres_has_locks(struct dlm_lock_resource *res) int __dlm_lockres_has_locks(struct dlm_lock_resource *res)
......
...@@ -104,6 +104,35 @@ static int ocfs2_dentry_convert_worker(struct ocfs2_lock_res *lockres, ...@@ -104,6 +104,35 @@ static int ocfs2_dentry_convert_worker(struct ocfs2_lock_res *lockres,
static void ocfs2_dentry_post_unlock(struct ocfs2_super *osb, static void ocfs2_dentry_post_unlock(struct ocfs2_super *osb,
struct ocfs2_lock_res *lockres); struct ocfs2_lock_res *lockres);
#define mlog_meta_lvb(__level, __lockres) ocfs2_dump_meta_lvb_info(__level, __PRETTY_FUNCTION__, __LINE__, __lockres)
/* This aids in debugging situations where a bad LVB might be involved. */
static void ocfs2_dump_meta_lvb_info(u64 level,
const char *function,
unsigned int line,
struct ocfs2_lock_res *lockres)
{
struct ocfs2_meta_lvb *lvb = (struct ocfs2_meta_lvb *) lockres->l_lksb.lvb;
mlog(level, "LVB information for %s (called from %s:%u):\n",
lockres->l_name, function, line);
mlog(level, "version: %u, clusters: %u, generation: 0x%x\n",
lvb->lvb_version, be32_to_cpu(lvb->lvb_iclusters),
be32_to_cpu(lvb->lvb_igeneration));
mlog(level, "size: %llu, uid %u, gid %u, mode 0x%x\n",
(unsigned long long)be64_to_cpu(lvb->lvb_isize),
be32_to_cpu(lvb->lvb_iuid), be32_to_cpu(lvb->lvb_igid),
be16_to_cpu(lvb->lvb_imode));
mlog(level, "nlink %u, atime_packed 0x%llx, ctime_packed 0x%llx, "
"mtime_packed 0x%llx iattr 0x%x\n", be16_to_cpu(lvb->lvb_inlink),
(long long)be64_to_cpu(lvb->lvb_iatime_packed),
(long long)be64_to_cpu(lvb->lvb_ictime_packed),
(long long)be64_to_cpu(lvb->lvb_imtime_packed),
be32_to_cpu(lvb->lvb_iattr));
}
/* /*
* OCFS2 Lock Resource Operations * OCFS2 Lock Resource Operations
* *
...@@ -3078,28 +3107,3 @@ static void ocfs2_schedule_blocked_lock(struct ocfs2_super *osb, ...@@ -3078,28 +3107,3 @@ static void ocfs2_schedule_blocked_lock(struct ocfs2_super *osb,
mlog_exit_void(); mlog_exit_void();
} }
/* This aids in debugging situations where a bad LVB might be involved. */
void ocfs2_dump_meta_lvb_info(u64 level,
const char *function,
unsigned int line,
struct ocfs2_lock_res *lockres)
{
struct ocfs2_meta_lvb *lvb = (struct ocfs2_meta_lvb *) lockres->l_lksb.lvb;
mlog(level, "LVB information for %s (called from %s:%u):\n",
lockres->l_name, function, line);
mlog(level, "version: %u, clusters: %u, generation: 0x%x\n",
lvb->lvb_version, be32_to_cpu(lvb->lvb_iclusters),
be32_to_cpu(lvb->lvb_igeneration));
mlog(level, "size: %llu, uid %u, gid %u, mode 0x%x\n",
(unsigned long long)be64_to_cpu(lvb->lvb_isize),
be32_to_cpu(lvb->lvb_iuid), be32_to_cpu(lvb->lvb_igid),
be16_to_cpu(lvb->lvb_imode));
mlog(level, "nlink %u, atime_packed 0x%llx, ctime_packed 0x%llx, "
"mtime_packed 0x%llx iattr 0x%x\n", be16_to_cpu(lvb->lvb_inlink),
(long long)be64_to_cpu(lvb->lvb_iatime_packed),
(long long)be64_to_cpu(lvb->lvb_ictime_packed),
(long long)be64_to_cpu(lvb->lvb_imtime_packed),
be32_to_cpu(lvb->lvb_iattr));
}
...@@ -119,11 +119,4 @@ void ocfs2_process_blocked_lock(struct ocfs2_super *osb, ...@@ -119,11 +119,4 @@ void ocfs2_process_blocked_lock(struct ocfs2_super *osb,
struct ocfs2_dlm_debug *ocfs2_new_dlm_debug(void); struct ocfs2_dlm_debug *ocfs2_new_dlm_debug(void);
void ocfs2_put_dlm_debug(struct ocfs2_dlm_debug *dlm_debug); void ocfs2_put_dlm_debug(struct ocfs2_dlm_debug *dlm_debug);
/* aids in debugging and tracking lvbs */
void ocfs2_dump_meta_lvb_info(u64 level,
const char *function,
unsigned int line,
struct ocfs2_lock_res *lockres);
#define mlog_meta_lvb(__level, __lockres) ocfs2_dump_meta_lvb_info(__level, __PRETTY_FUNCTION__, __LINE__, __lockres)
#endif /* DLMGLUE_H */ #endif /* DLMGLUE_H */
...@@ -140,7 +140,7 @@ static struct dentry *ocfs2_get_parent(struct dentry *child) ...@@ -140,7 +140,7 @@ static struct dentry *ocfs2_get_parent(struct dentry *child)
return parent; return parent;
} }
static int ocfs2_encode_fh(struct dentry *dentry, __be32 *fh, int *max_len, static int ocfs2_encode_fh(struct dentry *dentry, u32 *fh_in, int *max_len,
int connectable) int connectable)
{ {
struct inode *inode = dentry->d_inode; struct inode *inode = dentry->d_inode;
...@@ -148,6 +148,7 @@ static int ocfs2_encode_fh(struct dentry *dentry, __be32 *fh, int *max_len, ...@@ -148,6 +148,7 @@ static int ocfs2_encode_fh(struct dentry *dentry, __be32 *fh, int *max_len,
int type = 1; int type = 1;
u64 blkno; u64 blkno;
u32 generation; u32 generation;
__le32 *fh = (__force __le32 *) fh_in;
mlog_entry("(0x%p, '%.*s', 0x%p, %d, %d)\n", dentry, mlog_entry("(0x%p, '%.*s', 0x%p, %d, %d)\n", dentry,
dentry->d_name.len, dentry->d_name.name, dentry->d_name.len, dentry->d_name.name,
...@@ -199,7 +200,7 @@ static int ocfs2_encode_fh(struct dentry *dentry, __be32 *fh, int *max_len, ...@@ -199,7 +200,7 @@ static int ocfs2_encode_fh(struct dentry *dentry, __be32 *fh, int *max_len,
return type; return type;
} }
static struct dentry *ocfs2_decode_fh(struct super_block *sb, __be32 *fh, static struct dentry *ocfs2_decode_fh(struct super_block *sb, u32 *fh_in,
int fh_len, int fileid_type, int fh_len, int fileid_type,
int (*acceptable)(void *context, int (*acceptable)(void *context,
struct dentry *de), struct dentry *de),
...@@ -207,6 +208,7 @@ static struct dentry *ocfs2_decode_fh(struct super_block *sb, __be32 *fh, ...@@ -207,6 +208,7 @@ static struct dentry *ocfs2_decode_fh(struct super_block *sb, __be32 *fh,
{ {
struct ocfs2_inode_handle handle, parent; struct ocfs2_inode_handle handle, parent;
struct dentry *ret = NULL; struct dentry *ret = NULL;
__le32 *fh = (__force __le32 *) fh_in;
mlog_entry("(0x%p, 0x%p, %d, %d, 0x%p, 0x%p)\n", mlog_entry("(0x%p, 0x%p, %d, %d, 0x%p, 0x%p)\n",
sb, fh, fh_len, fileid_type, acceptable, context); sb, fh, fh_len, fileid_type, acceptable, context);
......
...@@ -207,7 +207,7 @@ int ocfs2_update_inode_atime(struct inode *inode, ...@@ -207,7 +207,7 @@ int ocfs2_update_inode_atime(struct inode *inode,
return ret; return ret;
} }
int ocfs2_set_inode_size(handle_t *handle, static int ocfs2_set_inode_size(handle_t *handle,
struct inode *inode, struct inode *inode,
struct buffer_head *fe_bh, struct buffer_head *fe_bh,
u64 new_i_size) u64 new_i_size)
...@@ -713,7 +713,8 @@ static int ocfs2_extend_allocation(struct inode *inode, ...@@ -713,7 +713,8 @@ static int ocfs2_extend_allocation(struct inode *inode,
} }
mlog(0, "fe: i_clusters = %u, i_size=%llu\n", mlog(0, "fe: i_clusters = %u, i_size=%llu\n",
fe->i_clusters, (unsigned long long)fe->i_size); le32_to_cpu(fe->i_clusters),
(unsigned long long)le64_to_cpu(fe->i_size));
mlog(0, "inode: ip_clusters=%u, i_size=%lld\n", mlog(0, "inode: ip_clusters=%u, i_size=%lld\n",
OCFS2_I(inode)->ip_clusters, i_size_read(inode)); OCFS2_I(inode)->ip_clusters, i_size_read(inode));
...@@ -1853,6 +1854,9 @@ const struct file_operations ocfs2_fops = { ...@@ -1853,6 +1854,9 @@ const struct file_operations ocfs2_fops = {
.aio_read = ocfs2_file_aio_read, .aio_read = ocfs2_file_aio_read,
.aio_write = ocfs2_file_aio_write, .aio_write = ocfs2_file_aio_write,
.ioctl = ocfs2_ioctl, .ioctl = ocfs2_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl = ocfs2_compat_ioctl,
#endif
.splice_read = ocfs2_file_splice_read, .splice_read = ocfs2_file_splice_read,
.splice_write = ocfs2_file_splice_write, .splice_write = ocfs2_file_splice_write,
}; };
...@@ -1862,4 +1866,7 @@ const struct file_operations ocfs2_dops = { ...@@ -1862,4 +1866,7 @@ const struct file_operations ocfs2_dops = {
.readdir = ocfs2_readdir, .readdir = ocfs2_readdir,
.fsync = ocfs2_sync_file, .fsync = ocfs2_sync_file,
.ioctl = ocfs2_ioctl, .ioctl = ocfs2_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl = ocfs2_compat_ioctl,
#endif
}; };
...@@ -56,11 +56,6 @@ int ocfs2_getattr(struct vfsmount *mnt, struct dentry *dentry, ...@@ -56,11 +56,6 @@ int ocfs2_getattr(struct vfsmount *mnt, struct dentry *dentry,
int ocfs2_permission(struct inode *inode, int mask, int ocfs2_permission(struct inode *inode, int mask,
struct nameidata *nd); struct nameidata *nd);
int ocfs2_set_inode_size(handle_t *handle,
struct inode *inode,
struct buffer_head *fe_bh,
u64 new_i_size);
int ocfs2_should_update_atime(struct inode *inode, int ocfs2_should_update_atime(struct inode *inode,
struct vfsmount *vfsmnt); struct vfsmount *vfsmnt);
int ocfs2_update_inode_atime(struct inode *inode, int ocfs2_update_inode_atime(struct inode *inode,
......
...@@ -89,6 +89,25 @@ void ocfs2_set_inode_flags(struct inode *inode) ...@@ -89,6 +89,25 @@ void ocfs2_set_inode_flags(struct inode *inode)
inode->i_flags |= S_DIRSYNC; inode->i_flags |= S_DIRSYNC;
} }
/* Propagate flags from i_flags to OCFS2_I(inode)->ip_attr */
void ocfs2_get_inode_flags(struct ocfs2_inode_info *oi)
{
unsigned int flags = oi->vfs_inode.i_flags;
oi->ip_attr &= ~(OCFS2_SYNC_FL|OCFS2_APPEND_FL|
OCFS2_IMMUTABLE_FL|OCFS2_NOATIME_FL|OCFS2_DIRSYNC_FL);
if (flags & S_SYNC)
oi->ip_attr |= OCFS2_SYNC_FL;
if (flags & S_APPEND)
oi->ip_attr |= OCFS2_APPEND_FL;
if (flags & S_IMMUTABLE)
oi->ip_attr |= OCFS2_IMMUTABLE_FL;
if (flags & S_NOATIME)
oi->ip_attr |= OCFS2_NOATIME_FL;
if (flags & S_DIRSYNC)
oi->ip_attr |= OCFS2_DIRSYNC_FL;
}
struct inode *ocfs2_iget(struct ocfs2_super *osb, u64 blkno, int flags) struct inode *ocfs2_iget(struct ocfs2_super *osb, u64 blkno, int flags)
{ {
struct inode *inode = NULL; struct inode *inode = NULL;
...@@ -196,7 +215,7 @@ int ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe, ...@@ -196,7 +215,7 @@ int ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe,
int status = -EINVAL; int status = -EINVAL;
mlog_entry("(0x%p, size:%llu)\n", inode, mlog_entry("(0x%p, size:%llu)\n", inode,
(unsigned long long)fe->i_size); (unsigned long long)le64_to_cpu(fe->i_size));
sb = inode->i_sb; sb = inode->i_sb;
osb = OCFS2_SB(sb); osb = OCFS2_SB(sb);
...@@ -248,7 +267,7 @@ int ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe, ...@@ -248,7 +267,7 @@ int ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe,
mlog(ML_ERROR, mlog(ML_ERROR,
"ip_blkno %llu != i_blkno %llu!\n", "ip_blkno %llu != i_blkno %llu!\n",
(unsigned long long)OCFS2_I(inode)->ip_blkno, (unsigned long long)OCFS2_I(inode)->ip_blkno,
(unsigned long long)fe->i_blkno); (unsigned long long)le64_to_cpu(fe->i_blkno));
inode->i_nlink = le16_to_cpu(fe->i_links_count); inode->i_nlink = le16_to_cpu(fe->i_links_count);
...@@ -301,7 +320,7 @@ int ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe, ...@@ -301,7 +320,7 @@ int ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe,
* the generation argument to * the generation argument to
* ocfs2_inode_lock_res_init() will have to change. * ocfs2_inode_lock_res_init() will have to change.
*/ */
BUG_ON(fe->i_flags & cpu_to_le32(OCFS2_SYSTEM_FL)); BUG_ON(le32_to_cpu(fe->i_flags) & OCFS2_SYSTEM_FL);
ocfs2_inode_lock_res_init(&OCFS2_I(inode)->ip_meta_lockres, ocfs2_inode_lock_res_init(&OCFS2_I(inode)->ip_meta_lockres,
OCFS2_LOCK_TYPE_META, 0, inode); OCFS2_LOCK_TYPE_META, 0, inode);
...@@ -437,7 +456,8 @@ static int ocfs2_read_locked_inode(struct inode *inode, ...@@ -437,7 +456,8 @@ static int ocfs2_read_locked_inode(struct inode *inode,
fe = (struct ocfs2_dinode *) bh->b_data; fe = (struct ocfs2_dinode *) bh->b_data;
if (!OCFS2_IS_VALID_DINODE(fe)) { if (!OCFS2_IS_VALID_DINODE(fe)) {
mlog(ML_ERROR, "Invalid dinode #%llu: signature = %.*s\n", mlog(ML_ERROR, "Invalid dinode #%llu: signature = %.*s\n",
(unsigned long long)fe->i_blkno, 7, fe->i_signature); (unsigned long long)le64_to_cpu(fe->i_blkno), 7,
fe->i_signature);
goto bail; goto bail;
} }
...@@ -812,8 +832,8 @@ static int ocfs2_query_inode_wipe(struct inode *inode, ...@@ -812,8 +832,8 @@ static int ocfs2_query_inode_wipe(struct inode *inode,
"Inode %llu (on-disk %llu) not orphaned! " "Inode %llu (on-disk %llu) not orphaned! "
"Disk flags 0x%x, inode flags 0x%x\n", "Disk flags 0x%x, inode flags 0x%x\n",
(unsigned long long)oi->ip_blkno, (unsigned long long)oi->ip_blkno,
(unsigned long long)di->i_blkno, di->i_flags, (unsigned long long)le64_to_cpu(di->i_blkno),
oi->ip_flags); le32_to_cpu(di->i_flags), oi->ip_flags);
goto bail; goto bail;
} }
...@@ -1106,8 +1126,10 @@ struct buffer_head *ocfs2_bread(struct inode *inode, ...@@ -1106,8 +1126,10 @@ struct buffer_head *ocfs2_bread(struct inode *inode,
return NULL; return NULL;
} }
down_read(&OCFS2_I(inode)->ip_alloc_sem);
tmperr = ocfs2_extent_map_get_blocks(inode, block, &p_blkno, NULL, tmperr = ocfs2_extent_map_get_blocks(inode, block, &p_blkno, NULL,
NULL); NULL);
up_read(&OCFS2_I(inode)->ip_alloc_sem);
if (tmperr < 0) { if (tmperr < 0) {
mlog_errno(tmperr); mlog_errno(tmperr);
goto fail; goto fail;
...@@ -1197,6 +1219,7 @@ int ocfs2_mark_inode_dirty(handle_t *handle, ...@@ -1197,6 +1219,7 @@ int ocfs2_mark_inode_dirty(handle_t *handle,
spin_lock(&OCFS2_I(inode)->ip_lock); spin_lock(&OCFS2_I(inode)->ip_lock);
fe->i_clusters = cpu_to_le32(OCFS2_I(inode)->ip_clusters); fe->i_clusters = cpu_to_le32(OCFS2_I(inode)->ip_clusters);
ocfs2_get_inode_flags(OCFS2_I(inode));
fe->i_attr = cpu_to_le32(OCFS2_I(inode)->ip_attr); fe->i_attr = cpu_to_le32(OCFS2_I(inode)->ip_attr);
spin_unlock(&OCFS2_I(inode)->ip_lock); spin_unlock(&OCFS2_I(inode)->ip_lock);
......
...@@ -141,6 +141,7 @@ int ocfs2_aio_read(struct file *file, struct kiocb *req, struct iocb *iocb); ...@@ -141,6 +141,7 @@ int ocfs2_aio_read(struct file *file, struct kiocb *req, struct iocb *iocb);
int ocfs2_aio_write(struct file *file, struct kiocb *req, struct iocb *iocb); int ocfs2_aio_write(struct file *file, struct kiocb *req, struct iocb *iocb);
void ocfs2_set_inode_flags(struct inode *inode); void ocfs2_set_inode_flags(struct inode *inode);
void ocfs2_get_inode_flags(struct ocfs2_inode_info *oi);
static inline blkcnt_t ocfs2_inode_sector_count(struct inode *inode) static inline blkcnt_t ocfs2_inode_sector_count(struct inode *inode)
{ {
......
...@@ -31,6 +31,7 @@ static int ocfs2_get_inode_attr(struct inode *inode, unsigned *flags) ...@@ -31,6 +31,7 @@ static int ocfs2_get_inode_attr(struct inode *inode, unsigned *flags)
mlog_errno(status); mlog_errno(status);
return status; return status;
} }
ocfs2_get_inode_flags(OCFS2_I(inode));
*flags = OCFS2_I(inode)->ip_attr; *flags = OCFS2_I(inode)->ip_attr;
ocfs2_meta_unlock(inode, 0); ocfs2_meta_unlock(inode, 0);
...@@ -134,3 +135,26 @@ int ocfs2_ioctl(struct inode * inode, struct file * filp, ...@@ -134,3 +135,26 @@ int ocfs2_ioctl(struct inode * inode, struct file * filp,
} }
} }
#ifdef CONFIG_COMPAT
long ocfs2_compat_ioctl(struct file *file, unsigned cmd, unsigned long arg)
{
struct inode *inode = file->f_path.dentry->d_inode;
int ret;
switch (cmd) {
case OCFS2_IOC32_GETFLAGS:
cmd = OCFS2_IOC_GETFLAGS;
break;
case OCFS2_IOC32_SETFLAGS:
cmd = OCFS2_IOC_SETFLAGS;
break;
default:
return -ENOIOCTLCMD;
}
lock_kernel();
ret = ocfs2_ioctl(inode, file, cmd, arg);
unlock_kernel();
return ret;
}
#endif
...@@ -12,5 +12,6 @@ ...@@ -12,5 +12,6 @@
int ocfs2_ioctl(struct inode * inode, struct file * filp, int ocfs2_ioctl(struct inode * inode, struct file * filp,
unsigned int cmd, unsigned long arg); unsigned int cmd, unsigned long arg);
long ocfs2_compat_ioctl(struct file *file, unsigned cmd, unsigned long arg);
#endif /* OCFS2_IOCTL_H */ #endif /* OCFS2_IOCTL_H */
...@@ -435,7 +435,8 @@ static int ocfs2_journal_toggle_dirty(struct ocfs2_super *osb, ...@@ -435,7 +435,8 @@ static int ocfs2_journal_toggle_dirty(struct ocfs2_super *osb,
* handle the errors in a specific manner, so no need * handle the errors in a specific manner, so no need
* to call ocfs2_error() here. */ * to call ocfs2_error() here. */
mlog(ML_ERROR, "Journal dinode %llu has invalid " mlog(ML_ERROR, "Journal dinode %llu has invalid "
"signature: %.*s", (unsigned long long)fe->i_blkno, 7, "signature: %.*s",
(unsigned long long)le64_to_cpu(fe->i_blkno), 7,
fe->i_signature); fe->i_signature);
status = -EIO; status = -EIO;
goto out; goto out;
...@@ -742,7 +743,7 @@ void ocfs2_complete_recovery(struct work_struct *work) ...@@ -742,7 +743,7 @@ void ocfs2_complete_recovery(struct work_struct *work)
la_dinode = item->lri_la_dinode; la_dinode = item->lri_la_dinode;
if (la_dinode) { if (la_dinode) {
mlog(0, "Clean up local alloc %llu\n", mlog(0, "Clean up local alloc %llu\n",
(unsigned long long)la_dinode->i_blkno); (unsigned long long)le64_to_cpu(la_dinode->i_blkno));
ret = ocfs2_complete_local_alloc_recovery(osb, ret = ocfs2_complete_local_alloc_recovery(osb,
la_dinode); la_dinode);
...@@ -755,7 +756,7 @@ void ocfs2_complete_recovery(struct work_struct *work) ...@@ -755,7 +756,7 @@ void ocfs2_complete_recovery(struct work_struct *work)
tl_dinode = item->lri_tl_dinode; tl_dinode = item->lri_tl_dinode;
if (tl_dinode) { if (tl_dinode) {
mlog(0, "Clean up truncate log %llu\n", mlog(0, "Clean up truncate log %llu\n",
(unsigned long long)tl_dinode->i_blkno); (unsigned long long)le64_to_cpu(tl_dinode->i_blkno));
ret = ocfs2_complete_truncate_log_recovery(osb, ret = ocfs2_complete_truncate_log_recovery(osb,
tl_dinode); tl_dinode);
......
...@@ -578,8 +578,9 @@ static int ocfs2_mknod_locked(struct ocfs2_super *osb, ...@@ -578,8 +578,9 @@ static int ocfs2_mknod_locked(struct ocfs2_super *osb,
if (ocfs2_populate_inode(inode, fe, 1) < 0) { if (ocfs2_populate_inode(inode, fe, 1) < 0) {
mlog(ML_ERROR, "populate inode failed! bh->b_blocknr=%llu, " mlog(ML_ERROR, "populate inode failed! bh->b_blocknr=%llu, "
"i_blkno=%llu, i_ino=%lu\n", "i_blkno=%llu, i_ino=%lu\n",
(unsigned long long) (*new_fe_bh)->b_blocknr, (unsigned long long)(*new_fe_bh)->b_blocknr,
(unsigned long long)fe->i_blkno, inode->i_ino); (unsigned long long)le64_to_cpu(fe->i_blkno),
inode->i_ino);
BUG(); BUG();
} }
......
...@@ -363,9 +363,9 @@ static inline int ocfs2_mount_local(struct ocfs2_super *osb) ...@@ -363,9 +363,9 @@ static inline int ocfs2_mount_local(struct ocfs2_super *osb)
typeof(__di) ____di = (__di); \ typeof(__di) ____di = (__di); \
ocfs2_error((__sb), \ ocfs2_error((__sb), \
"Dinode # %llu has bad signature %.*s", \ "Dinode # %llu has bad signature %.*s", \
(unsigned long long)(____di)->i_blkno, 7, \ (unsigned long long)le64_to_cpu((____di)->i_blkno), 7, \
(____di)->i_signature); \ (____di)->i_signature); \
} while (0); } while (0)
#define OCFS2_IS_VALID_EXTENT_BLOCK(ptr) \ #define OCFS2_IS_VALID_EXTENT_BLOCK(ptr) \
(!strcmp((ptr)->h_signature, OCFS2_EXTENT_BLOCK_SIGNATURE)) (!strcmp((ptr)->h_signature, OCFS2_EXTENT_BLOCK_SIGNATURE))
...@@ -374,9 +374,9 @@ static inline int ocfs2_mount_local(struct ocfs2_super *osb) ...@@ -374,9 +374,9 @@ static inline int ocfs2_mount_local(struct ocfs2_super *osb)
typeof(__eb) ____eb = (__eb); \ typeof(__eb) ____eb = (__eb); \
ocfs2_error((__sb), \ ocfs2_error((__sb), \
"Extent Block # %llu has bad signature %.*s", \ "Extent Block # %llu has bad signature %.*s", \
(unsigned long long)(____eb)->h_blkno, 7, \ (unsigned long long)le64_to_cpu((____eb)->h_blkno), 7, \
(____eb)->h_signature); \ (____eb)->h_signature); \
} while (0); } while (0)
#define OCFS2_IS_VALID_GROUP_DESC(ptr) \ #define OCFS2_IS_VALID_GROUP_DESC(ptr) \
(!strcmp((ptr)->bg_signature, OCFS2_GROUP_DESC_SIGNATURE)) (!strcmp((ptr)->bg_signature, OCFS2_GROUP_DESC_SIGNATURE))
...@@ -385,9 +385,9 @@ static inline int ocfs2_mount_local(struct ocfs2_super *osb) ...@@ -385,9 +385,9 @@ static inline int ocfs2_mount_local(struct ocfs2_super *osb)
typeof(__gd) ____gd = (__gd); \ typeof(__gd) ____gd = (__gd); \
ocfs2_error((__sb), \ ocfs2_error((__sb), \
"Group Descriptor # %llu has bad signature %.*s", \ "Group Descriptor # %llu has bad signature %.*s", \
(unsigned long long)(____gd)->bg_blkno, 7, \ (unsigned long long)le64_to_cpu((____gd)->bg_blkno), 7, \
(____gd)->bg_signature); \ (____gd)->bg_signature); \
} while (0); } while (0)
static inline unsigned long ino_from_blkno(struct super_block *sb, static inline unsigned long ino_from_blkno(struct super_block *sb,
u64 blkno) u64 blkno)
......
...@@ -166,6 +166,8 @@ ...@@ -166,6 +166,8 @@
*/ */
#define OCFS2_IOC_GETFLAGS _IOR('f', 1, long) #define OCFS2_IOC_GETFLAGS _IOR('f', 1, long)
#define OCFS2_IOC_SETFLAGS _IOW('f', 2, long) #define OCFS2_IOC_SETFLAGS _IOW('f', 2, long)
#define OCFS2_IOC32_GETFLAGS _IOR('f', 1, int)
#define OCFS2_IOC32_SETFLAGS _IOW('f', 2, int)
/* /*
* Journal Flags (ocfs2_dinode.id1.journal1.i_flags) * Journal Flags (ocfs2_dinode.id1.journal1.i_flags)
......
...@@ -849,9 +849,9 @@ static int ocfs2_relink_block_group(handle_t *handle, ...@@ -849,9 +849,9 @@ static int ocfs2_relink_block_group(handle_t *handle,
} }
mlog(0, "Suballoc %llu, chain %u, move group %llu to top, prev = %llu\n", mlog(0, "Suballoc %llu, chain %u, move group %llu to top, prev = %llu\n",
(unsigned long long)fe->i_blkno, chain, (unsigned long long)le64_to_cpu(fe->i_blkno), chain,
(unsigned long long)bg->bg_blkno, (unsigned long long)le64_to_cpu(bg->bg_blkno),
(unsigned long long)prev_bg->bg_blkno); (unsigned long long)le64_to_cpu(prev_bg->bg_blkno));
fe_ptr = le64_to_cpu(fe->id2.i_chain.cl_recs[chain].c_blkno); fe_ptr = le64_to_cpu(fe->id2.i_chain.cl_recs[chain].c_blkno);
bg_ptr = le64_to_cpu(bg->bg_next_group); bg_ptr = le64_to_cpu(bg->bg_next_group);
...@@ -1162,7 +1162,7 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, ...@@ -1162,7 +1162,7 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac,
} }
mlog(0, "alloc succeeds: we give %u bits from block group %llu\n", mlog(0, "alloc succeeds: we give %u bits from block group %llu\n",
tmp_bits, (unsigned long long)bg->bg_blkno); tmp_bits, (unsigned long long)le64_to_cpu(bg->bg_blkno));
*num_bits = tmp_bits; *num_bits = tmp_bits;
...@@ -1227,7 +1227,7 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac, ...@@ -1227,7 +1227,7 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac,
} }
mlog(0, "Allocated %u bits from suballocator %llu\n", *num_bits, mlog(0, "Allocated %u bits from suballocator %llu\n", *num_bits,
(unsigned long long)fe->i_blkno); (unsigned long long)le64_to_cpu(fe->i_blkno));
*bg_blkno = le64_to_cpu(bg->bg_blkno); *bg_blkno = le64_to_cpu(bg->bg_blkno);
*bits_left = le16_to_cpu(bg->bg_free_bits_count); *bits_left = le16_to_cpu(bg->bg_free_bits_count);
......
...@@ -1538,7 +1538,7 @@ static int ocfs2_verify_volume(struct ocfs2_dinode *di, ...@@ -1538,7 +1538,7 @@ static int ocfs2_verify_volume(struct ocfs2_dinode *di,
} else if (bh->b_blocknr != le64_to_cpu(di->i_blkno)) { } else if (bh->b_blocknr != le64_to_cpu(di->i_blkno)) {
mlog(ML_ERROR, "bad block number on superblock: " mlog(ML_ERROR, "bad block number on superblock: "
"found %llu, should be %llu\n", "found %llu, should be %llu\n",
(unsigned long long)di->i_blkno, (unsigned long long)le64_to_cpu(di->i_blkno),
(unsigned long long)bh->b_blocknr); (unsigned long long)bh->b_blocknr);
} else if (le32_to_cpu(di->id2.i_super.s_clustersize_bits) < 12 || } else if (le32_to_cpu(di->id2.i_super.s_clustersize_bits) < 12 ||
le32_to_cpu(di->id2.i_super.s_clustersize_bits) > 20) { le32_to_cpu(di->id2.i_super.s_clustersize_bits) > 20) {
......
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