The second set of patches.
Sunil Mushran
2009-Nov-10 02:00 UTC
[Ocfs2-devel] [PATCH 01/10] ocfs2: Handle workqueue changes
Mainline commit 52bad64d95bd89e08c49ec5a071fa6dcbe5a1a9c introduced struct delayed_work to separate delayable and non-delayable work. Signed-off-by: Sunil Mushran <sunil.mushran at oracle.com> --- Config.make.in | 2 + Makefile | 3 +- configure.in | 6 +++ fs/ocfs2/Makefile | 4 ++ fs/ocfs2/alloc.c | 11 +++--- fs/ocfs2/cluster/Makefile | 4 ++ fs/ocfs2/cluster/heartbeat.c | 10 +++--- fs/ocfs2/cluster/quorum.c | 4 +- fs/ocfs2/cluster/tcp.c | 65 ++++++++++++++++++++------------------ fs/ocfs2/dcache.c | 6 ++-- fs/ocfs2/dcache.h | 2 +- fs/ocfs2/dlm/Makefile | 4 ++ fs/ocfs2/dlm/dlmcommon.h | 2 +- fs/ocfs2/dlm/dlmdomain.c | 2 +- fs/ocfs2/dlm/dlmrecovery.c | 4 +- fs/ocfs2/dlm/userdlm.c | 9 +++-- fs/ocfs2/journal.c | 12 +++--- fs/ocfs2/journal.h | 2 +- fs/ocfs2/localalloc.c | 6 ++-- fs/ocfs2/localalloc.h | 2 +- fs/ocfs2/quota_global.c | 12 +++--- fs/ocfs2/super.c | 6 ++-- kapi-compat/include/workqueue.h | 17 ++++++++++ 23 files changed, 118 insertions(+), 77 deletions(-) create mode 100644 kapi-compat/include/workqueue.h diff --git a/Config.make.in b/Config.make.in index 4e008fb..cf292b6 100644 --- a/Config.make.in +++ b/Config.make.in @@ -57,6 +57,8 @@ MAKEBO_VERSION = @VERSION@ EXTRA_CFLAGS += @KAPI_COMPAT_CFLAGS@ +NO_DELAYED_WORK_STRUCT = @NO_DELAYED_WORK_STRUCT@ + OCFS_DEBUG = @OCFS_DEBUG@ diff --git a/Makefile b/Makefile index e335ac9..262bc49 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,8 @@ SUBDIRS = fs vendor LINUX_INCLUDE_FILES -KAPI_COMPAT_FILES = +KAPI_COMPAT_FILES = \ + kapi-compat/include/workqueue.h PATCH_FILES diff --git a/configure.in b/configure.in index ad06385..acbe098 100644 --- a/configure.in +++ b/configure.in @@ -158,6 +158,12 @@ esac # Begin kapi_compat checks +NO_DELAYED_WORK_STRUCT+OCFS2_CHECK_KERNEL([struct delayed_work in workqueue.h], workqueue.h, + , NO_DELAYED_WORK_STRUCT=yes, [^struct delayed_work]) +AC_SUBST(NO_DELAYED_WORK_STRUCT) +KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS workqueue.h" + # End kapi_compat checks diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile index 8222d03..4415ce6 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -34,6 +34,10 @@ EXTRA_CFLAGS += -DCONFIG_OCFS2_DEBUG_MASKLOG EXTRA_CFLAGS += -DCONFIG_OCFS2_FS_STATS +ifdef NO_DELAYED_WORK_STRUCT +EXTRA_CFLAGS += -DNO_DELAYED_WORK_STRUCT +endif + # # Since SUBDIRS means something to kbuild, define them safely. Do not # include trailing slashes. diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c index 38a42f5..a1cfe4b 100644 --- a/fs/ocfs2/alloc.c +++ b/fs/ocfs2/alloc.c @@ -6024,12 +6024,11 @@ int ocfs2_flush_truncate_log(struct ocfs2_super *osb) return status; } -static void ocfs2_truncate_log_worker(struct work_struct *work) +static void ocfs2_truncate_log_worker(kapi_work_struct_t *work) { int status; - struct ocfs2_super *osb - container_of(work, struct ocfs2_super, - osb_truncate_log_wq.work); + struct ocfs2_super *osb = work_to_object(work, struct ocfs2_super, + osb_truncate_log_wq.work); mlog_entry_void(); @@ -6262,8 +6261,8 @@ int ocfs2_truncate_log_init(struct ocfs2_super *osb) /* ocfs2_truncate_log_shutdown keys on the existence of * osb->osb_tl_inode so we don't set any of the osb variables * until we're sure all is well. */ - INIT_DELAYED_WORK(&osb->osb_truncate_log_wq, - ocfs2_truncate_log_worker); + KAPI_INIT_DELAYED_WORK(&osb->osb_truncate_log_wq, + ocfs2_truncate_log_worker, osb); osb->osb_tl_bh = tl_bh; osb->osb_tl_inode = tl_inode; diff --git a/fs/ocfs2/cluster/Makefile b/fs/ocfs2/cluster/Makefile index fc5d3a0..c1f4f31 100644 --- a/fs/ocfs2/cluster/Makefile +++ b/fs/ocfs2/cluster/Makefile @@ -18,6 +18,10 @@ HEADERS EXTRA_CFLAGS += -DCONFIG_OCFS2_DEBUG_MASKLOG +ifdef NO_DELAYED_WORK_STRUCT +EXTRA_CFLAGS += -DNO_DELAYED_WORK_STRUCT +endif + SOURCES += \ heartbeat.c \ masklog.c \ diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c index c452d11..68e9af5 100644 --- a/fs/ocfs2/cluster/heartbeat.c +++ b/fs/ocfs2/cluster/heartbeat.c @@ -162,11 +162,10 @@ struct o2hb_bio_wait_ctxt { int wc_error; }; -static void o2hb_write_timeout(struct work_struct *work) +static void o2hb_write_timeout(kapi_work_struct_t *work) { - struct o2hb_region *reg - container_of(work, struct o2hb_region, - hr_write_timeout_work.work); + struct o2hb_region *reg = work_to_object(work, struct o2hb_region, + hr_write_timeout_work.work); mlog(ML_ERROR, "Heartbeat write timeout to device %s after %u " "milliseconds\n", reg->hr_dev_name, @@ -1400,7 +1399,8 @@ static ssize_t o2hb_region_dev_write(struct o2hb_region *reg, goto out; } - INIT_DELAYED_WORK(®->hr_write_timeout_work, o2hb_write_timeout); + KAPI_INIT_DELAYED_WORK(®->hr_write_timeout_work, o2hb_write_timeout, + reg); /* * A node is considered live after it has beat LIVE_THRESHOLD diff --git a/fs/ocfs2/cluster/quorum.c b/fs/ocfs2/cluster/quorum.c index bbacf7d..242622f 100644 --- a/fs/ocfs2/cluster/quorum.c +++ b/fs/ocfs2/cluster/quorum.c @@ -91,7 +91,7 @@ void o2quo_disk_timeout(void) o2quo_fence_self(); } -static void o2quo_make_decision(struct work_struct *work) +static void o2quo_make_decision(kapi_work_struct_t *work) { int quorum; int lowest_hb, lowest_reachable = 0, fence = 0; @@ -309,7 +309,7 @@ void o2quo_init(void) struct o2quo_state *qs = &o2quo_state; spin_lock_init(&qs->qs_lock); - INIT_WORK(&qs->qs_work, o2quo_make_decision); + KAPI_INIT_WORK(&qs->qs_work, o2quo_make_decision, qs); } void o2quo_exit(void) diff --git a/fs/ocfs2/cluster/tcp.c b/fs/ocfs2/cluster/tcp.c index 334f231..4b8279e 100644 --- a/fs/ocfs2/cluster/tcp.c +++ b/fs/ocfs2/cluster/tcp.c @@ -133,11 +133,11 @@ static int o2net_sys_err_translations[O2NET_ERR_MAX] [O2NET_ERR_DIED] = -EHOSTDOWN,}; /* can't quite avoid *all* internal declarations :/ */ -static void o2net_sc_connect_completed(struct work_struct *work); -static void o2net_rx_until_empty(struct work_struct *work); -static void o2net_shutdown_sc(struct work_struct *work); +static void o2net_sc_connect_completed(kapi_work_struct_t *work); +static void o2net_rx_until_empty(kapi_work_struct_t *work); +static void o2net_shutdown_sc(kapi_work_struct_t *work); static void o2net_listen_data_ready(struct sock *sk, int bytes); -static void o2net_sc_send_keep_req(struct work_struct *work); +static void o2net_sc_send_keep_req(kapi_work_struct_t *work); static void o2net_idle_timer(unsigned long data); static void o2net_sc_postpone_idle(struct o2net_sock_container *sc); static void o2net_sc_reset_idle_timer(struct o2net_sock_container *sc); @@ -386,10 +386,11 @@ static struct o2net_sock_container *sc_alloc(struct o2nm_node *node) o2nm_node_get(node); sc->sc_node = node; - INIT_WORK(&sc->sc_connect_work, o2net_sc_connect_completed); - INIT_WORK(&sc->sc_rx_work, o2net_rx_until_empty); - INIT_WORK(&sc->sc_shutdown_work, o2net_shutdown_sc); - INIT_DELAYED_WORK(&sc->sc_keepalive_work, o2net_sc_send_keep_req); + KAPI_INIT_WORK(&sc->sc_connect_work, o2net_sc_connect_completed, sc); + KAPI_INIT_WORK(&sc->sc_rx_work, o2net_rx_until_empty, sc); + KAPI_INIT_WORK(&sc->sc_shutdown_work, o2net_shutdown_sc, sc); + KAPI_INIT_DELAYED_WORK(&sc->sc_keepalive_work, o2net_sc_send_keep_req, + sc); init_timer(&sc->sc_idle_timeout); sc->sc_idle_timeout.function = o2net_idle_timer; @@ -662,11 +663,11 @@ static void o2net_ensure_shutdown(struct o2net_node *nn, * ourselves as state_change couldn't get the nn_lock and call set_nn_state * itself. */ -static void o2net_shutdown_sc(struct work_struct *work) +static void o2net_shutdown_sc(kapi_work_struct_t *work) { struct o2net_sock_container *sc - container_of(work, struct o2net_sock_container, - sc_shutdown_work); + work_to_object(work, struct o2net_sock_container, + sc_shutdown_work); struct o2net_node *nn = o2net_nn_from_num(sc->sc_node->nd_num); sclog(sc, "shutting down\n"); @@ -1379,10 +1380,10 @@ out: /* this work func is triggerd by data ready. it reads until it can read no * more. it interprets 0, eof, as fatal. if data_ready hits while we're doing * our work the work struct will be marked and we'll be called again. */ -static void o2net_rx_until_empty(struct work_struct *work) +static void o2net_rx_until_empty(kapi_work_struct_t *work) { struct o2net_sock_container *sc - container_of(work, struct o2net_sock_container, sc_rx_work); + work_to_object(work, struct o2net_sock_container, sc_rx_work); int ret; do { @@ -1439,11 +1440,11 @@ static void o2net_initialize_handshake(void) /* called when a connect completes and after a sock is accepted. the * rx path will see the response and mark the sc valid */ -static void o2net_sc_connect_completed(struct work_struct *work) +static void o2net_sc_connect_completed(kapi_work_struct_t *work) { struct o2net_sock_container *sc - container_of(work, struct o2net_sock_container, - sc_connect_work); + work_to_object(work, struct o2net_sock_container, + sc_connect_work); mlog(ML_MSG, "sc sending handshake with ver %llu id %llx\n", (unsigned long long)O2NET_PROTOCOL_VERSION, @@ -1455,11 +1456,11 @@ static void o2net_sc_connect_completed(struct work_struct *work) } /* this is called as a work_struct func. */ -static void o2net_sc_send_keep_req(struct work_struct *work) +static void o2net_sc_send_keep_req(kapi_work_struct_t *work) { struct o2net_sock_container *sc - container_of(work, struct o2net_sock_container, - sc_keepalive_work.work); + work_to_object(work, struct o2net_sock_container, + sc_keepalive_work.work); o2net_sendpage(sc, o2net_keep_req, sizeof(*o2net_keep_req)); sc_put(sc); @@ -1525,10 +1526,10 @@ static void o2net_sc_postpone_idle(struct o2net_sock_container *sc) * having a connect attempt fail, etc. This centralizes the logic which decides * if a connect attempt should be made or if we should give up and all future * transmit attempts should fail */ -static void o2net_start_connect(struct work_struct *work) +static void o2net_start_connect(kapi_work_struct_t *work) { struct o2net_node *nn - container_of(work, struct o2net_node, nn_connect_work.work); + work_to_object(work, struct o2net_node, nn_connect_work.work); struct o2net_sock_container *sc = NULL; struct o2nm_node *node = NULL, *mynode = NULL; struct socket *sock = NULL; @@ -1642,10 +1643,11 @@ out: return; } -static void o2net_connect_expired(struct work_struct *work) +static void o2net_connect_expired(kapi_work_struct_t *work) { struct o2net_node *nn - container_of(work, struct o2net_node, nn_connect_expired.work); + work_to_object(work, struct o2net_node, + nn_connect_expired.work); spin_lock(&nn->nn_lock); if (!nn->nn_sc_valid) { @@ -1660,10 +1662,10 @@ static void o2net_connect_expired(struct work_struct *work) spin_unlock(&nn->nn_lock); } -static void o2net_still_up(struct work_struct *work) +static void o2net_still_up(kapi_work_struct_t *work) { struct o2net_node *nn - container_of(work, struct o2net_node, nn_still_up.work); + work_to_object(work, struct o2net_node, nn_still_up.work); o2quo_hb_still_up(o2net_num_from_nn(nn)); } @@ -1859,7 +1861,7 @@ out: return ret; } -static void o2net_accept_many(struct work_struct *work) +static void o2net_accept_many(kapi_work_struct_t *work) { struct socket *sock = o2net_listen_sock; while (o2net_accept_one(sock) == 0) @@ -1915,7 +1917,7 @@ static int o2net_open_listening_sock(__be32 addr, __be16 port) write_unlock_bh(&sock->sk->sk_callback_lock); o2net_listen_sock = sock; - INIT_WORK(&o2net_listen_work, o2net_accept_many); + KAPI_INIT_WORK(&o2net_listen_work, o2net_accept_many, sock); sock->sk->sk_reuse = 1; ret = sock->ops->bind(sock, (struct sockaddr *)&sin, sizeof(sin)); @@ -2039,10 +2041,11 @@ int o2net_init(void) atomic_set(&nn->nn_timeout, 0); spin_lock_init(&nn->nn_lock); - INIT_DELAYED_WORK(&nn->nn_connect_work, o2net_start_connect); - INIT_DELAYED_WORK(&nn->nn_connect_expired, - o2net_connect_expired); - INIT_DELAYED_WORK(&nn->nn_still_up, o2net_still_up); + KAPI_INIT_DELAYED_WORK(&nn->nn_connect_work, + o2net_start_connect, nn); + KAPI_INIT_DELAYED_WORK(&nn->nn_connect_expired, + o2net_connect_expired, nn); + KAPI_INIT_DELAYED_WORK(&nn->nn_still_up, o2net_still_up, nn); /* until we see hb from a node we'll return einval */ nn->nn_persistent_error = -ENOTCONN; init_waitqueue_head(&nn->nn_sc_wq); diff --git a/fs/ocfs2/dcache.c b/fs/ocfs2/dcache.c index b4957c7..8ad82bc 100644 --- a/fs/ocfs2/dcache.c +++ b/fs/ocfs2/dcache.c @@ -344,10 +344,10 @@ static void __ocfs2_drop_dl_inodes(struct ocfs2_super *osb, int drop_count) spin_unlock(&dentry_list_lock); } -void ocfs2_drop_dl_inodes(struct work_struct *work) +void ocfs2_drop_dl_inodes(kapi_work_struct_t *work) { - struct ocfs2_super *osb = container_of(work, struct ocfs2_super, - dentry_lock_work); + struct ocfs2_super *osb = work_to_object(work, struct ocfs2_super, + dentry_lock_work); __ocfs2_drop_dl_inodes(osb, DL_INODE_DROP_COUNT); /* diff --git a/fs/ocfs2/dcache.h b/fs/ocfs2/dcache.h index f5dd178..d13a087 100644 --- a/fs/ocfs2/dcache.h +++ b/fs/ocfs2/dcache.h @@ -54,7 +54,7 @@ extern spinlock_t dentry_list_lock; void ocfs2_dentry_lock_put(struct ocfs2_super *osb, struct ocfs2_dentry_lock *dl); -void ocfs2_drop_dl_inodes(struct work_struct *work); +void ocfs2_drop_dl_inodes(kapi_work_struct_t *work); void ocfs2_drop_all_dl_inodes(struct ocfs2_super *osb); struct dentry *ocfs2_find_local_alias(struct inode *inode, u64 parent_blkno, diff --git a/fs/ocfs2/dlm/Makefile b/fs/ocfs2/dlm/Makefile index 26cbf6c..44b6cc6 100644 --- a/fs/ocfs2/dlm/Makefile +++ b/fs/ocfs2/dlm/Makefile @@ -22,6 +22,10 @@ EXTRA_CFLAGS += -I$(OUR_TOPDIR)/fs/ocfs2 EXTRA_CFLAGS += -DCONFIG_OCFS2_DEBUG_MASKLOG +ifdef NO_DELAYED_WORK_STRUCT +EXTRA_CFLAGS += -DNO_DELAYED_WORK_STRUCT +endif + DLM_SOURCES += \ dlmast.c \ dlmconvert.c \ diff --git a/fs/ocfs2/dlm/dlmcommon.h b/fs/ocfs2/dlm/dlmcommon.h index 0102be3..a13292a 100644 --- a/fs/ocfs2/dlm/dlmcommon.h +++ b/fs/ocfs2/dlm/dlmcommon.h @@ -203,7 +203,7 @@ static inline struct hlist_head *dlm_master_hash(struct dlm_ctxt *dlm, * called functions that cannot be directly called from the * net message handlers for some reason, usually because * they need to send net messages of their own. */ -void dlm_dispatch_work(struct work_struct *work); +void dlm_dispatch_work(kapi_work_struct_t *work); struct dlm_lock_resource; struct dlm_work_item; diff --git a/fs/ocfs2/dlm/dlmdomain.c b/fs/ocfs2/dlm/dlmdomain.c index 0334000..05a0350 100644 --- a/fs/ocfs2/dlm/dlmdomain.c +++ b/fs/ocfs2/dlm/dlmdomain.c @@ -1613,7 +1613,7 @@ static struct dlm_ctxt *dlm_alloc_ctxt(const char *domain, spin_lock_init(&dlm->work_lock); INIT_LIST_HEAD(&dlm->work_list); - INIT_WORK(&dlm->dispatched_work, dlm_dispatch_work); + KAPI_INIT_WORK(&dlm->dispatched_work, dlm_dispatch_work, dlm); kref_init(&dlm->dlm_refs); dlm->dlm_state = DLM_CTXT_NEW; diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c index d9fa3d2..2e16a38 100644 --- a/fs/ocfs2/dlm/dlmrecovery.c +++ b/fs/ocfs2/dlm/dlmrecovery.c @@ -152,10 +152,10 @@ static inline void dlm_reset_recovery(struct dlm_ctxt *dlm) } /* Worker function used during recovery. */ -void dlm_dispatch_work(struct work_struct *work) +void dlm_dispatch_work(kapi_work_struct_t *work) { struct dlm_ctxt *dlm - container_of(work, struct dlm_ctxt, dispatched_work); + work_to_object(work, struct dlm_ctxt, dispatched_work); LIST_HEAD(tmp_list); struct dlm_work_item *item, *next; dlm_workfunc_t *workfunc; diff --git a/fs/ocfs2/dlm/userdlm.c b/fs/ocfs2/dlm/userdlm.c index 4cb1d3d..01a57c8 100644 --- a/fs/ocfs2/dlm/userdlm.c +++ b/fs/ocfs2/dlm/userdlm.c @@ -171,14 +171,15 @@ static inline void user_dlm_grab_inode_ref(struct user_lock_res *lockres) BUG(); } -static void user_dlm_unblock_lock(struct work_struct *work); +static void user_dlm_unblock_lock(kapi_work_struct_t *work); static void __user_dlm_queue_lockres(struct user_lock_res *lockres) { if (!(lockres->l_flags & USER_LOCK_QUEUED)) { user_dlm_grab_inode_ref(lockres); - INIT_WORK(&lockres->l_work, user_dlm_unblock_lock); + KAPI_INIT_WORK(&lockres->l_work, user_dlm_unblock_lock, + lockres); queue_work(user_dlm_worker, &lockres->l_work); lockres->l_flags |= USER_LOCK_QUEUED; @@ -278,11 +279,11 @@ static inline void user_dlm_drop_inode_ref(struct user_lock_res *lockres) iput(inode); } -static void user_dlm_unblock_lock(struct work_struct *work) +static void user_dlm_unblock_lock(kapi_work_struct_t *work) { int new_level, status; struct user_lock_res *lockres - container_of(work, struct user_lock_res, l_work); + work_to_object(work, struct user_lock_res, l_work); struct dlm_ctxt *dlm = dlm_ctxt_from_user_lockres(lockres); mlog(0, "processing lockres %.*s\n", lockres->l_namelen, diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c index 54c16b6..67cc5a7 100644 --- a/fs/ocfs2/journal.c +++ b/fs/ocfs2/journal.c @@ -1189,11 +1189,11 @@ struct ocfs2_la_recovery_item { * NOTE: This function can and will sleep on recovery of other nodes * during cluster locking, just like any other ocfs2 process. */ -void ocfs2_complete_recovery(struct work_struct *work) +void ocfs2_complete_recovery(kapi_work_struct_t *work) { int ret; struct ocfs2_journal *journal - container_of(work, struct ocfs2_journal, j_recovery_work); + work_to_object(work, struct ocfs2_journal, j_recovery_work); struct ocfs2_super *osb = journal->j_osb; struct ocfs2_dinode *la_dinode, *tl_dinode; struct ocfs2_la_recovery_item *item, *n; @@ -1926,13 +1926,13 @@ out: } /* Worker task that gets fired every ORPHAN_SCAN_SCHEDULE_TIMEOUT millsec */ -void ocfs2_orphan_scan_work(struct work_struct *work) +void ocfs2_orphan_scan_work(kapi_work_struct_t *work) { struct ocfs2_orphan_scan *os; struct ocfs2_super *osb; - os = container_of(work, struct ocfs2_orphan_scan, - os_orphan_scan_work.work); + os = work_to_object(work, struct ocfs2_orphan_scan, + os_orphan_scan_work.work); osb = os->os_osb; mutex_lock(&os->os_lock); @@ -1965,7 +1965,7 @@ void ocfs2_orphan_scan_init(struct ocfs2_super *osb) os->os_count = 0; os->os_seqno = 0; mutex_init(&os->os_lock); - INIT_DELAYED_WORK(&os->os_orphan_scan_work, ocfs2_orphan_scan_work); + KAPI_INIT_DELAYED_WORK(&os->os_orphan_scan_work, ocfs2_orphan_scan_work, os); } void ocfs2_orphan_scan_start(struct ocfs2_super *osb) diff --git a/fs/ocfs2/journal.h b/fs/ocfs2/journal.h index 3f74e09..321c857 100644 --- a/fs/ocfs2/journal.h +++ b/fs/ocfs2/journal.h @@ -159,7 +159,7 @@ void ocfs2_orphan_scan_start(struct ocfs2_super *osb); void ocfs2_orphan_scan_stop(struct ocfs2_super *osb); void ocfs2_orphan_scan_exit(struct ocfs2_super *osb); -void ocfs2_complete_recovery(struct work_struct *work); +void ocfs2_complete_recovery(kapi_work_struct_t *work); void ocfs2_wait_for_recovery(struct ocfs2_super *osb); int ocfs2_recovery_init(struct ocfs2_super *osb); diff --git a/fs/ocfs2/localalloc.c b/fs/ocfs2/localalloc.c index ac10f83..83b22ca 100644 --- a/fs/ocfs2/localalloc.c +++ b/fs/ocfs2/localalloc.c @@ -93,11 +93,11 @@ void ocfs2_local_alloc_seen_free_bits(struct ocfs2_super *osb, spin_unlock(&osb->osb_lock); } -void ocfs2_la_enable_worker(struct work_struct *work) +void ocfs2_la_enable_worker(kapi_work_struct_t *work) { struct ocfs2_super *osb - container_of(work, struct ocfs2_super, - la_enable_wq.work); + work_to_object(work, struct ocfs2_super, + la_enable_wq.work); spin_lock(&osb->osb_lock); osb->local_alloc_state = OCFS2_LA_ENABLED; spin_unlock(&osb->osb_lock); diff --git a/fs/ocfs2/localalloc.h b/fs/ocfs2/localalloc.h index ac5ea9f..3234d2a 100644 --- a/fs/ocfs2/localalloc.h +++ b/fs/ocfs2/localalloc.h @@ -54,6 +54,6 @@ int ocfs2_claim_local_alloc_bits(struct ocfs2_super *osb, void ocfs2_local_alloc_seen_free_bits(struct ocfs2_super *osb, unsigned int num_clusters); -void ocfs2_la_enable_worker(struct work_struct *work); +void ocfs2_la_enable_worker(kapi_work_struct_t *work); #endif /* OCFS2_LOCALALLOC_H */ diff --git a/fs/ocfs2/quota_global.c b/fs/ocfs2/quota_global.c index b437dc0..0f319fb 100644 --- a/fs/ocfs2/quota_global.c +++ b/fs/ocfs2/quota_global.c @@ -28,7 +28,7 @@ static struct workqueue_struct *ocfs2_quota_wq = NULL; -static void qsync_work_fn(struct work_struct *work); +static void qsync_work_fn(kapi_work_struct_t *work); static void ocfs2_global_disk2memdqb(struct dquot *dquot, void *dp) { @@ -360,7 +360,7 @@ int ocfs2_global_read_info(struct super_block *sb, int type) oinfo->dqi_gi.dqi_usable_bs = sb->s_blocksize - OCFS2_QBLK_RESERVED_SPACE; oinfo->dqi_gi.dqi_qtree_depth = qtree_depth(&oinfo->dqi_gi); - INIT_DELAYED_WORK(&oinfo->dqi_sync_work, qsync_work_fn); + KAPI_INIT_DELAYED_WORK(&oinfo->dqi_sync_work, qsync_work_fn, oinfo); queue_delayed_work(ocfs2_quota_wq, &oinfo->dqi_sync_work, msecs_to_jiffies(oinfo->dqi_syncms)); @@ -653,11 +653,11 @@ out: return status; } -static void qsync_work_fn(struct work_struct *work) +static void qsync_work_fn(kapi_work_struct_t *work) { - struct ocfs2_mem_dqinfo *oinfo = container_of(work, - struct ocfs2_mem_dqinfo, - dqi_sync_work.work); + struct ocfs2_mem_dqinfo *oinfo + work_to_object(work, struct ocfs2_mem_dqinfo, + dqi_sync_work.work); struct super_block *sb = oinfo->dqi_gqinode->i_sb; dquot_scan_active(sb, ocfs2_sync_dquot_helper, oinfo->dqi_type); diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index c0e48ae..5f19ff5 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c @@ -2027,7 +2027,7 @@ static int ocfs2_initialize_super(struct super_block *sb, osb->local_alloc_state = OCFS2_LA_UNUSED; osb->local_alloc_bh = NULL; - INIT_DELAYED_WORK(&osb->la_enable_wq, ocfs2_la_enable_worker); + KAPI_INIT_DELAYED_WORK(&osb->la_enable_wq, ocfs2_la_enable_worker, osb); init_waitqueue_head(&osb->osb_mount_event); @@ -2134,10 +2134,10 @@ static int ocfs2_initialize_super(struct super_block *sb, spin_lock_init(&journal->j_lock); journal->j_trans_id = (unsigned long) 1; INIT_LIST_HEAD(&journal->j_la_cleanups); - INIT_WORK(&journal->j_recovery_work, ocfs2_complete_recovery); + KAPI_INIT_WORK(&journal->j_recovery_work, ocfs2_complete_recovery, journal); journal->j_state = OCFS2_JOURNAL_FREE; - INIT_WORK(&osb->dentry_lock_work, ocfs2_drop_dl_inodes); + KAPI_INIT_WORK(&osb->dentry_lock_work, ocfs2_drop_dl_inodes, osb); osb->dentry_lock_list = NULL; /* get some pseudo constants for clustersize bits */ diff --git a/kapi-compat/include/workqueue.h b/kapi-compat/include/workqueue.h new file mode 100644 index 0000000..24dfe2d --- /dev/null +++ b/kapi-compat/include/workqueue.h @@ -0,0 +1,17 @@ +#ifndef KAPI_WORKQUEUE_H +#define KAPI_WORKQUEUE_H + +#ifdef NO_DELAYED_WORK_STRUCT +# define delayed_work work_struct +typedef void kapi_work_struct_t; +# define work_to_object(a, b, c) (a) +# define KAPI_INIT_WORK(a, b, c) INIT_WORK(a, b, c) +# define KAPI_INIT_DELAYED_WORK(a, b, c) INIT_WORK(a, b, c) +#else +typedef struct work_struct kapi_work_struct_t; +# define work_to_object(a, b, c) container_of(a, b, c) +# define KAPI_INIT_WORK(a, b, c) INIT_WORK(a, b) +# define KAPI_INIT_DELAYED_WORK(a, b, c) INIT_DELAYED_WORK(a, b) +#endif + +#endif -- 1.5.6.5
Sunil Mushran
2009-Nov-10 02:00 UTC
[Ocfs2-devel] [PATCH 02/10] ocfs2: Handle missing dlmconstants.h
Mainline commit d69a3ad6a0e47b2aa9b2b2ddfd385752132a4d34 split lock mode and flag constants from dlm.h into a sharable header, dlmconstants.h. This patch adds a header with the same name that merely includes dlm.h. Signed-off-by: Sunil Mushran <sunil.mushran at oracle.com> --- Config.make.in | 1 + Makefile | 3 ++- configure.in | 6 ++++++ fs/ocfs2/Makefile | 4 ++++ fs/ocfs2/stackglue.h | 2 ++ kapi-compat/include/dlmconstants.h | 9 +++++++++ 6 files changed, 24 insertions(+), 1 deletions(-) create mode 100644 kapi-compat/include/dlmconstants.h diff --git a/Config.make.in b/Config.make.in index cf292b6..33b7a89 100644 --- a/Config.make.in +++ b/Config.make.in @@ -58,6 +58,7 @@ MAKEBO_VERSION = @VERSION@ EXTRA_CFLAGS += @KAPI_COMPAT_CFLAGS@ NO_DELAYED_WORK_STRUCT = @NO_DELAYED_WORK_STRUCT@ +NO_DLMCONSTANTS_HEADER = @NO_DLMCONSTANTS_HEADER@ OCFS_DEBUG = @OCFS_DEBUG@ diff --git a/Makefile b/Makefile index 262bc49..d038ae9 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,8 @@ SUBDIRS = fs vendor LINUX_INCLUDE_FILES KAPI_COMPAT_FILES = \ - kapi-compat/include/workqueue.h + kapi-compat/include/workqueue.h \ + kapi-compat/include/dlmconstants.h PATCH_FILES diff --git a/configure.in b/configure.in index acbe098..f67de02 100644 --- a/configure.in +++ b/configure.in @@ -164,6 +164,12 @@ OCFS2_CHECK_KERNEL([struct delayed_work in workqueue.h], workqueue.h, AC_SUBST(NO_DELAYED_WORK_STRUCT) KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS workqueue.h" +NO_DLMCONSTANTS_HEADER+OCFS2_CHECK_KERNEL([dlmconstants.h], dlmconstants.h, + , NO_DLMCONSTANTS_HEADER=yes, [__DLMCONSTANTS_DOT_H__]) +AC_SUBST(NO_DLMCONSTANTS_HEADER) +KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS dlmconstants.h" + # End kapi_compat checks diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile index 4415ce6..e997fe4 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -38,6 +38,10 @@ ifdef NO_DELAYED_WORK_STRUCT EXTRA_CFLAGS += -DNO_DELAYED_WORK_STRUCT endif +ifdef NO_DLMCONSTANTS_HEADER +EXTRA_CFLAGS += -DNO_DLMCONSTANTS_HEADER +endif + # # Since SUBDIRS means something to kbuild, define them safely. Do not # include trailing slashes. diff --git a/fs/ocfs2/stackglue.h b/fs/ocfs2/stackglue.h index 03a44d6..52d1a1d 100644 --- a/fs/ocfs2/stackglue.h +++ b/fs/ocfs2/stackglue.h @@ -23,7 +23,9 @@ #include <linux/types.h> #include <linux/list.h> +#ifndef NO_DLMCONSTANTS_HEADER #include <linux/dlmconstants.h> +#endif #include "dlm/dlmapi.h" #include <linux/dlm.h> diff --git a/kapi-compat/include/dlmconstants.h b/kapi-compat/include/dlmconstants.h new file mode 100644 index 0000000..19e92c9 --- /dev/null +++ b/kapi-compat/include/dlmconstants.h @@ -0,0 +1,9 @@ +#ifndef KAPI_DLMCONSTANTS_H +#define KAPI_DLMCONSTANTS_H + +#ifdef NO_DLMCONSTANTS_HEADER +#include <linux/types.h> +#include <linux/dlm.h> +#endif + +#endif -- 1.5.6.5
Sunil Mushran
2009-Nov-10 02:00 UTC
[Ocfs2-devel] [PATCH 03/10] ocfs2: Add helper task_pid_nr()
Mainline commit 7af5729474b5b8ad385adadab78d6e723e7655a3 added a helper to obtain the pid number. Signed-off-by: Sunil Mushran <sunil.mushran at oracle.com> --- Makefile | 3 ++- configure.in | 5 +++++ kapi-compat/include/task_pid_nr.h | 12 ++++++++++++ 3 files changed, 19 insertions(+), 1 deletions(-) create mode 100644 kapi-compat/include/task_pid_nr.h diff --git a/Makefile b/Makefile index d038ae9..98726c9 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,8 @@ LINUX_INCLUDE_FILES KAPI_COMPAT_FILES = \ kapi-compat/include/workqueue.h \ - kapi-compat/include/dlmconstants.h + kapi-compat/include/dlmconstants.h \ + kapi-compat/include/task_pid_nr.h PATCH_FILES diff --git a/configure.in b/configure.in index f67de02..e94412b 100644 --- a/configure.in +++ b/configure.in @@ -170,6 +170,11 @@ OCFS2_CHECK_KERNEL([dlmconstants.h], dlmconstants.h, AC_SUBST(NO_DLMCONSTANTS_HEADER) KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS dlmconstants.h" +task_pid_nr_compat_header+OCFS2_CHECK_KERNEL([task_pid_nr() in sched.h], sched.h, + , task_pid_nr_compat_header="task_pid_nr.h", [^static inline pid_t task_pid_nr(struct]) +KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $task_pid_nr_compat_header" + # End kapi_compat checks diff --git a/kapi-compat/include/task_pid_nr.h b/kapi-compat/include/task_pid_nr.h new file mode 100644 index 0000000..bd69a75 --- /dev/null +++ b/kapi-compat/include/task_pid_nr.h @@ -0,0 +1,12 @@ +#ifndef KAPI_TASK_PID_NR_H +#define KAPI_TASK_PID_NR_H + +#include <linux/types.h> +#include <linux/sched.h> + +static inline pid_t task_pid_nr(struct task_struct *tsk) +{ + return tsk->pid; +} + +#endif -- 1.5.6.5
Sunil Mushran
2009-Nov-10 02:00 UTC
[Ocfs2-devel] [PATCH 04/10] ocfs2: Enable CONFIG_OCFS2_FS_POSIX_ACL
Signed-off-by: Sunil Mushran <sunil.mushran at oracle.com> --- fs/ocfs2/Makefile | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile index e997fe4..efa7f57 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -34,6 +34,8 @@ EXTRA_CFLAGS += -DCONFIG_OCFS2_DEBUG_MASKLOG EXTRA_CFLAGS += -DCONFIG_OCFS2_FS_STATS +EXTRA_CFLAGS += -DCONFIG_OCFS2_FS_POSIX_ACL + ifdef NO_DELAYED_WORK_STRUCT EXTRA_CFLAGS += -DNO_DELAYED_WORK_STRUCT endif -- 1.5.6.5
Sunil Mushran
2009-Nov-10 02:00 UTC
[Ocfs2-devel] [PATCH 05/10] ocfs2: Add helper current_umask()
Mainline commit ce3b0f8d5c2203301fc87f3aaaed73e5819e2a48 adde helper current_umask(). Signed-off-by: Sunil Mushran <sunil.mushran at oracle.com> --- Makefile | 3 ++- configure.in | 5 +++++ kapi-compat/include/current_umask.h | 9 +++++++++ 3 files changed, 16 insertions(+), 1 deletions(-) create mode 100644 kapi-compat/include/current_umask.h diff --git a/Makefile b/Makefile index 98726c9..950d6fc 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,8 @@ LINUX_INCLUDE_FILES KAPI_COMPAT_FILES = \ kapi-compat/include/workqueue.h \ kapi-compat/include/dlmconstants.h \ - kapi-compat/include/task_pid_nr.h + kapi-compat/include/task_pid_nr.h \ + kapi-compat/include/current_umask.h PATCH_FILES diff --git a/configure.in b/configure.in index e94412b..93f9632 100644 --- a/configure.in +++ b/configure.in @@ -175,6 +175,11 @@ OCFS2_CHECK_KERNEL([task_pid_nr() in sched.h], sched.h, , task_pid_nr_compat_header="task_pid_nr.h", [^static inline pid_t task_pid_nr(struct]) KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $task_pid_nr_compat_header" +current_umask_compat_header+OCFS2_CHECK_KERNEL([current_umask() in fs.h], fs.h, + , current_umask_compat_header="current_umask.h", [^extern int current_umask(void)]) +KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $current_umask_compat_header" + # End kapi_compat checks diff --git a/kapi-compat/include/current_umask.h b/kapi-compat/include/current_umask.h new file mode 100644 index 0000000..eee781f --- /dev/null +++ b/kapi-compat/include/current_umask.h @@ -0,0 +1,9 @@ +#ifndef KAPI_CURRENT_UMASK_H +#define KAPI_CURRENT_UMASK_H + +static inline int current_umask(void) +{ + return current->fs->umask; +} + +#endif -- 1.5.6.5
Sunil Mushran
2009-Nov-10 02:00 UTC
[Ocfs2-devel] [PATCH 06/10] ocfs2: Handle missing do_sync_mapping_range()
Mainline commit 5b04aa3a64f854244bc40a6f528176ed50b5c4f6 added do_sync_mapping_range(). EL5 has do_sync_file_range(). This patch wires do_sync_mapping_range() into do_sync_file_range(). Build fails if both symbols are not found. Signed-off-by: Sunil Mushran <sunil.mushran at oracle.com> --- Makefile | 3 ++- configure.in | 13 +++++++++++++ kapi-compat/include/sync_mapping.h | 13 +++++++++++++ 3 files changed, 28 insertions(+), 1 deletions(-) create mode 100644 kapi-compat/include/sync_mapping.h diff --git a/Makefile b/Makefile index 950d6fc..8e58c5d 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,8 @@ KAPI_COMPAT_FILES = \ kapi-compat/include/workqueue.h \ kapi-compat/include/dlmconstants.h \ kapi-compat/include/task_pid_nr.h \ - kapi-compat/include/current_umask.h + kapi-compat/include/current_umask.h \ + kapi-compat/include/sync_mapping.h PATCH_FILES diff --git a/configure.in b/configure.in index 93f9632..658cd6f 100644 --- a/configure.in +++ b/configure.in @@ -180,6 +180,19 @@ OCFS2_CHECK_KERNEL([current_umask() in fs.h], fs.h, , current_umask_compat_header="current_umask.h", [^extern int current_umask(void)]) KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $current_umask_compat_header" +do_sync_mapping_range+OCFS2_CHECK_KERNEL([do_sync_mapping_range() in fs.h], fs.h, +do_sync_mapping_range="yes", , [int do_sync_mapping_range(struct address_space \*mapping]) +if test "x$do_sync_mapping_range" = "x" ; then + do_sync_file_range+ OCFS2_CHECK_KERNEL([ do_sync_file_range() in fs.h], fs.h, + do_sync_file_range="yes", , [int do_sync_file_range(struct file \*file]) + if test "x$do_sync_file_range" = "x" ; then + AC_MSG_ERROR(Cannot build with kernel that is missing both do_sync_mapping_range() and do_sync_file_range()) + fi + KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS sync_mapping.h" +fi + # End kapi_compat checks diff --git a/kapi-compat/include/sync_mapping.h b/kapi-compat/include/sync_mapping.h new file mode 100644 index 0000000..5d77feb --- /dev/null +++ b/kapi-compat/include/sync_mapping.h @@ -0,0 +1,13 @@ +#ifndef KAPI_SYNC_MAPPING_H +#define KAPI_SYNC_MAPPING_H + +#include <linux/fs.h> +static inline int do_sync_mapping_range(struct address_space *mapping, + loff_t offset, loff_t endbyte, + unsigned int flags) +{ + struct file fake = { .f_mapping = mapping, }; + return do_sync_file_range(&fake, offset, endbyte, flags); +} + +#endif -- 1.5.6.5
Sunil Mushran
2009-Nov-10 02:00 UTC
[Ocfs2-devel] [PATCH 07/10] ocfs2: Handle struct f_path in struct file
Mainline commit 0f7fc9e4d03987fe29f6dd4aa67e4c56eb7ecb05 added struct path into struct file. Signed-off-by: Sunil Mushran <sunil.mushran at oracle.com> --- Config.make.in | 1 + Makefile | 3 ++- configure.in | 6 ++++++ fs/ocfs2/Makefile | 4 ++++ fs/ocfs2/aops.c | 4 ++-- fs/ocfs2/dir.c | 2 +- fs/ocfs2/dlm/Makefile | 4 ++++ fs/ocfs2/dlm/dlmfs.c | 4 ++-- fs/ocfs2/file.c | 36 ++++++++++++++++++------------------ fs/ocfs2/ioctl.c | 6 +++--- fs/ocfs2/mmap.c | 8 ++++---- kapi-compat/include/fpath.h | 12 ++++++++++++ 12 files changed, 59 insertions(+), 31 deletions(-) create mode 100644 kapi-compat/include/fpath.h diff --git a/Config.make.in b/Config.make.in index 33b7a89..eb8e2a9 100644 --- a/Config.make.in +++ b/Config.make.in @@ -59,6 +59,7 @@ EXTRA_CFLAGS += @KAPI_COMPAT_CFLAGS@ NO_DELAYED_WORK_STRUCT = @NO_DELAYED_WORK_STRUCT@ NO_DLMCONSTANTS_HEADER = @NO_DLMCONSTANTS_HEADER@ +NO_F_PATH_IN_STRUCT_FILE = @NO_F_PATH_IN_STRUCT_FILE@ OCFS_DEBUG = @OCFS_DEBUG@ diff --git a/Makefile b/Makefile index 8e58c5d..6a28531 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,8 @@ KAPI_COMPAT_FILES = \ kapi-compat/include/dlmconstants.h \ kapi-compat/include/task_pid_nr.h \ kapi-compat/include/current_umask.h \ - kapi-compat/include/sync_mapping.h + kapi-compat/include/sync_mapping.h \ + kapi-compat/include/fpath.h PATCH_FILES diff --git a/configure.in b/configure.in index 658cd6f..e29e6df 100644 --- a/configure.in +++ b/configure.in @@ -193,6 +193,12 @@ if test "x$do_sync_mapping_range" = "x" ; then KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS sync_mapping.h" fi +NO_F_PATH_IN_STRUCT_FILE+OCFS2_CHECK_KERNEL([f_path in fs.h], fs.h, + , NO_F_PATH_IN_STRUCT_FILE=yes, [struct path.*f_path]) +AC_SUBST(NO_F_PATH_IN_STRUCT_FILE) +KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS fpath.h" + # End kapi_compat checks diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile index efa7f57..86dabb1 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -44,6 +44,10 @@ ifdef NO_DLMCONSTANTS_HEADER EXTRA_CFLAGS += -DNO_DLMCONSTANTS_HEADER endif +ifdef NO_F_PATH_IN_STRUCT_FILE +EXTRA_CFLAGS += -DNO_F_PATH_IN_STRUCT_FILE +endif + # # Since SUBDIRS means something to kbuild, define them safely. Do not # include trailing slashes. diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index deb2b13..67a3731 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c @@ -636,7 +636,7 @@ static void ocfs2_dio_end_io(struct kiocb *iocb, ssize_t bytes, void *private) { - struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode; + struct inode *inode = filp_dentry(iocb->ki_filp)->d_inode; int level; /* this io's submitter should not have unlocked this before we could */ @@ -678,7 +678,7 @@ static ssize_t ocfs2_direct_IO(int rw, unsigned long nr_segs) { struct file *file = iocb->ki_filp; - struct inode *inode = file->f_path.dentry->d_inode->i_mapping->host; + struct inode *inode = filp_dentry(file)->d_inode->i_mapping->host; int ret; mlog_entry_void(); diff --git a/fs/ocfs2/dir.c b/fs/ocfs2/dir.c index 28c3ec2..69b3402 100644 --- a/fs/ocfs2/dir.c +++ b/fs/ocfs2/dir.c @@ -2025,7 +2025,7 @@ int ocfs2_dir_foreach(struct inode *inode, loff_t *f_pos, void *priv, int ocfs2_readdir(struct file * filp, void * dirent, filldir_t filldir) { int error = 0; - struct inode *inode = filp->f_path.dentry->d_inode; + struct inode *inode = filp_dentry(filp)->d_inode; int lock_level = 0; mlog_entry("dirino=%llu\n", diff --git a/fs/ocfs2/dlm/Makefile b/fs/ocfs2/dlm/Makefile index 44b6cc6..a42d35d 100644 --- a/fs/ocfs2/dlm/Makefile +++ b/fs/ocfs2/dlm/Makefile @@ -26,6 +26,10 @@ ifdef NO_DELAYED_WORK_STRUCT EXTRA_CFLAGS += -DNO_DELAYED_WORK_STRUCT endif +ifdef NO_F_PATH_IN_STRUCT_FILE +EXTRA_CFLAGS += -DNO_F_PATH_IN_STRUCT_FILE +endif + DLM_SOURCES += \ dlmast.c \ dlmconvert.c \ diff --git a/fs/ocfs2/dlm/dlmfs.c b/fs/ocfs2/dlm/dlmfs.c index 02bf178..8e293fa 100644 --- a/fs/ocfs2/dlm/dlmfs.c +++ b/fs/ocfs2/dlm/dlmfs.c @@ -187,7 +187,7 @@ static ssize_t dlmfs_file_read(struct file *filp, int bytes_left; ssize_t readlen; char *lvb_buf; - struct inode *inode = filp->f_path.dentry->d_inode; + struct inode *inode = filp_dentry(filp)->d_inode; mlog(0, "inode %lu, count = %zu, *ppos = %llu\n", inode->i_ino, count, *ppos); @@ -231,7 +231,7 @@ static ssize_t dlmfs_file_write(struct file *filp, int bytes_left; ssize_t writelen; char *lvb_buf; - struct inode *inode = filp->f_path.dentry->d_inode; + struct inode *inode = filp_dentry(filp)->d_inode; mlog(0, "inode %lu, count = %zu, *ppos = %llu\n", inode->i_ino, count, *ppos); diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index 89fc8ee..68bf44f 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c @@ -105,7 +105,7 @@ static int ocfs2_file_open(struct inode *inode, struct file *file) struct ocfs2_inode_info *oi = OCFS2_I(inode); mlog_entry("(0x%p, 0x%p, '%.*s')\n", inode, file, - file->f_path.dentry->d_name.len, file->f_path.dentry->d_name.name); + filp_dentry(file)->d_name.len, filp_dentry(file)->d_name.name); spin_lock(&oi->ip_lock); @@ -146,8 +146,8 @@ static int ocfs2_file_release(struct inode *inode, struct file *file) struct ocfs2_inode_info *oi = OCFS2_I(inode); mlog_entry("(0x%p, 0x%p, '%.*s')\n", inode, file, - file->f_path.dentry->d_name.len, - file->f_path.dentry->d_name.name); + filp_dentry(file)->d_name.len, + filp_dentry(file)->d_name.name); spin_lock(&oi->ip_lock); if (!--oi->ip_open_count) @@ -1593,7 +1593,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode, } } - if (file && should_remove_suid(file->f_path.dentry)) { + if (file && should_remove_suid(filp_dentry(file))) { ret = __ocfs2_write_remove_suid(inode, di_bh); if (ret) { mlog_errno(ret); @@ -1660,7 +1660,7 @@ out: int ocfs2_change_file_space(struct file *file, unsigned int cmd, struct ocfs2_space_resv *sr) { - struct inode *inode = file->f_path.dentry->d_inode; + struct inode *inode = filp_dentry(file)->d_inode; struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); if ((cmd == OCFS2_IOC_RESVSP || cmd == OCFS2_IOC_RESVSP64) && @@ -1905,13 +1905,13 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb, loff_t old_size, *ppos = &iocb->ki_pos; u32 old_clusters; struct file *file = iocb->ki_filp; - struct inode *inode = file->f_path.dentry->d_inode; + struct inode *inode = filp_dentry(file)->d_inode; struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); mlog_entry("(0x%p, %u, '%.*s')\n", file, (unsigned int)nr_segs, - file->f_path.dentry->d_name.len, - file->f_path.dentry->d_name.name); + filp_dentry(file)->d_name.len, + filp_dentry(file)->d_name.name); if (iocb->ki_left == 0) return 0; @@ -1939,7 +1939,7 @@ relock: } can_do_direct = direct_io; - ret = ocfs2_prepare_inode_for_write(file->f_path.dentry, ppos, + ret = ocfs2_prepare_inode_for_write(filp_dentry(file), ppos, iocb->ki_left, appending, &can_do_direct); if (ret < 0) { @@ -2060,7 +2060,7 @@ static int ocfs2_splice_to_file(struct pipe_inode_info *pipe, { int ret; - ret = ocfs2_prepare_inode_for_write(out->f_path.dentry, &sd->pos, + ret = ocfs2_prepare_inode_for_write(filp_dentry(out), &sd->pos, sd->total_len, 0, NULL); if (ret < 0) { mlog_errno(ret); @@ -2088,8 +2088,8 @@ static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe, mlog_entry("(0x%p, 0x%p, %u, '%.*s')\n", out, pipe, (unsigned int)len, - out->f_path.dentry->d_name.len, - out->f_path.dentry->d_name.name); + filp_dentry(out)->d_name.len, + filp_dentry(out)->d_name.name); if (pipe->inode) mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_PARENT); @@ -2144,12 +2144,12 @@ static ssize_t ocfs2_file_splice_read(struct file *in, unsigned int flags) { int ret = 0, lock_level = 0; - struct inode *inode = in->f_path.dentry->d_inode; + struct inode *inode = filp_dentry(in)->d_inode; mlog_entry("(0x%p, 0x%p, %u, '%.*s')\n", in, pipe, (unsigned int)len, - in->f_path.dentry->d_name.len, - in->f_path.dentry->d_name.name); + filp_dentry(in)->d_name.len, + filp_dentry(in)->d_name.name); /* * See the comment in ocfs2_file_aio_read() @@ -2175,12 +2175,12 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb, { int ret = 0, rw_level = -1, have_alloc_sem = 0, lock_level = 0; struct file *filp = iocb->ki_filp; - struct inode *inode = filp->f_path.dentry->d_inode; + struct inode *inode = filp_dentry(filp)->d_inode; mlog_entry("(0x%p, %u, '%.*s')\n", filp, (unsigned int)nr_segs, - filp->f_path.dentry->d_name.len, - filp->f_path.dentry->d_name.name); + filp_dentry(filp)->d_name.len, + filp_dentry(filp)->d_name.name); if (!inode) { ret = -EINVAL; diff --git a/fs/ocfs2/ioctl.c b/fs/ocfs2/ioctl.c index 31fbb06..857b409 100644 --- a/fs/ocfs2/ioctl.c +++ b/fs/ocfs2/ioctl.c @@ -110,7 +110,7 @@ bail: long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { - struct inode *inode = filp->f_path.dentry->d_inode; + struct inode *inode = filp_dentry(filp)->d_inode; unsigned int flags; int new_clusters; int status; @@ -132,12 +132,12 @@ long ocfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) if (get_user(flags, (int __user *) arg)) return -EFAULT; - status = mnt_want_write(filp->f_path.mnt); + status = mnt_want_write(filp_mnt(filp)); if (status) return status; status = ocfs2_set_inode_attr(inode, flags, OCFS2_FL_MODIFIABLE); - mnt_drop_write(filp->f_path.mnt); + mnt_drop_write(filp_mnt(filp)); return status; case OCFS2_IOC_RESVSP: case OCFS2_IOC_RESVSP64: diff --git a/fs/ocfs2/mmap.c b/fs/ocfs2/mmap.c index 3973761..55afd11 100644 --- a/fs/ocfs2/mmap.c +++ b/fs/ocfs2/mmap.c @@ -157,7 +157,7 @@ out: static int ocfs2_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) { struct page *page = vmf->page; - struct inode *inode = vma->vm_file->f_path.dentry->d_inode; + struct inode *inode = filp_dentry(vma->vm_file)->d_inode; struct buffer_head *di_bh = NULL; sigset_t blocked, oldset; int ret, ret2; @@ -211,13 +211,13 @@ int ocfs2_mmap(struct file *file, struct vm_area_struct *vma) { int ret = 0, lock_level = 0; - ret = ocfs2_inode_lock_atime(file->f_dentry->d_inode, - file->f_vfsmnt, &lock_level); + ret = ocfs2_inode_lock_atime(filp_dentry(file)->d_inode, + filp_mnt(file), &lock_level); if (ret < 0) { mlog_errno(ret); goto out; } - ocfs2_inode_unlock(file->f_dentry->d_inode, lock_level); + ocfs2_inode_unlock(filp_dentry(file)->d_inode, lock_level); out: vma->vm_ops = &ocfs2_file_vm_ops; vma->vm_flags |= VM_CAN_NONLINEAR; diff --git a/kapi-compat/include/fpath.h b/kapi-compat/include/fpath.h new file mode 100644 index 0000000..f8b53f2 --- /dev/null +++ b/kapi-compat/include/fpath.h @@ -0,0 +1,12 @@ +#ifndef KAPI_FPATH_H +#define KAPI_FPATH_H + +#ifdef NO_F_PATH_IN_STRUCT_FILE +# define filp_dentry(i) (i)->f_dentry +# define filp_mnt(i) (i)->f_vfsmnt +#else +# define filp_dentry(i) (i)->f_path.dentry +# define filp_mnt(i) (i)->f_path.mnt +#endif + +#endif -- 1.5.6.5
Sunil Mushran
2009-Nov-10 02:00 UTC
[Ocfs2-devel] [PATCH 08/10] ocfs2: Handle struct address_space_operations_ext
Around in 2.6.24 or so, two new aops, write_begin() and write_end(), were added. In that release, OCFS2 was updated to make use of these aops instead of the older prepare_write() and commit_write(). EL5 U4 backports the new aops in a new struct address_space_operations_ext. This patch looks for the new struct failing which looks for the new aops in the older struct. If both lookups fail, the build errors out. Signed-off-by: Sunil Mushran <sunil.mushran at oracle.com> --- Config.make.in | 1 + configure.in | 13 +++++++++++++ fs/ocfs2/Makefile | 4 ++++ fs/ocfs2/aops.c | 16 ++++++++++++++++ fs/ocfs2/inode.c | 5 +++++ fs/ocfs2/inode.h | 4 ++++ fs/ocfs2/super.c | 4 ++++ 7 files changed, 47 insertions(+), 0 deletions(-) diff --git a/Config.make.in b/Config.make.in index eb8e2a9..aead755 100644 --- a/Config.make.in +++ b/Config.make.in @@ -60,6 +60,7 @@ EXTRA_CFLAGS += @KAPI_COMPAT_CFLAGS@ NO_DELAYED_WORK_STRUCT = @NO_DELAYED_WORK_STRUCT@ NO_DLMCONSTANTS_HEADER = @NO_DLMCONSTANTS_HEADER@ NO_F_PATH_IN_STRUCT_FILE = @NO_F_PATH_IN_STRUCT_FILE@ +ADDRESS_SPACE_OPS_EXT = @ADDRESS_SPACE_OPS_EXT@ OCFS_DEBUG = @OCFS_DEBUG@ diff --git a/configure.in b/configure.in index e29e6df..8179f59 100644 --- a/configure.in +++ b/configure.in @@ -199,6 +199,19 @@ OCFS2_CHECK_KERNEL([f_path in fs.h], fs.h, AC_SUBST(NO_F_PATH_IN_STRUCT_FILE) KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS fpath.h" +ADDRESS_SPACE_OPS_EXT+OCFS2_CHECK_KERNEL([ struct address_space_operations_ext in fs.h], fs.h, + ADDRESS_SPACE_OPS_EXT=yes, , [^struct address_space_operations_ext {]) +AC_SUBST(ADDRESS_SPACE_OPS_EXT) +if test "x$ADDRESS_SPACE_OPS_EXT" = "x" ; then + has_write_begin+ OCFS2_CHECK_KERNEL([ write_begin() in fs.h], fs.h, + has_write_begin=yes, , [int (\*write_begin)(struct file \*]) + if test "x$has_write_begin" = "x" ; then + AC_MSG_ERROR(Cannot build with kernel that does not have aops->write_begin()) + fi +fi + # End kapi_compat checks diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile index 86dabb1..817f9d2 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -48,6 +48,10 @@ ifdef NO_F_PATH_IN_STRUCT_FILE EXTRA_CFLAGS += -DNO_F_PATH_IN_STRUCT_FILE endif +ifdef ADDRESS_SPACE_OPS_EXT +EXTRA_CFLAGS += -DADDRESS_SPACE_OPS_EXT +endif + # # Since SUBDIRS means something to kbuild, define them safely. Do not # include trailing slashes. diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 67a3731..99ae9f0 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c @@ -2009,6 +2009,7 @@ static int ocfs2_write_end(struct file *file, struct address_space *mapping, return ret; } +#ifndef ADDRESS_SPACE_OPS_EXT const struct address_space_operations ocfs2_aops = { .readpage = ocfs2_readpage, .readpages = ocfs2_readpages, @@ -2024,3 +2025,18 @@ const struct address_space_operations ocfs2_aops = { .is_partially_uptodate = block_is_partially_uptodate, .error_remove_page = generic_error_remove_page, }; +#else +const struct address_space_operations_ext ocfs2_aops_ext = { + .orig_aops.readpage = ocfs2_readpage, + .orig_aops.readpages = ocfs2_readpages, + .orig_aops.writepage = ocfs2_writepage, + .write_begin = ocfs2_write_begin, + .write_end = ocfs2_write_end, + .orig_aops.bmap = ocfs2_bmap, + .orig_aops.sync_page = block_sync_page, + .orig_aops.direct_IO = ocfs2_direct_IO, + .orig_aops.invalidatepage = ocfs2_invalidatepage, + .orig_aops.releasepage = ocfs2_releasepage, + .orig_aops.migratepage = buffer_migrate_page, +}; +#endif diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c index 0297fb8..d38dcdd 100644 --- a/fs/ocfs2/inode.c +++ b/fs/ocfs2/inode.c @@ -285,7 +285,12 @@ void ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe, inode->i_blocks = 0; else inode->i_blocks = ocfs2_inode_sector_count(inode); +#ifndef ADDRESS_SPACE_OPS_EXT inode->i_mapping->a_ops = &ocfs2_aops; +#else + inode->i_mapping->a_ops + (struct address_space_operations *)&ocfs2_aops_ext; +#endif 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); diff --git a/fs/ocfs2/inode.h b/fs/ocfs2/inode.h index ba4fe07..c7db724 100644 --- a/fs/ocfs2/inode.h +++ b/fs/ocfs2/inode.h @@ -111,7 +111,11 @@ static inline struct ocfs2_inode_info *OCFS2_I(struct inode *inode) extern struct kmem_cache *ocfs2_inode_cache; +#ifndef ADDRESS_SPACE_OPS_EXT extern const struct address_space_operations ocfs2_aops; +#else +extern const struct address_space_operations_ext ocfs2_aops_ext; +#endif extern const struct ocfs2_caching_operations ocfs2_inode_caching_ops; static inline struct ocfs2_caching_info *INODE_CACHE(struct inode *inode) diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index 5f19ff5..8c8b206 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c @@ -1044,6 +1044,10 @@ static int ocfs2_fill_super(struct super_block *sb, void *data, int silent) sb->s_flags = (sb->s_flags & ~MS_POSIXACL) | ((osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL) ? MS_POSIXACL : 0); +#ifdef ADDRESS_SPACE_OPS_EXT + sb->s_flags |= MS_HAS_NEW_AOPS; +#endif + /* Hard readonly mode only if: bdev_read_only, MS_RDONLY, * heartbeat=none */ if (bdev_read_only(sb->s_bdev)) { -- 1.5.6.5
Sunil Mushran
2009-Nov-10 02:00 UTC
[Ocfs2-devel] [PATCH 09/10] ocfs2: Handle missing USHORT_MAX
Mainline commit 44f564a4bf6ac70f2a84806203045cf515bc9367 USHORT_MAX. Signed-off-by: Sunil Mushran <sunil.mushran at oracle.com> --- Makefile | 3 ++- configure.in | 5 +++++ kapi-compat/include/ushortmax.h | 6 ++++++ 3 files changed, 13 insertions(+), 1 deletions(-) create mode 100644 kapi-compat/include/ushortmax.h diff --git a/Makefile b/Makefile index 6a28531..6e28427 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,8 @@ KAPI_COMPAT_FILES = \ kapi-compat/include/task_pid_nr.h \ kapi-compat/include/current_umask.h \ kapi-compat/include/sync_mapping.h \ - kapi-compat/include/fpath.h + kapi-compat/include/fpath.h \ + kapi-compat/include/ushortmax.h PATCH_FILES diff --git a/configure.in b/configure.in index 8179f59..4d9bea3 100644 --- a/configure.in +++ b/configure.in @@ -212,6 +212,11 @@ if test "x$ADDRESS_SPACE_OPS_EXT" = "x" ; then fi fi +ushort_max_compat_header+OCFS2_CHECK_KERNEL([USHORT_MAX in kernel.h], kernel.h, + , ushort_max_compat_header="ushortmax.h", [#define USHORT_MAX]) +KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $ushort_max_compat_header" + # End kapi_compat checks diff --git a/kapi-compat/include/ushortmax.h b/kapi-compat/include/ushortmax.h new file mode 100644 index 0000000..a12633a --- /dev/null +++ b/kapi-compat/include/ushortmax.h @@ -0,0 +1,6 @@ +#ifndef KAPI_USHORTMAX_H +#define KAPI_USHORTMAX_H + +#define USHORT_MAX ((u16)(~0U)) + +#endif -- 1.5.6.5
Sunil Mushran
2009-Nov-10 02:00 UTC
[Ocfs2-devel] [PATCH 10/10] ocfs2: Handle different f_version types
Mainline commit 2b47c3611de05c585e2d81204f6c7e3e255a3461 changed type of file->f_version from unsigned long to u64. This patch allows building with kernels having either definition. Build fails if the type is something else. Signed-off-by: Sunil Mushran <sunil.mushran at oracle.com> --- Config.make.in | 1 + Makefile | 3 ++- configure.in | 14 ++++++++++++++ fs/ocfs2/Makefile | 4 ++++ fs/ocfs2/dir.c | 12 ++++++------ kapi-compat/include/fversion.h | 10 ++++++++++ 6 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 kapi-compat/include/fversion.h diff --git a/Config.make.in b/Config.make.in index aead755..ba72950 100644 --- a/Config.make.in +++ b/Config.make.in @@ -61,6 +61,7 @@ NO_DELAYED_WORK_STRUCT = @NO_DELAYED_WORK_STRUCT@ NO_DLMCONSTANTS_HEADER = @NO_DLMCONSTANTS_HEADER@ NO_F_PATH_IN_STRUCT_FILE = @NO_F_PATH_IN_STRUCT_FILE@ ADDRESS_SPACE_OPS_EXT = @ADDRESS_SPACE_OPS_EXT@ +FVERSION_IS_ULONG = @FVERSION_IS_ULONG@ OCFS_DEBUG = @OCFS_DEBUG@ diff --git a/Makefile b/Makefile index 6e28427..06ddabf 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,8 @@ KAPI_COMPAT_FILES = \ kapi-compat/include/current_umask.h \ kapi-compat/include/sync_mapping.h \ kapi-compat/include/fpath.h \ - kapi-compat/include/ushortmax.h + kapi-compat/include/ushortmax.h \ + kapi-compat/include/fversion.h PATCH_FILES diff --git a/configure.in b/configure.in index 4d9bea3..7ee2d34 100644 --- a/configure.in +++ b/configure.in @@ -217,6 +217,20 @@ OCFS2_CHECK_KERNEL([USHORT_MAX in kernel.h], kernel.h, , ushort_max_compat_header="ushortmax.h", [#define USHORT_MAX]) KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $ushort_max_compat_header" +FVERSION_IS_ULONG+OCFS2_CHECK_KERNEL([ f_version is type unsigned long in fs.h], fs.h, + FVERSION_IS_ULONG=yes, , [unsigned long.*f_version;]) +AC_SUBST(FVERSION_IS_ULONG) +if test "x$FVERSION_IS_ULONG" = "x" ; then + fversion_is_u64+ OCFS2_CHECK_KERNEL([ f_version is type u64 in fs.h], fs.h, + fversion_is_u64=yes, , [u64.*f_version;]) + if test "x$fversion_is_u64" = "x" ; then + AC_MSG_ERROR(Cannot build with kernel in which f_version type is neither unsigned long nor u64) + fi +fi +KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS fversion.h" + # End kapi_compat checks diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile index 817f9d2..e6b5801 100644 --- a/fs/ocfs2/Makefile +++ b/fs/ocfs2/Makefile @@ -52,6 +52,10 @@ ifdef ADDRESS_SPACE_OPS_EXT EXTRA_CFLAGS += -DADDRESS_SPACE_OPS_EXT endif +ifdef FVERSION_IS_ULONG +EXTRA_CFLAGS += -DFVERSION_IS_ULONG +endif + # # Since SUBDIRS means something to kbuild, define them safely. Do not # include trailing slashes. diff --git a/fs/ocfs2/dir.c b/fs/ocfs2/dir.c index 69b3402..b8991ac 100644 --- a/fs/ocfs2/dir.c +++ b/fs/ocfs2/dir.c @@ -1771,7 +1771,7 @@ bail: } static int ocfs2_dir_foreach_blk_id(struct inode *inode, - u64 *f_version, + f_version_t *f_version, loff_t *f_pos, void *priv, filldir_t filldir, int *filldir_err) { @@ -1832,7 +1832,7 @@ revalidate: * not the directory has been modified * during the copy operation. */ - u64 version = *f_version; + f_version_t version = *f_version; unsigned char d_type = DT_UNKNOWN; if (de->file_type < OCFS2_FT_MAX) @@ -1865,7 +1865,7 @@ out: * and indexed ones. */ static int ocfs2_dir_foreach_blk_el(struct inode *inode, - u64 *f_version, + f_version_t *f_version, loff_t *f_pos, void *priv, filldir_t filldir, int *filldir_err) { @@ -1952,7 +1952,7 @@ revalidate: * not the directory has been modified * during the copy operation. */ - unsigned long version = *f_version; + f_version_t version = *f_version; unsigned char d_type = DT_UNKNOWN; if (de->file_type < OCFS2_FT_MAX) @@ -1983,7 +1983,7 @@ out: return stored; } -static int ocfs2_dir_foreach_blk(struct inode *inode, u64 *f_version, +static int ocfs2_dir_foreach_blk(struct inode *inode, f_version_t *f_version, loff_t *f_pos, void *priv, filldir_t filldir, int *filldir_err) { @@ -2003,7 +2003,7 @@ int ocfs2_dir_foreach(struct inode *inode, loff_t *f_pos, void *priv, filldir_t filldir) { int ret = 0, filldir_err = 0; - u64 version = inode->i_version; + f_version_t version = inode->i_version; while (*f_pos < i_size_read(inode)) { ret = ocfs2_dir_foreach_blk(inode, &version, f_pos, priv, diff --git a/kapi-compat/include/fversion.h b/kapi-compat/include/fversion.h new file mode 100644 index 0000000..4977591 --- /dev/null +++ b/kapi-compat/include/fversion.h @@ -0,0 +1,10 @@ +#ifndef KAPI_FVERSION_H +#define KAPI_FVERSION_H + +#ifdef FVERSION_IS_ULONG +typedef unsigned long f_version_t; +#else +typedef u64 f_version_t; +#endif + +#endif -- 1.5.6.5