Whamcloud - gitweb
79429d74f712ee9a132ff5393dbd833f753768e4
[fs/lustre-release.git] / lustre / llite / lcommon_cl.c
1 /*
2  * GPL HEADER START
3  *
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 only,
8  * as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License version 2 for more details (a copy is included
14  * in the LICENSE file that accompanied this code).
15  *
16  * You should have received a copy of the GNU General Public License
17  * version 2 along with this program; If not, see
18  * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
19  *
20  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
21  * CA 95054 USA or visit www.sun.com if you need additional information or
22  * have any questions.
23  *
24  * GPL HEADER END
25  */
26 /*
27  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
28  * Use is subject to license terms.
29  *
30  * Copyright (c) 2011, 2014, Intel Corporation.
31  */
32 /*
33  * This file is part of Lustre, http://www.lustre.org/
34  * Lustre is a trademark of Sun Microsystems, Inc.
35  *
36  * cl code shared between vvp and liblustre (and other Lustre clients in the
37  * future).
38  *
39  *   Author: Nikita Danilov <nikita.danilov@sun.com>
40  */
41
42 #define DEBUG_SUBSYSTEM S_LLITE
43
44 #include <libcfs/libcfs.h>
45 #include <linux/fs.h>
46 #include <linux/sched.h>
47 #include <linux/mm.h>
48 #include <linux/quotaops.h>
49 #include <linux/highmem.h>
50 #include <linux/pagemap.h>
51 #include <linux/rbtree.h>
52
53 #include <obd.h>
54 #include <obd_support.h>
55 #include <lustre_fid.h>
56 #include <lustre_dlm.h>
57 #include <lustre_ver.h>
58 #include <lustre_mdc.h>
59 #include <cl_object.h>
60
61 #include "llite_internal.h"
62
63 static const struct cl_req_operations ccc_req_ops;
64
65 /*
66  * ccc_ prefix stands for "Common Client Code".
67  */
68
69 static struct kmem_cache *ccc_thread_kmem;
70 static struct kmem_cache *ccc_req_kmem;
71
72 static struct lu_kmem_descr ccc_caches[] = {
73         {
74                 .ckd_cache = &ccc_thread_kmem,
75                 .ckd_name  = "ccc_thread_kmem",
76                 .ckd_size  = sizeof (struct ccc_thread_info),
77         },
78         {
79                 .ckd_cache = &ccc_req_kmem,
80                 .ckd_name  = "ccc_req_kmem",
81                 .ckd_size  = sizeof (struct ccc_req)
82         },
83         {
84                 .ckd_cache = NULL
85         }
86 };
87
88 /*****************************************************************************
89  *
90  * Vvp device and device type functions.
91  *
92  */
93
94 void *ccc_key_init(const struct lu_context *ctx, struct lu_context_key *key)
95 {
96         struct ccc_thread_info *info;
97
98         OBD_SLAB_ALLOC_PTR_GFP(info, ccc_thread_kmem, GFP_NOFS);
99         if (info == NULL)
100                 info = ERR_PTR(-ENOMEM);
101         return info;
102 }
103
104 void ccc_key_fini(const struct lu_context *ctx,
105                          struct lu_context_key *key, void *data)
106 {
107         struct ccc_thread_info *info = data;
108         OBD_SLAB_FREE_PTR(info, ccc_thread_kmem);
109 }
110
111 struct lu_context_key ccc_key = {
112         .lct_tags = LCT_CL_THREAD,
113         .lct_init = ccc_key_init,
114         .lct_fini = ccc_key_fini
115 };
116
117 int ccc_req_init(const struct lu_env *env, struct cl_device *dev,
118                  struct cl_req *req)
119 {
120         struct ccc_req *vrq;
121         int result;
122
123         OBD_SLAB_ALLOC_PTR_GFP(vrq, ccc_req_kmem, GFP_NOFS);
124         if (vrq != NULL) {
125                 cl_req_slice_add(req, &vrq->crq_cl, dev, &ccc_req_ops);
126                 result = 0;
127         } else
128                 result = -ENOMEM;
129         return result;
130 }
131
132 /**
133  * An `emergency' environment used by ccc_inode_fini() when cl_env_get()
134  * fails. Access to this environment is serialized by ccc_inode_fini_guard
135  * mutex.
136  */
137 static struct lu_env *ccc_inode_fini_env = NULL;
138
139 /**
140  * A mutex serializing calls to slp_inode_fini() under extreme memory
141  * pressure, when environments cannot be allocated.
142  */
143 static DEFINE_MUTEX(ccc_inode_fini_guard);
144 static int dummy_refcheck;
145
146 int ccc_global_init(struct lu_device_type *device_type)
147 {
148         int result;
149
150         result = lu_kmem_init(ccc_caches);
151         if (result)
152                 return result;
153
154         result = lu_device_type_init(device_type);
155         if (result)
156                 goto out_kmem;
157
158         ccc_inode_fini_env = cl_env_alloc(&dummy_refcheck,
159                                           LCT_REMEMBER|LCT_NOREF);
160         if (IS_ERR(ccc_inode_fini_env)) {
161                 result = PTR_ERR(ccc_inode_fini_env);
162                 goto out_device;
163         }
164
165         ccc_inode_fini_env->le_ctx.lc_cookie = 0x4;
166         return 0;
167 out_device:
168         lu_device_type_fini(device_type);
169 out_kmem:
170         lu_kmem_fini(ccc_caches);
171         return result;
172 }
173
174 void ccc_global_fini(struct lu_device_type *device_type)
175 {
176         if (ccc_inode_fini_env != NULL) {
177                 cl_env_put(ccc_inode_fini_env, &dummy_refcheck);
178                 ccc_inode_fini_env = NULL;
179         }
180         lu_device_type_fini(device_type);
181         lu_kmem_fini(ccc_caches);
182 }
183
184 /*****************************************************************************
185  *
186  * Transfer operations.
187  *
188  */
189
190 void ccc_req_completion(const struct lu_env *env,
191                         const struct cl_req_slice *slice, int ioret)
192 {
193         struct ccc_req *vrq;
194
195         if (ioret > 0)
196                 cl_stats_tally(slice->crs_dev, slice->crs_req->crq_type, ioret);
197
198         vrq = cl2ccc_req(slice);
199         OBD_SLAB_FREE_PTR(vrq, ccc_req_kmem);
200 }
201
202 /**
203  * Implementation of struct cl_req_operations::cro_attr_set() for ccc
204  * layer. ccc is responsible for
205  *
206  *    - o_[mac]time
207  *
208  *    - o_mode
209  *
210  *    - o_parent_seq
211  *
212  *    - o_[ug]id
213  *
214  *    - o_parent_oid
215  *
216  *    - o_parent_ver
217  *
218  *    - o_ioepoch,
219  *
220  *  and capability.
221  */
222 void ccc_req_attr_set(const struct lu_env *env,
223                       const struct cl_req_slice *slice,
224                       const struct cl_object *obj,
225                       struct cl_req_attr *attr, u64 flags)
226 {
227         struct inode    *inode;
228         struct obdo     *oa;
229         u32              valid_flags;
230
231         oa = attr->cra_oa;
232         inode = vvp_object_inode(obj);
233         valid_flags = OBD_MD_FLTYPE;
234
235         if ((flags & OBD_MD_FLOSSCAPA) != 0) {
236                 LASSERT(attr->cra_capa == NULL);
237                 attr->cra_capa = cl_capa_lookup(inode,
238                                                 slice->crs_req->crq_type);
239         }
240
241         if (slice->crs_req->crq_type == CRT_WRITE) {
242                 if (flags & OBD_MD_FLEPOCH) {
243                         oa->o_valid |= OBD_MD_FLEPOCH;
244                         oa->o_ioepoch = ll_i2info(inode)->lli_ioepoch;
245                         valid_flags |= OBD_MD_FLMTIME | OBD_MD_FLCTIME |
246                                        OBD_MD_FLUID | OBD_MD_FLGID;
247                 }
248         }
249         obdo_from_inode(oa, inode, valid_flags & flags);
250         obdo_set_parent_fid(oa, &ll_i2info(inode)->lli_fid);
251         if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_INVALID_PFID))
252                 oa->o_parent_oid++;
253         memcpy(attr->cra_jobid, ll_i2info(inode)->lli_jobid,
254                LUSTRE_JOBID_SIZE);
255 }
256
257 static const struct cl_req_operations ccc_req_ops = {
258         .cro_attr_set   = ccc_req_attr_set,
259         .cro_completion = ccc_req_completion
260 };
261
262 int cl_setattr_ost(struct inode *inode, const struct iattr *attr,
263                    struct obd_capa *capa)
264 {
265         struct lu_env *env;
266         struct cl_io  *io;
267         int            result;
268         int            refcheck;
269
270         ENTRY;
271
272         env = cl_env_get(&refcheck);
273         if (IS_ERR(env))
274                 RETURN(PTR_ERR(env));
275
276         io = ccc_env_thread_io(env);
277         io->ci_obj = ll_i2info(inode)->lli_clob;
278
279         io->u.ci_setattr.sa_attr.lvb_atime = LTIME_S(attr->ia_atime);
280         io->u.ci_setattr.sa_attr.lvb_mtime = LTIME_S(attr->ia_mtime);
281         io->u.ci_setattr.sa_attr.lvb_ctime = LTIME_S(attr->ia_ctime);
282         io->u.ci_setattr.sa_attr.lvb_size = attr->ia_size;
283         io->u.ci_setattr.sa_valid = attr->ia_valid;
284         io->u.ci_setattr.sa_parent_fid = ll_inode2fid(inode);
285         io->u.ci_setattr.sa_capa = capa;
286
287 again:
288         if (cl_io_init(env, io, CIT_SETATTR, io->ci_obj) == 0) {
289                 struct vvp_io *vio = vvp_env_io(env);
290
291                 if (attr->ia_valid & ATTR_FILE)
292                         /* populate the file descriptor for ftruncate to honor
293                          * group lock - see LU-787 */
294                         vio->vui_fd = LUSTRE_FPRIVATE(attr->ia_file);
295
296                 result = cl_io_loop(env, io);
297         } else {
298                 result = io->ci_result;
299         }
300         cl_io_fini(env, io);
301         if (unlikely(io->ci_need_restart))
302                 goto again;
303         /* HSM import case: file is released, cannot be restored
304          * no need to fail except if restore registration failed
305          * with -ENODATA */
306         if (result == -ENODATA && io->ci_restore_needed &&
307             io->ci_result != -ENODATA)
308                 result = 0;
309         cl_env_put(env, &refcheck);
310         RETURN(result);
311 }
312
313 /*****************************************************************************
314  *
315  * Type conversions.
316  *
317  */
318
319 struct ccc_req *cl2ccc_req(const struct cl_req_slice *slice)
320 {
321         return container_of0(slice, struct ccc_req, crq_cl);
322 }
323
324 /**
325  * Initialize or update CLIO structures for regular files when new
326  * meta-data arrives from the server.
327  *
328  * \param inode regular file inode
329  * \param md    new file metadata from MDS
330  * - allocates cl_object if necessary,
331  * - updated layout, if object was already here.
332  */
333 int cl_file_inode_init(struct inode *inode, struct lustre_md *md)
334 {
335         struct lu_env        *env;
336         struct ll_inode_info *lli;
337         struct cl_object     *clob;
338         struct lu_site       *site;
339         struct lu_fid        *fid;
340         struct cl_object_conf conf = {
341                 .coc_inode = inode,
342                 .u = {
343                         .coc_md    = md
344                 }
345         };
346         int result = 0;
347         int refcheck;
348
349         LASSERT(md->body->mbo_valid & OBD_MD_FLID);
350         LASSERT(S_ISREG(inode->i_mode));
351
352         env = cl_env_get(&refcheck);
353         if (IS_ERR(env))
354                 return PTR_ERR(env);
355
356         site = ll_i2sbi(inode)->ll_site;
357         lli  = ll_i2info(inode);
358         fid  = &lli->lli_fid;
359         LASSERT(fid_is_sane(fid));
360
361         if (lli->lli_clob == NULL) {
362                 /* clob is slave of inode, empty lli_clob means for new inode,
363                  * there is no clob in cache with the given fid, so it is
364                  * unnecessary to perform lookup-alloc-lookup-insert, just
365                  * alloc and insert directly. */
366                 LASSERT(inode->i_state & I_NEW);
367                 conf.coc_lu.loc_flags = LOC_F_NEW;
368                 clob = cl_object_find(env, lu2cl_dev(site->ls_top_dev),
369                                       fid, &conf);
370                 if (!IS_ERR(clob)) {
371                         /*
372                          * No locking is necessary, as new inode is
373                          * locked by I_NEW bit.
374                          */
375                         lli->lli_clob = clob;
376                         lli->lli_has_smd = lsm_has_objects(md->lsm);
377                         lu_object_ref_add(&clob->co_lu, "inode", inode);
378                 } else
379                         result = PTR_ERR(clob);
380         } else {
381                 result = cl_conf_set(env, lli->lli_clob, &conf);
382         }
383
384         cl_env_put(env, &refcheck);
385
386         if (result != 0)
387                 CERROR("Failure to initialize cl object "DFID": %d\n",
388                        PFID(fid), result);
389         return result;
390 }
391
392 /**
393  * Wait for others drop their references of the object at first, then we drop
394  * the last one, which will lead to the object be destroyed immediately.
395  * Must be called after cl_object_kill() against this object.
396  *
397  * The reason we want to do this is: destroying top object will wait for sub
398  * objects being destroyed first, so we can't let bottom layer (e.g. from ASTs)
399  * to initiate top object destroying which may deadlock. See bz22520.
400  */
401 static void cl_object_put_last(struct lu_env *env, struct cl_object *obj)
402 {
403         struct lu_object_header *header = obj->co_lu.lo_header;
404         wait_queue_t           waiter;
405
406         if (unlikely(atomic_read(&header->loh_ref) != 1)) {
407                 struct lu_site *site = obj->co_lu.lo_dev->ld_site;
408                 struct lu_site_bkt_data *bkt;
409
410                 bkt = lu_site_bkt_from_fid(site, &header->loh_fid);
411
412                 init_waitqueue_entry_current(&waiter);
413                 add_wait_queue(&bkt->lsb_marche_funebre, &waiter);
414
415                 while (1) {
416                         set_current_state(TASK_UNINTERRUPTIBLE);
417                         if (atomic_read(&header->loh_ref) == 1)
418                                 break;
419                         waitq_wait(&waiter, TASK_UNINTERRUPTIBLE);
420                 }
421
422                 set_current_state(TASK_RUNNING);
423                 remove_wait_queue(&bkt->lsb_marche_funebre, &waiter);
424         }
425
426         cl_object_put(env, obj);
427 }
428
429 void cl_inode_fini(struct inode *inode)
430 {
431         struct lu_env           *env;
432         struct ll_inode_info    *lli  = ll_i2info(inode);
433         struct cl_object        *clob = lli->lli_clob;
434         int refcheck;
435         int emergency;
436
437         if (clob != NULL) {
438                 void                    *cookie;
439
440                 cookie = cl_env_reenter();
441                 env = cl_env_get(&refcheck);
442                 emergency = IS_ERR(env);
443                 if (emergency) {
444                         mutex_lock(&ccc_inode_fini_guard);
445                         LASSERT(ccc_inode_fini_env != NULL);
446                         cl_env_implant(ccc_inode_fini_env, &refcheck);
447                         env = ccc_inode_fini_env;
448                 }
449                 /*
450                  * cl_object cache is a slave to inode cache (which, in turn
451                  * is a slave to dentry cache), don't keep cl_object in memory
452                  * when its master is evicted.
453                  */
454                 cl_object_kill(env, clob);
455                 lu_object_ref_del(&clob->co_lu, "inode", inode);
456                 cl_object_put_last(env, clob);
457                 lli->lli_clob = NULL;
458                 if (emergency) {
459                         cl_env_unplant(ccc_inode_fini_env, &refcheck);
460                         mutex_unlock(&ccc_inode_fini_guard);
461                 } else
462                         cl_env_put(env, &refcheck);
463                 cl_env_reexit(cookie);
464         }
465 }
466
467 /**
468  * return IF_* type for given lu_dirent entry.
469  * IF_* flag shld be converted to particular OS file type in
470  * platform llite module.
471  */
472 __u16 ll_dirent_type_get(struct lu_dirent *ent)
473 {
474         __u16 type = 0;
475         struct luda_type *lt;
476         int len = 0;
477
478         if (le32_to_cpu(ent->lde_attrs) & LUDA_TYPE) {
479                 const unsigned align = sizeof(struct luda_type) - 1;
480
481                 len = le16_to_cpu(ent->lde_namelen);
482                 len = (len + align) & ~align;
483                 lt = (void *)ent->lde_name + len;
484                 type = IFTODT(le16_to_cpu(lt->lt_type));
485         }
486         return type;
487 }
488
489 /**
490  * build inode number from passed @fid */
491 __u64 cl_fid_build_ino(const struct lu_fid *fid, int api32)
492 {
493         if (BITS_PER_LONG == 32 || api32)
494                 RETURN(fid_flatten32(fid));
495         else
496                 RETURN(fid_flatten(fid));
497 }
498
499 /**
500  * build inode generation from passed @fid.  If our FID overflows the 32-bit
501  * inode number then return a non-zero generation to distinguish them. */
502 __u32 cl_fid_build_gen(const struct lu_fid *fid)
503 {
504         __u32 gen;
505         ENTRY;
506
507         if (fid_is_igif(fid)) {
508                 gen = lu_igif_gen(fid);
509                 RETURN(gen);
510         }
511
512         gen = (fid_flatten(fid) >> 32);
513         RETURN(gen);
514 }
515
516 /* lsm is unreliable after hsm implementation as layout can be changed at
517  * any time. This is only to support old, non-clio-ized interfaces. It will
518  * cause deadlock if clio operations are called with this extra layout refcount
519  * because in case the layout changed during the IO, ll_layout_refresh() will
520  * have to wait for the refcount to become zero to destroy the older layout.
521  *
522  * Notice that the lsm returned by this function may not be valid unless called
523  * inside layout lock - MDS_INODELOCK_LAYOUT. */
524 struct lov_stripe_md *ccc_inode_lsm_get(struct inode *inode)
525 {
526         return lov_lsm_get(ll_i2info(inode)->lli_clob);
527 }
528
529 void inline ccc_inode_lsm_put(struct inode *inode, struct lov_stripe_md *lsm)
530 {
531         lov_lsm_put(ll_i2info(inode)->lli_clob, lsm);
532 }